0

わかりました、私はここで困惑しています。私は、他の体を周回し、軸に沿って回転する惑星を持つ 2D ゲームに取り組んでいます。私はマトリックスを使用することにしました。問題は、表面の特定の部分に焦点を合わせて追跡できるようにしたいということです。これまでのコードは次のとおりです。

Planet.UpdateMatrix():

/// <summary>
/// Updates the transformation matrix
/// </summary>
private void UpdateMatrix()
{
    rotation = Matrix.CreateRotationY((float)(state.PlanetAngle * (Math.PI / 180D)));

    if (settings.OrbitPlanet == null) 
    {
        transform =
            Matrix.CreateTranslation(
            new Vector3(
                    (float)extraMath.lengthdir_x(state.OrbitAngle * (Math.PI / 180D), settings.OrbitDistance),
                    (float)0,
                    (float)extraMath.lengthdir_y(state.OrbitAngle * (Math.PI / 180D), settings.OrbitDistance)
                    ));
    }
    else
    {
        transform =
            Matrix.CreateTranslation(
                new Vector3(
                    (float)extraMath.lengthdir_x(state.OrbitAngle * (Math.PI / 180D), settings.OrbitDistance),
                    (float)0,
                    (float)extraMath.lengthdir_y(state.OrbitAngle * (Math.PI / 180D), settings.OrbitDistance)
                    ))
            * settings.OrbitPlanet.Transform;
}
}

そして Planet.Draw:

/// <summary>
/// Draws this planet
/// </summary>
/// <param name="device">The graphics device to draw with</param>
/// <param name="view">The ViewParameters to use</param>
public void Draw(GraphicsDevice device, ViewParamaters view)
{
    effect.View = view.View;
    effect.Projection = view.Projection;
    effect.World = view.World  *  TotalTransform; //TotalTransform is rotation * translation

    draw stuff...

しかし、私が必要とするのは Game.Update のこれです:

//Handle surface tracking
if (TrackSurface)
{
    view.World = ???;
}

世界の変換を設定して、すべてをきれいに中央に配置し、回転させて描画できるようにしたいと思います。

写真: 星 太陽系 誰か私に手を貸してくれませんか? それは可能ですか?

更新: 特定の惑星に対して惑星追跡が機能するようになりましたが、システム内の他の惑星はそれに応じて変化しません。

たとえば、太陽から次の惑星を追跡すると、ビューは表面を追跡しますが、太陽は静止したままです (技術的には惑星の周りを回転して、惑星がまだ自身の軸に沿って回転し、星を周回していることをシミュレートする必要があります)。

同様に、特定の角度で惑星の表面を追跡するなど、回転を適用しようとすると、他のすべての惑星は、追跡している惑星の周りではなく、独自の軸に沿って回転します。

新しいコード:

view.World = Matrix.Invert(TargetPlanet.TotalTransform *
    Matrix.CreateRotationY(MathHelper.ToRadians((float)SurfaceOffset)));
4

0 に答える 0