2011-06-13 188 views
0

首先,我做了大量的搜索和检查其他stackoverflow这篇文章,但无法得到工作的答复或工作代码片段。数学不是我的力量。我需要一个例程,它需要一个相机点(CX,CY,CZ),并将它围绕一个观察点(LX,LY,LZ)旋转三个旋转角度(RX,RY,RZ)。在某些我需要避免的情况下使用欧拉旋转会导致万向节锁定。所以我听说过使用四元数。使用四元数旋转3D欧拉点,以避免万向锁

我发现这的旋转转换成四元数 http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm

,这从四元数转换回欧拉XYZ旋转 http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm

他们似乎很好地工作,但我需要知道如何使用四元数在LX,LY,LZ周围旋转CX,CY,CZ,然后返回新的CX,CY,CZ而不会出现万向锁定问题。

有这么多关于这个,我相信一个很好的解释和代码片段将不仅有助于我,但在未来的许多其他人。

所以,如果可以,请帮助。非常感谢。

回答

2

简短的回答,如果您的四元数是Q和新的相机点是C”

C' = Q*(C-L)*Q^-1 + L 

其中点被增加有CW = 0和乘法和逆根据四元数规则。

具体来说,让D = C-L。然后,我们让F = Q * d

Fw = Qw*0 - Qx*Dx - Qy*Dy - Qz*Dz 
Fx = Qw*Dx + Qx*0 + Qy*Dz - Qz*Dy 
Fy = Qw*Dy - Qx*Dz + Qy*0 + Qz*Dx 
Fz = Qw*Dz + Qx*Dy - Qy*Dx + Qz*0 

最后,我们得到C” = F * Q^-1 + L

Cw' = 0 
Cx' = Fw*Qx - Fx*Qw + Fy*Qz - Fz*Qy + Lx 
Cy' = Fw*Qy - Fx*Qz - Fy*Qw + Fz*Qx + Ly 
Cz' = Fw*Qz + Fx*Qy - Fy*Qx - Fz*Qw + Lz 

但是,要知道,如果你从欧拉表示中创建四元数,你仍然会得到万向锁。万向节锁是欧拉表示的一个属性,而四元数将代表相同的变换。要摆脱万向节锁定,除非我误解你如何使用它,否则你需要完全避免欧拉表示。

+0

感谢您的提示。因此,如果将欧拉转换为qualternion仍会导致万向节锁定,那么如何在3D空间中将相机位置旋转并无任何问题地进行旋转?如果我有XYZ相机位置和旋转角度?我假设我没有看到整个图像,但是应该有一个简单的方法来拍摄相机位置并在没有万向节锁的情况下同时围绕所有3个轴旋转它?还是那个天真? – TallGuy 2011-06-17 13:18:12