我在Unity中创建一个游戏,它从设备的物理旋转中获取输入并将其转换为应用于主角(球)的力。使用Input.Acceleration它当前工作得很好,我添加了一个z轴偏移,这样你就可以选择默认值" up"对于它,比你面前的桌子说45度。问题是,Input.acceleration给出了重复的值,如0(表格上的平面)和1(表格的90度)之间的正弦曲线,但是y轴和z轴都以不同的间隔执行此操作(如cos / sin) sorta模式)。我不太确定如何更好地解释这一点......但我列出了他们对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之间例如,它在第一轮旋转回到90之前给出120度的值?
UPDATE2: 我找到了一个网站,它显示了如何使用陀螺仪为设备旋转提供一个角度(而不是Input.Acceleration)使用此代码(C#)
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
答案 0 :(得分:0)
这或多或少只是猜测,但也许可以尝试更改Y轴的GetZRotation:
void GetYRotation ()
{
Quaternion referenceRotation = Quaternion.identity;
Quaternion deviceRotation = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f) * Input.gyro.attitude * new Quaternion(0, 1, 0, 0);
Quaternion eliminationOfXZ = Quaternion.Inverse(
Quaternion.FromToRotation(referenceRotation * Vector3.up,
deviceRotation * Vector3.up)
);
Quaternion rotationY = eliminationOfXZ * deviceRotation;
float roll = rotationY.eulerAngles.y;
return roll;
}
目前无法对它进行实际测试,所以不确定它是否会按需运行,但我认为值得一试。