【发布时间】:2015-11-25 00:54:55
【问题描述】:
我正在 Unity 中创建一个游戏,该游戏从设备的物理旋转中获取输入,并将其转化为施加于主角(球)的力。使用 Input.Acceleration 它目前工作得很好,我添加了一个 z 轴偏移量,这样你就可以选择它的默认“向上”,比如距离你面前的桌子 45 度。问题是,Input.acceleration 给出的值会重复,例如 0(平在桌子上)和 1(与桌子成 90 度)之间的正弦曲线,但是 y 和 z 轴都以不同的间隔执行此操作(例如 cos/sin排序模式)。我不太确定如何更好地解释这一点.. 但我会列出 y 和 z 对于每个 90 度的值,我需要将它们转换为 0-4 值或 360 度角- 只是 z 旋转的某种线性增加值。
0 度(平放在桌子上):y = 0,z = -1
90 度(面向您):y = -1,z = 0
180 度(平面朝下):y = 0,z = 1
270 度(背对您):y = 1,z = 0
更新: 使用等式 {((Input.acceleration.y * 2) + Input.acceleration.z + 1) * 90f} 它给出了在设备完全旋转时介于 0 和 360 之间的角度,但在 0 和 90 之间例如,它给出了 120 度的值,然后在第一季度旋转时返回到 90?
更新2: 我找到了一个网站,它展示了如何使用陀螺仪使用此代码(C#)为设备旋转(而不是 Input.Acceleration)提供一个角度
void GetZRotation ()
{
Quaternion referenceRotation = Quaternion.identity;
Quaternion deviceRotation = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f) * Input.gyro.attitude * new Quaternion(0, 0, 1, 0);
Quaternion eliminationOfXY = Quaternion.Inverse(
Quaternion.FromToRotation(referenceRotation * Vector3.forward,
deviceRotation * Vector3.forward)
);
Quaternion rotationZ = eliminationOfXY * deviceRotation;
float roll = rotationZ.eulerAngles.z;
return roll;
}
如果我知道它是如何工作的,以及如何获得 Y 值而不是 Z(我对其进行了测试,它给出了一个介于 0 和 360 之间的线性值,将手机从左向右倾斜) ,但我需要前后角度)
http://answers.unity3d.com/questions/434096/lock-rotation-of-gyroscope-controlled-camera-to-fo.html
【问题讨论】:
标签: ios unity3d rotation gyroscope acceleration