我正在 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 指向上
注册后游戏对象的方向正确设置为身份,但是当手机旋转时,对象似乎在错误的轴上旋转。知道这有什么问题吗?
编辑:
结果发现代码有一些问题
正如杰罗姆所说,当手机在横向模式下使用时,必须重新映射方向。
Quaternion.Euler(0, 0, 90) * InputState.orientation
Unity 使用左手坐标,而传感器读取的输入是右坐标。取反 z 进行转换。
我没有用这个实现解决的最后一个问题是旋转超过某个角度的突然跳跃。将横向模式下手机的高度提高到地平线以上会导致对象沿 z 轴旋转 90 度。
不知道为什么会发生这种情况,因为我只处理四元数并且不应该有任何不连续性。