1

私は、OpenGL 用の OpenTK と C# IDE 用の monodevelop を使用して、単純な太陽系シミュレーションを作成しています。順調に進んでいて、太陽を周回する惑星を適切に点灯させました。問題は、惑星の軸を傾けたいときに始まりました。メソッドに新しい回転を入れても、目に見えて回転しません。球体の照らされた面がどういうわけかその周りを回転するようになると。惑星を軸の周りに回転させる回転の前後に回転を配置すると、法線が壊れているかのように、惑星の上部が奇妙に照らされます。

public void Display (float time)
{
    GL.Rotate (axialTilt, tiltAxis);  // This rotation causes the issues, no matter
                                      // where I put it
    GL.PushMatrix ();                 // This push/pop was added later, but it 
                                      // doesn't help
    rotationalPosition += rotationSpeed * time;
    GL.Rotate (rotationalPosition, Vector3.UnitZ);

    planet.Draw ();

    GL.PopMatrix ();

    if (ring != null) {
        ring.Draw ();
    }
    if (moons != null) {
        foreach (Orbit o in moons) {
            o.Draw (time);
        }
    }
}

これは次のように呼び出されます。

public void Draw (float time)
{
    GL.PushMatrix ();

    GL.Rotate (angle, orientation);            // This will allow an angled axis for
                                               // moons and other planetary orbits.
    orbitPosition += orbitSpeed * time;
    GL.Rotate (orbitPosition, Vector3.UnitZ);

    GL.Translate (orbitDistance, 0, 0);

    GL.Rotate (-orbitPosition, Vector3.UnitZ); // Rotate backward, so rotating around
                                               // the orbit axis doesn't rotate the
                                               // planet.
    orbitingBody.Display (time);

    GL.PopMatrix ();
}

したがって、かなり奇妙です。ここでは、法線に問題が生じることはなく、傾きは適切な場所にあるようです。

4

1 に答える 1

1

あなたは最初に太陽の周りで惑星を傾け、次にそれを回転させているように見えます。これにより、光が予想とは異なる方向から来るようになります。

何をするのかわかりませんplanet.Draw()が、これはあなたのコードが概念的に行うべきことです。

単位行列から開始します(単位行列から開始しない場合は、惑星の軸ではなく、シーンの中心を中心に回転します)

惑星をその傾斜軸を中心に回転させます。ここに画像の説明を入力してください

太陽に対する惑星の現在の位置を変換に追加して、太陽がシーンの原点になるようにします。(GL.translate)

惑星を太陽の周りで回転させます。 ここに画像の説明を入力してください

于 2012-03-12T03:09:16.477 に答える