Матричные преобразования в OpenGL - PullRequest
0 голосов
/ 07 апреля 2011

Я строю 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) объекта, меняю перевод и поворачиваю поворот. И все же эффект, который он дает, когда объект вращается (при столкновении), аналогичен тому, когда кто-либо применяет перемещение, а затем вращение (то есть вращается вокруг точки на радиусе). Кажется, я не могу понять это, попробовав различные комбинации преобразований.

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

1 Ответ

2 голосов
/ 07 апреля 2011

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

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

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

...