Проблема OpenGL с вращением и освещением - PullRequest
1 голос
/ 12 марта 2012

Я делаю простое моделирование солнечной системы, используя 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 ();
}

Поэтому это довольно странно. Ничто здесь не должно вызывать проблем с нормалями, и наклон, кажется, находится в правильном месте.

1 Ответ

1 голос
/ 12 марта 2012

Похоже, вы сначала наклоняете планету вокруг Солнца, а затем вращаете его. Это заставляет свет идти не так, как вы ожидаете.

Я не уверен, что делает planet.Draw(), но это то, что ваш код должен делать концептуально.

Начните с идентификационной матрицы (если вы не начинаете с матрицы тождеств, вы вращаетесь вокруг центра сцены вместо оси планеты)

Поверните планету вокруг своей оси наклона. enter image description here

Добавьте текущее положение планет относительно Солнца в преобразование, чтобы Солнце находилось в начале сцены. (GL.translate)

Вращать планету вокруг Солнца. enter image description here

...