1

3Dシミュレーションを構築しています。

1 つのクラスを使用して、サイズ、テクスチャ、速度、軌道が異なる太陽、惑星、月を表示しています。回転 + 回転を計算するという魔法の仕事をする私のコードは次のとおりです。

world = Matrix.CreateScale(size,size,size) * Matrix.CreateTranslation(0,0,0) * 
 Matrix.CreateRotationY(rotation) * 
 Matrix.CreateTranslation(position) * 
 Matrix.CreateRotationY(revolution); 
  • sizeは、オブジェクトを個別にスケーリングするための変数です
  • 回転は、オブジェクトを独自の軸を中心に回転させる変数です
  • positionは惑星を軌道上に配置するための変数です。 new 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);

として定義orbitAxisしましたVector3orbitDistanceorbitRotationorbitScaleおよびのorbitSpinようにfloat

于 2011-05-31T15:44:57.413 に答える
0

私はそれを考え出した...

起源を親惑星の現在の位置に変換する

updateメソッドでそれを続けます

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 に答える