GyroToUnity 四元数求导

GyroToUnity Quaternion Derivation

最近开发一个VR项目,需要用到陀螺仪,这是我在unity手册中找到的代码:

// The Gyroscope is right-handed.  Unity is left handed.
// Make the necessary change to the camera.
void GyroModifyCamera()
{
    transform.rotation = GyroToUnity(Input.gyro.attitude);
}

private static Quaternion GyroToUnity(Quaternion q)
{
    return new Quaternion(q.x, q.y, -q.z, -q.w);
}

抱歉数学和英语不好,谁能给我一些指导来解释 GyroToUnity 函数的含义?

陀螺仪 Input.gyro.attitude 传感器值在 右手坐标 中返回,但 Unity 使用 左手坐标 系统.您可以阅读有关这两个坐标系的信息 here.

一个简单的图像来说明差异:

GyroToUnity函数只是用来做Gyro(右手坐标)到Camera(左手坐标)的转换。看起来它正在翻转陀螺仪传感器的 up/downleft/right 值的方向移动。翻转后,返回新的翻转值,然后赋值给相机。

这是完成 conversion/flipping 的地方:

return new Quaternion(q.x, q.y, -q.z, -q.w);

因此 -q.z-q.w。减号用于翻转值。

如果进行转换或者不使用GyroToUnity函数会怎样?

如果设备贴在您的脸上并且您抬起头,摄像头会向下移​​动,反之亦然。如果你向右移动它,相机会向左移动,反之亦然。这应该是相反的。这就是使用该功能的原因。


了解发生了什么的最简单方法是亲自尝试。绕过 GyroToUnity 函数然后测试它。你会看到不同。

void GyroModifyCamera()
{
    transform.rotation = Input.gyro.attitude;
}

现在,将其与原始版本的代码进行比较:

void GyroModifyCamera()
{
    transform.rotation = GyroToUnity(Input.gyro.attitude);
}