GyroToUnity四元数推导

时间:2017-04-22 06:31:54

标签: c# unity3d gyroscope

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

// 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函数的含义吗?

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here

GyroToUnity函数仅用于从陀螺(右手坐标)到相机(左手坐标)的转换。当设备移动时,看起来它正在从陀螺仪传感器翻转上/下左/右值的方向。翻转后,将返回新的翻转值,然后将其分配给摄像机。

这是转换/翻转的地方:

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);
}