Преобразования матриц в OpenGL

Я создаю движок 2D-физики на Java, используя OpenGL (из LWJGL) для отображения объектов. Проблема, с которой я сталкиваюсь, заключается в том, что матрицы преобразования, которые я применяю к фрейму, похоже, применяются в другом порядке, чем то, что он говорит.

/**
 * Render the current frame
 */
private void render() {
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, Display.getDisplayMode().getWidth(), 0, Display
            .getDisplayMode().getHeight(), -1, 1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);

    GL11.glPushMatrix();
    GL11.glTranslatef(Display.getDisplayMode().getWidth() / 2, Display
            .getDisplayMode().getHeight() / 2, 0.0f);

    renderFrameObjects();

    GL11.glPopMatrix();
}

public void renderFrameObjects() {
    Vector<ReactiveObject> objects = frame.getObjects();
    for (int i = 0; i < objects.size(); i++) {
        ReactiveObject currentObject = objects.get(i);
        Mesh2D mesh = currentObject.getMesh();

        GL11.glRotatef((float)(currentObject.getR() / Math.PI * 180), 0, 0, 1.0f);
        GL11.glTranslated(currentObject.getX(), currentObject.getY(), 0);
        GL11.glBegin(GL11.GL_POLYGON);
        for (int j = 0; j < mesh.size(); j++) {
            GL11.glVertex2d(mesh.get(j).x, mesh.get(j).y);
        }
        GL11.glEnd();
        GL11.glTranslated(-currentObject.getX(), -currentObject.getY(), 0);
        GL11.glRotatef((float)(-currentObject.getR() / Math.PI * 180), 0, 0, 1.0f);
    }
}

В renderFrameObjects() я применяю вращение, перемещение, рисую объект (координаты сетки относительно x, y объекта), реверсирую перевод и реверсирую поворот. Тем не менее, эффект, который он дает, когда объект вращается (при столкновении), подобен тому, когда применяется перемещение, а затем вращение (т.е. вращение вокруг точки по радиусу). Кажется, я не могу понять это, попробовав различные комбинации преобразований.

Любая помощь будет оценена по достоинству.


person null0pointer    schedule 07.04.2011    source источник


Ответы (1)


Это потому, что они применяются к локальной системе координат объекта, а не к самому объекту.

Таким образом, поворот поворачивает систему координат, и перевод применяется в этой повернутой системе координат.

Кстати: не отменяйте изменения матрицы, применяя отрицательные преобразования. Ошибки округления будут накапливаться и, вероятно, менее эффективны, чем использование glPushMatrix и glPopMatrix.

person Eelke    schedule 07.04.2011
comment
Я понимаю, что вы имеете в виду, но я не уверен, как бы я это реализовал. То, что я делал раньше, это вращать, а затем переводить, и все работало нормально. Тем не менее, спасибо за подсказку, теперь это так. Кроме того, оказалось, что мне нужно повернуть сам меш для обнаружения столкновений, поэтому мне не нужно вращать во время рендеринга. - person null0pointer; 14.04.2011
comment
Сначала примените перемещение, затем вращение. - person Cris Stringfellow; 31.12.2011