【问题标题】:Method ViroARScene.getCameraOrientationAsync() returns strange values in rotation array方法 ViroARScene.getCameraOrientationAsync() 在旋转数组中返回奇怪的值
【发布时间】:2021-04-17 17:37:01
【问题描述】:

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

环境:

  • 设备:安卓10.小米9
  • ViroReact 2.20.2

当我在 y 轴上旋转设备时,ViroARScene.getCameraOrientationAsync() 在旋转数组中返回意外值,试图保持 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

【问题讨论】:

    标签: react-native augmented-reality viro-react


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢亚伯拉罕,Quaternios 对我来说听起来像是一个全新的世界,但听起来很有趣,我会看看它们
    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多