为啥 WebXR 中的光线投射方向计算不正确?

Posted

技术标签:

【中文标题】为啥 WebXR 中的光线投射方向计算不正确?【英文标题】:Why is raycast direction calculated incorrectly in WebXR?为什么 WebXR 中的光线投射方向计算不正确? 【发布时间】:2018-08-07 04:06:00 【问题描述】:

我正在尝试在基于网络的增强现实应用程序中使用 常规 Three.js 光线投射(与 AR 命中测试相反,这个问题与真实飞机上的命中测试无关) .

该网络应用使用 A-Frame 和 aframe-xr component 在 ios 的 WebXR Viewer 和 android 的 WebARCore 中获得 WebXR 支持,并且增强现实在这两个实验性浏览器中通常运行良好。

但是,aframe-xr 或 three.xr.js 和 WebXR polyfill 库中的某些内容会导致在支持 WebXR 的实验性浏览器中对光线投射的 direction 向量的投影不正确。光线投射的 origin 很好(在相机的当前位置),但方向总是偏移低于(y 坐标太小)并稍微向左(x 坐标太小)它应该的位置是。

巧合(或不巧合),y 似乎在 1.6 米左右偏移A-Frame 默认偏移相机。或者已经习惯了,因为这似乎已在A-Frame 的最新(未发布)版本中降级为Three.jsaframe-xr 依赖于它工作。

一般来说这不是光线投射的问题,正如reproduction of the issue in Glitch所证明的那样,我的测试结果如下:

Device/Example run     | Normal 0.7.0   |   WebXR       |   Normal 0.8.0   |
-----------------------|----------------|---------------|------------------|   
Windows Chrome w/mouse |   Correct      |   Correct     |       Correct    |
S8 Chrome              |   Correct      |   Correct     |       Correct    |
S8 WebARCore           |   Correct      |   Incorrect   |       Correct    |
iPad Safari            |   Correct      |   Correct     |       Correct    |
iPad WebXR Viewer      |   Correct      |   Incorrect   |       Correct    |

其中“正确”表示按预期计算方向并且球体出现在我的手指或鼠标光标正下方,“不正确”表示方向矢量出现错误并且球体出现在错误的位置。

这些示例的代码在这里:https://glitch.com/edit/#!/delirious-watch

WebXR 库中发生了什么偏移计算的光线投射方向,如何解决?

奖励信息:我还在separate glitch here 中使用aframe-ar component 对此进行了测试。 Raycasting 在 Android 上的 WebARCore 中正常工作(我相信 webxr polyfill 使用),但不正确,尽管在 iPad 上的 WebXR Viewer 中有不同的偏移量(我相信 webxr polyfill 使用)。

更新:根据 Roberto 在下面的评论,将 webxr-polyfill 中的 SITTING_EYE_HEIGHT 常量更改为 0 是朝着正确方向迈出的一步,但不是完整的解决方案。随着这一变化 - can be tried here - 如果我在移动或旋转设备之前加载网页并进行光线投射,光线投射方向实际上是正确计算的,但只要我移动或旋转设备,光线投射方向就会不正确。

【问题讨论】:

【参考方案1】:

我对 polyfill 代码不太感兴趣(我正在使用 iOS 查看器),但我记得在 polyfill 的某处有一个 SITTING_EYE_HEIGHT 常量。 目前设置为 1.1 米。也许您应该使用该值来补偿代码中的高度。 这是确切的行: https://github.com/mozilla/webxr-polyfill/blob/e4fa65a9bdb09e8e753014436d2f5b76c949e047/polyfill/XRViewPose.js#L57

【讨论】:

我可以确认将此常数从1.1 更改为0 会导致光线投射器的direction 向量的y 坐标部分正确,但x 坐标部分仍为0.3 -0.5 米到它应该在的左侧。换句话说:有了这个变化,绿球的高度是正确的,但仍然不在 x 轴上。

以上是关于为啥 WebXR 中的光线投射方向计算不正确?的主要内容,如果未能解决你的问题,请参考以下文章

光线投射算法(如何计算一个坐标点是不是在一个多边形内)

光线投射算法中的精度问题

如何为光线投射生成相机光线

在 Unity 中沿光线投射实例化预定义数量的对象

三.S。光线投射表现

为啥在我的光线追踪器中计算阴影和反射时会丢失细节