C# 旋转附着到其他对象的对象

C# 旋转附着到其他对象的对象,c#,xna,xna-4.0,C#,Xna,Xna 4.0,我有一个关于单个网格(建筑)的问题,该网格包含一组动画对象(这些对象构成了整个建筑,在构建时以不同的速度和旋转从地面升起) 网格中的动画对象都有自己的位置和旋转动画轨迹。我将其作为ASE从3DS Max导出,将其转换为适当的格式,并在我的游戏引擎中使用 因此,目前,我可以成功地显示网格中所有动画对象的动画位置。执行以下操作: 比例、旋转和平移变量是建筑的变换信息。这对所有子对象都有效。pos变量表示子对象相对于建筑中心的位置 foreach (GeometricObject geoObject

我有一个关于单个网格(建筑)的问题,该网格包含一组动画对象(这些对象构成了整个建筑,在构建时以不同的速度和旋转从地面升起)

网格中的动画对象都有自己的位置和旋转动画轨迹。我将其作为ASE从3DS Max导出,将其转换为适当的格式,并在我的游戏引擎中使用

因此,目前,我可以成功地显示网格中所有动画对象的动画位置。执行以下操作:

比例、旋转和平移变量是建筑的变换信息。这对所有子对象都有效。pos变量表示子对象相对于建筑中心的位置

foreach (GeometricObject geoObject in mesh.GeoObjects)
{
  Vector3 pos = geoObject.AnimationData.PositionTrack[(int)m_keyFrameTime];
  Vector3 translatedPos = new Vector3(translation.X + pos.X, 
                                      translation.Y + pos.Y, 
                                      translation.Z + pos.Z)
  _eRenderer.ActiveCamera.World = Matrix.CreateScale(scale) *
                    Matrix.CreateFromQuaternion(rotation) *
                    Matrix.CreateTranslation(translatedPos);
}
这将完美地显示动画建筑(从地面升起),并且所有子对象都处于正确的位置

现在,当我尝试旋转子对象时,问题出现了。我尝试了很多不同的方法,但旋转子对象后,子对象的平移似乎总是会出错。这是我目前拥有的,但仍然很混乱:

foreach (GeometricObject geoObject in mesh.GeoObjects)
{
  Vector3 pos = geoObject.AnimationData.PositionTrack[(int)m_keyFrameTime];
  Vector3 translatedPos = new Vector3(translation.X, translation.Y, translation.Z)

  Matrix rotateSubObjects; 
  rotateSubObjects = Matrix.CreateTranslation(new Vector3(pos.X, pos.Y, pos.Z));
  rotateSubObjects *= Matrix.CreateFromQuaternion(geoObject.AnimationData.RotationTrack[(int)m_keyFrameTime]);

  _eRenderer.ActiveCamera.World = Matrix.CreateScale(scale) *
                    Matrix.CreateFromQuaternion(rotation) *
                    Matrix.CreateTranslation(translatedPos) *
                                  rotateSubObjects;
}
我已经读到,我可能需要将子对象转换回其原点,使其围绕其原点旋转,然后将其转换回其世界位置,但我不确定在这种情况下如何执行此操作

我没有主意了,任何帮助都将不胜感激! 当做
Riaan.

您正在寻找的转型是:

Matrix positionRotationMatrix = Matrix.CreateTranslation(-parentPosition) 
                               * Matrix.CreateFromQuaternion(parentRotation) 
                               * Matrix.CreateTranslation(parentPosition);
Vector3 translation = Vector3.Transform(parentPosition + relativePosition,
                               positionRotationMatrix);
使用新的子对象位置(
translation
变量)定义世界矩阵:


为了演示,这里有一个围绕其位置旋转的立方体(父体),带有一个箭头,其位置和旋转是相对于其父体的位置和旋转定义的。箭头跟随立方体旋转,并绕其Z轴独立旋转

用于演示的值:

parentPosition = Vector3(-1.1f, 0f, -2); //cube
relativePosition = Vector3(0, 0, -3); //arrow
parentRotation = Quaternion.CreateFromRotationMatrix(
                       Matrix.CreateRotationZ(angle) 
                     * Matrix.CreateRotationY(angle) 
                     * Matrix.CreateRotationX(0.5f));
rotation = Quaternion.CreateFromYawPitchRoll(0f, 0f, angle);
angle += 0.05f;

您正在寻找的转型是:

Matrix positionRotationMatrix = Matrix.CreateTranslation(-parentPosition) 
                               * Matrix.CreateFromQuaternion(parentRotation) 
                               * Matrix.CreateTranslation(parentPosition);
Vector3 translation = Vector3.Transform(parentPosition + relativePosition,
                               positionRotationMatrix);
使用新的子对象位置(
translation
变量)定义世界矩阵:


为了演示,这里有一个围绕其位置旋转的立方体(父体),带有一个箭头,其位置和旋转是相对于其父体的位置和旋转定义的。箭头跟随立方体旋转,并绕其Z轴独立旋转

用于演示的值:

parentPosition = Vector3(-1.1f, 0f, -2); //cube
relativePosition = Vector3(0, 0, -3); //arrow
parentRotation = Quaternion.CreateFromRotationMatrix(
                       Matrix.CreateRotationZ(angle) 
                     * Matrix.CreateRotationY(angle) 
                     * Matrix.CreateRotationX(0.5f));
rotation = Quaternion.CreateFromYawPitchRoll(0f, 0f, angle);
angle += 0.05f;