c# - 从欧拉旋转转换为四元数旋转

标签 c# rotation unity-game-engine quaternions euler-angles

我正在使用 Leap Motion 设备来获取有关我的手的位置和方向的可用数据。目前我在编码的方向部分遇到问题。 Leap API 仅具有逐帧旋转的代码,但是,它还提供了法线向量(垂直于手掌)和指针向量(指向从手掌向外指向手指的方向)。这两个向量是垂直的。

向量:

Leap.Vector normal = current.PalmNormal;
Leap.Vector pointer = current.Direction; 

更多信息可以在 Leap Hand API 上找到:https://developer.leapmotion.com/documentation/Languages/CSharpandUnity/API/class_leap_1_1_hand.html

转换为 Unity Vector3 类:

Vector3 normalU = new Vector3();
normalU.x = normal.x;
normalU.y = normal.y;
normalU.z = normal.z;
Vector3 pointerU = new Vector3();
pointerU.x = pointer.x;
pointerU.y = pointer.y;
pointerU.z = pointer.z;

我使用这些向量来计算我的手的欧拉角方向(关于 x 轴的 theta_x 度、关于 y 轴的 theta_y 度和关于 z 轴的 theta_z 度的旋转),使用代码:

float rXn = Mathf.Atan (normalU.y/normalU.z);
rXn *= (180f/Mathf.PI);
if ((normalU.y < 0 && normalU.z < 0) || (normalU.y > 0 && normalU.z < 0))
{
    rXn += 180f;
}
float rZn = Mathf.Atan (normalU.y/normalU.x);
rZn *= (180f/Mathf.PI);
if ((normalU.y < 0 && normal.x > 0) || (normalU.y > 0 && normalU.x > 0))
{
    rZn += 180f;
}
float rYn = Mathf.Atan (pointerU.x/pointerU.z);
rYn *= (180f/Mathf.PI);
if ((pointerU.x > 0 && pointerU.z > 0) || (pointerU.x < 0 && pointerU.z > 0))
{
    rYn += 180f;
}

然后将欧拉角转换为四元数并使用以下代码实现:

Quaternion rotation = Quaternion.Euler (-rZn+90, -rYn, rXn+90);
rigidbody.MoveRotation (rotation);

有关 Unity Quaternion 类的更多信息可以在此处找到:http://docs.unity3d.com/Documentation/ScriptReference/Quaternion.html

当我编码时,我单独测试了每个旋转轴,注释掉其他轴(将它们设置为 0),并且它们工作正常。然而,当我同时实现这三个功能时,围绕单个轴的旋转行为发生了变化,这让我感到困惑。为什么包含绕 y 轴旋转的识别会改变绕 x 轴旋转的发生方式?

由于每个单独的旋转轴都在其他旋转轴被注释掉(并设置为 0)时起作用,我认为问题在于欧拉角转换为四元数的方式。我对四元数用于表示旋转的方式不太了解,但是我很困惑为什么改变绕 y 轴的旋转角度的值会改变绕 x 轴的旋转角度。

感谢您的帮助。

最佳答案

轮换顺序是相关的,这可能是导致您困惑的原因。想象 x 轴上的一个点 (1, 0, 0)。当我们现在绕 x 轴旋转 90° 时,什么也没有发生。然后我们绕 y 轴旋转 90°,这使得该点位于 z 轴正方向上。如果我们改变旋转顺序,该点将在 y 轴上结束。根据函数的实现方式,它们需要一定的轮换顺序才能获得预期的结果。

关于c# - 从欧拉旋转转换为四元数旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19732300/

相关文章:

vector - 在 Unity 4.3 中将 2d 对象移向并穿过某个位置

c# - Silverlight 4 应用程序卡住而不抛出任何异常

iphone - 在 iPhone SDK 中旋转 UI 按钮

css - 在 IE9 和 IE10 中,旋转的容器不会像预期的那样剪切其旋转的嵌套元素

javascript - 三个js对象3D旋转

c# - 无法将类型对象隐式转换为 unityengine.Vector3

javascript - Unity3d中的旋转 Angular 约束?

c# - 哪个 C# double 文字不能完全表示为 double?

c# - C# 控制台应用程序中剪贴板的奇怪行为

c# - C# 中的异步属性