C#XNA矩阵 - 用矩阵计算绕轴的月球旋转

时间:2011-05-31 15:17:29

标签: c# math matrix xna matrix-multiplication

我正在构建3D模拟。

我正在使用一个班来展示太阳,行星和太阳。月亮与不同的大小,纹理,速度和轨道。这是我的代码,它完成了计算旋转+旋转的神奇工作

world = Matrix.CreateScale(size,size,size) * Matrix.CreateTranslation(0,0,0) * 
 Matrix.CreateRotationY(rotation) * 
 Matrix.CreateTranslation(position) * 
 Matrix.CreateRotationY(revolution); 
  • 尺寸是我单独缩放对象的变量
  • 旋转是我的变量,可以围绕自己的轴旋转对象
  • 位置是我将行星定位在轨道上的变量,新的Vector3(240,0,0)
  • 革命是我围绕原点旋转行星的变量

现在我希望显示地球周围和其他星球周围的卫星,但我无法弄清楚如何做到这一点。在矩阵乘法方面。

复杂的是月亮的革命是围绕着一个不是起源而且总是在变化的行星。

怎么做?

2 个答案:

答案 0 :(得分:2)

在你的Draw方法中,在绘制了想绕轨道运行的行星/月球之后:

Matrix satellite = Matrix.Identity
                 * Matrix.CreateScale(orbitScale)
                 * Matrix.CreateRotationY(orbitSpin)
                 * Matrix.CreateTranslation(0f, orbitDistance, 0f)
                 * Matrix.CreateFromAxisAngle(orbitAxis, orbitRotation);
effect.View = satellite * camera.View;

因此,在您的Update方法中,您可以执行以下操作:

orbitRotation += MathHelper.PiOver2 * (float)gameTime.ElapsedGameTime.TotalSeconds;
orbitRotation = MathHelper.WrapAngle(orbitRotation);
orbitSpin += MathHelper.TwoPi * (float)gameTime.ElapsedGameTime.TotalSeconds;
orbitSpin = MathHelper.WrapAngle(orbitSpin);

我已将orbitAxis定义为Vector3orbitDistanceorbitRotationorbitScaleorbitSpinfloat

答案 1 :(得分:0)

我想通了......

将原点翻译为父星球的当前位置

并继续在更新方法中执行此操作

world = Matrix.CreateScale(size,size,size)
        * Matrix.CreateTranslation(0,0,0) 
        * Matrix.CreateRotationY(rotation)
        * Matrix.CreateTranslation(position)
        * Matrix.CreateRotationY(revolution); 

world *= Matrix.CreateTranslation( parent.getPosition() );

我在这里做的是我绕着原点旋转月球(太阳),但我将其原点转换为任何行星的当前位置......这对我有用。