在我的应用中,我需要了解设备旋转。我试图使用以下方法从陀螺仪中拉出y轴值:
var y = Input.gyro.attitude.eulerAngles.y;
如果我只是将其输出到屏幕并转圈(将手机笔直上下......就好像你正在看屏幕一样),我得到以下内容:
270,270,270,270等...... 270,290,310,20,40,60,80(非常快) ...... 90,90,90,90,等...等等...
有没有办法解释这个数字的跳跃?
答案 0 :(得分:4)
您所看到的是万向节锁更多信息here。它发生在欧拉角穿过360平面或更具体地说(三个轴中的两个被驱动成并联配置),这就是人们使用四元数的原因。
你不应该直接拉动欧拉角。我会推荐这样的东西:
Quaternion q = Input.gyro.attitude.rotation;
通过使用四元数而不是欧拉角,我们将避免万向节锁定,从而避免360度问题。
如果您只想显示他们在y方向所面对的角度,我可能会推荐这样的东西,这会将y角度包裹到0到180度:
/// <summary>
/// This method normalizes the y euler angle between 0 and 180. When the y euler
/// angle crosses the 180 degree threshold if then starts to count back down to zero
/// </summary>
/// <param name="q">Some Quaternion</param>
/// <returns>normalized Y euler angle</returns>
private float normalizedYAngle(Quaternion q)
{
Vector3 eulers = q.eulerAngles;
float yAngle = eulers.y;
if(yAngle >= 180f)
{
//ex: 182 = 182 - 360 = -178
yAngle -= 360;
}
return Mathf.Abs(yAngle);
}
答案 1 :(得分:2)
您可以设置最大旋转以防止快速跳跃。
y_diff = new_y - last_y;
y = y + Mathf.Clamp(y_diff, -limit, limit);
答案 2 :(得分:1)
您可以使用线性插值来实现此效果。你需要考虑的唯一一件事就是你会有多快,因为手机会不断旋转,你不希望你的价值落后。
使用Mathf.Lerp
:
// Your values
var y = 0;
// speed for the Lerp
static float t = 1.0f;
void Update()
{
float old = y
float new = Input.gyro.attitude.eulerAngles.y;
// Interpolate
y = Mathf.Lerp(old, new, t * Time.deltaTime);
}
引自here