首先,我已经做了很多谷歌搜索和检查其他stackoverflow帖子,但无法获得工作回复或一段工作代码。数学不是我的力量。
我需要有一个程序,它采用一个摄像机点(CX,CY,CZ)并围绕一个观察点(LX,LY,LZ)旋转三个旋转角度(RX,RY,RZ)。在某些我需要避免的情况下,使用欧拉旋转会导致万向节锁定。所以我听说过使用四元数。
我发现这可以将旋转转换为四元数 http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm
这将从四元数转换回euler XYZ旋转 http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm
它们似乎运行良好,但我需要知道如何使用四元数来围绕LX,LY,LZ旋转CX,CY,CZ,然后返回新的CX,CY,CZ而不会出现万向节锁定。< / p>
关于这一点有很多,我相信一个好的解释和代码片段将不仅有助于我,还有将来许多其他人。
如果可以,请帮忙。非常感谢。
答案 0 :(得分: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
但是,请注意,如果您从Euler表示创建四元数,您仍然会使用万向节锁定。万向节锁定是欧拉表示的属性,四元数只表示相同的变换。要摆脱万向节锁定,你需要完全避免使用欧拉表示,除非我误解你是如何使用它的。