对于初学者,我认为如果您使用矩阵而不是四元数,您会发现这个问题更直接。四元数仅包含旋转,因此您需要将平移(位置)分别存储在向量中,而矩阵同时包含旋转和平移。
对于太阳系,您可以为太阳和地球分配一个世界矩阵。太阳的位置使其中心位于世界原点 [0,0,0]。太阳的矩阵将包含它围绕 y 轴的旋转(使其转动)。
sun.World = Matrix.CreateRotationY(angle);
地球将有一个相对于太阳的位置。该值将保持不变并用于创建平移矩阵。如果然后将此矩阵与太阳的世界矩阵相乘,您将得到地球的世界矩阵:
earth.World =
Matrix.CreateTranslation(earth.Position) *
sun.World;
注意矩阵乘法的顺序很重要。随着时间的推移,这将旋转地球围绕太阳的位置。也可以对地球进行旋转,使其绕轴自转,如下所示:
earth.World =
Matrix.CreateRotationY(angle) *
Matrix.CreateTranslation(earth.Position) *
sun.World;
要将月球定位在围绕地球的轨道上,可以应用相同的原理:
moon.World =
Matrix.CreateTranslation(moon.Position) *
earth.World;
如果您需要使用四元数,您可以将它们转换为矩阵和从矩阵转换:
Quaternion quaternion = Quaternion.CreateFromRotationMatrix(matrix);
Vector3 translation = matrix.Translation;
Matrix matrix = Matrix.CreateFromQuaternion(quaternion);
matrix = Matrix.CreateTranslation(translation) * matrix;