我正在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度。
不确定为什么会这样,因为我只处理四元数而且不应该有任何不连续性。
答案 0 :(得分:1)
您使用的传感器是什么?加速度计还是陀螺仪?
手机使用的轴可能是绝对的,因此可能需要重新映射,具体取决于设备方向以与Unity3D中的3D轴对齐。
根据纵向或横向方向,可能需要切换y轴和x轴。
答案 1 :(得分:0)
当你使用欧拉时,我认为你必须调整以越过零线。例如根据您正在旋转的方向添加或减去360.对于角度而言,这不是那么重要> 360,但我记得在Unity中有这个问题,因为它不喜欢负角度值。