私は、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 ();
}
したがって、かなり奇妙です。ここでは、法線に問題が生じることはなく、傾きは適切な場所にあるようです。