0

我正在使用 ViroReact lib 开发一个 PoC,但我正在获取相机旋转的战略值。

环境:

  • 设备:Android 10。小米米 9
  • ViroReact 2.20.2

ViroARScene.getCameraOrientationAsync()我在 y 轴上旋转设备时,在旋转数组中返回意外值,试图保持 x 和 z 轴固定。

具体来说,当 y 轴达到 -90º 时,x/z 值变为 +/180º,并且从这一点开始,y 轴值接近 0,例如,y 轴值不是 -135º,而是 - 45,x/z 值为 +/-180。换句话说,y 轴值永远不会返回超过 90 的绝对值。

一些示例(值的误差范围约为 6 度):

  • 预期旋转:[0, -90, 0]。返回旋转:[+/-180, -90, +/-180]
  • 预期旋转:[0, -135, 0]。返回旋转:[+/-180, -45, +/-180]
  • 预期旋转:[0, -180, 0]。返回旋转:[+/-180, 0, +/-180]

问题:

  • 为什么y轴的绝对值永远不会大于90?
  • 如果我只是在 y 轴上旋转设备,为什么当我到达某个点(y 轴上的 +/-90º)时 x/z 值会变为 +/-180º。
  • 这是加速行为吗?如果是这样,任何人都可以解释这些值(请)。

检索值的代码:

<ViroARScene onTrackingUpdated={this._onInitialized} anchorDetectionTypes={"PlanesVertical"}>
...
</ViroARScene>

_onInitialized(state, reason) {
    if (state === ViroConstants.TRACKING_NORMAL && reason === ViroConstants.TRACKING_REASON_NONE) {
      console.log('Tracking initiated');
      this._scene.getCameraOrientationAsync().then(
        (orientation) => {
          console.log('Cam rot:', round(orientation.rotation));
        });
    }
  }

我还创建了一个带有一些模型的 GitHub 问题,以显示预期和返回的旋转值:https ://github.com/ViroCommunity/viro/issues/13

4

1 回答 1

1

我认为您遇到的可能是万向节锁定,这就是很多 3d 旋转器以四元数表示的原因,而不是您现在使用的 xyz(又名 Euler - 发音为“oiler”)系统。这可能是您系统的预期行为。

我不熟悉您的平台,但它可能具有内置的帮助程序或替代方法,您可以使用它们来使用四元数,如果不是,那么您的解决方案可能是安装一个库(或编写一些代码)在欧拉角和四元数之间进行转换,以便您的计算更有意义,如果您要花时间在 y-0 附近。

于 2021-04-28T04:37:46.643 回答