Я делаю простое моделирование солнечной системы, используя OpenTK для OpenGL и monodevelop для C # ide. Все шло хорошо, и у меня были планеты, вращающиеся вокруг Солнца и освещенные правильно. Проблема началась, когда я захотел наклонить ось планет; куда бы я ни поместил новое вращение в моем методе, оно не вращается заметно. Однажды это заставило освещенные лица моих сфер вращаться вокруг него. Если я установлю вращение до или после вращения, которое заставляет планету вращаться вокруг своей оси, то верхушка планеты странно освещается, как если бы нормали нарушались.
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 ();
}
Поэтому это довольно странно. Ничто здесь не должно вызывать проблем с нормалями, и наклон, кажется, находится в правильном месте.