3

我正在 PC 上创建一个统一应用程序,它读取移动设备的方向并根据手机与 PC 屏幕的角度旋转游戏对象。

void Update () {
    // Set main screen orientation when left trigger is pressed
    if(leftPad.GetTrigger())
        mainScreenOrientation = InputState.orientation;

    Quaternion delta = InputState.orientation * Quaternion.Inverse(mainScreenOrientation);
    transform.localRotation = delta;
}

InputState.orientation 是手机的方向,每帧更新一次。当用户第一次启动应用程序时,必须将手机指向屏幕以注册 mainScreenOrientation。

当前手机和 PC 屏幕方向之间的增量是在游戏对象的 transform.localRotation 上计算和设置的

所有四元数都定义为 y 指向磁北,x 指向东,z 指向上 在此处输入图像描述

注册后游戏对象的方向正确设置为身份,但是当手机旋转时,对象似乎在错误的轴上旋转。知道这有什么问题吗?

编辑:

结果发现代码有一些问题

  1. 正如杰罗姆所说,当手机在横向模式下使用时,必须重新映射方向。

    Quaternion.Euler(0, 0, 90) * InputState.orientation

  2. Unity 使用左手坐标,而传感器读取的输入是右坐标。取反 z 进行转换。

我没有用这个实现解决的最后一个问题是旋转超过某个角度的突然跳跃。将横向模式下手机的高度提高到地平线以上会导致对象沿 z 轴旋转 90 度。

不知道为什么会发生这种情况,因为我只处理四元数并且不应该有任何不连续性。

4

2 回答 2

1

你用的是什么传感器?加速度计还是陀螺仪?

手机使用的轴可能是绝对的,因此可能需要根据设备方向重新映射以与 Unity3D 中的 3D 轴对齐。

y 轴和 x 轴很可能需要根据纵向或横向方向进行切换。

于 2013-02-15T12:31:56.113 回答
0

当您使用欧拉时,我认为您必须调整以越过零线。例如,根据您旋转的方向添加或减去 360。这对于角度 > 360 并不那么重要,但我记得在 Unity 中遇到过这个问题,因为它不喜欢负角度值。

于 2013-02-15T15:49:30.207 回答