0

首先,我已经做了很多谷歌搜索并检查了有关此的其他 stackoverflow 帖子,但无法获得有效的回复或工作代码片段。数学不是我的强项。

我需要一个例程来获取一个相机点(CX,CY,CZ)并将其围绕一个观察点(LX,LY,LZ)旋转三个旋转角度(RX,RY,RZ)。在某些我需要避免的情况下,使用欧拉旋转会导致万向节锁定。所以我听说过使用四元数。

我发现这可以将旋转转换为四元数 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 而不会出现万向节锁定问题。

关于这方面的内容太多了,我相信一个很好的解释和代码片段不仅会帮助我,而且会在未来帮助许多其他人。

因此,如果可以,请提供帮助。非常感谢。

4

1 回答 1

3

简短的回答,如果你的四元数是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

但是,请注意,如果您从欧拉表示创建四元数,您仍然会得到万向节锁定。万向节锁是欧拉表示的一个属性,四元数将只表示相同的变换。要摆脱万向节锁定,您需要完全避免使用欧拉表示,除非我误解了您的使用方式。

于 2011-06-17T03:47:05.917 回答