我正在使用OpenGL(来自LWJGL)在Java中构建2D物理引擎来显示对象。我遇到的问题是,我应用于框架的变换矩阵似乎正以不同的顺序应用于其所表示的内容。

/**
 * 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),反转平移和反转旋转。然而,当物体旋转时(碰撞时)它产生的效果类似于当物体平移然后旋转时(即绕某个半径的点旋转)的效果。我似乎无法弄清楚尝试过各种转换组合的人。

任何帮助,将不胜感激。

最佳答案

那是因为它们被应用于对象的局部坐标系,而不是对象本身。

因此,旋转旋转坐标系,并在旋转的坐标系内应用平移。

顺便说一句:不要通过应用负变换来撤销矩阵更改。舍入误差会累积,并且使用glPushMatrix和glPopMatrix可能会降低效率

10-07 19:01
查看更多