1

我正在构建一个 3D 模拟。

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

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

现在我想展示围绕地球和其他行星的卫星,但我不知道该怎么做。就矩阵乘法而言。

复杂之处在于月球的公转是围绕着一个不属于起源并且一直在变化的行星。

怎么做 ?

4

2 回答 2

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);

我已经定义orbitAxisVector3. orbitDistance, orbitRotation,orbitScaleorbitSpinasfloat的。

于 2011-05-31T15:44:57.413 回答
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() );

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

于 2011-05-31T19:55:17.880 回答