如何根据Unity 3D中的旋转坐标系计算四元数?

时间:2013-12-20 10:25:35

标签: vector rotation unity3d quaternions rotational-matrices

我正在尝试使用Quaternion旋转矢量,使用Quaternion.Euler(x,y,z)构造它按预期工作,但问题是,旋转是相对于世界坐标系完成的,而我想要尊重地旋转向量本身。

所以我想把坐标系作为

z = vector's direction,     
x = vector's perpendicular (any)  
y = world y.

所以我的代码是这样的:

myVector = euler * myVector;

然而我需要

myVector = localEuler * myVector;

所以我需要将localEuler计算为eulermyVector的函数。

我该怎么做?

感谢您的帮助!

我试过了:

localEuler = Quaternion.Euler(euler.x * myVector.x ,euler.y * myVector.y ,euler.z * myVector.z );

它不起作用。我猜这是点积。

P.S。

我认为这有Transform的内置代码:Transform.RotateAround(),但我需要使用Vector3,而不是Transform

1 个答案:

答案 0 :(得分:2)

我解决了我的问题。

我的解决方案是:

  • 使用Quaternion.AxisAngle(angle : float , rotationAxis : Vector3);

所以例如,要绕“局部”x旋转,rotationAxis应该是myVector的垂线,其计算如下:

var rotationAxis : Vector3 = Quaternion.Euler(0,90,0) * myVector;
rotationAxis.y = 0;

然后新的四元数计算如下:

var localEuler:Quaternion = Quaternion.AngleAxis(euler.x , rotationAxis);

然后正确旋转矢量:

myVector = localEuler * myVector;