我正在使用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),反转平移,并反转旋转。然而,当物体旋转(碰撞时)它给出的效果类似于当应用平移然后旋转(即,围绕半径处的点旋转)时的效果。我似乎无法通过尝试各种变换组合来解决这个问题。
任何帮助都将不胜感激。
答案 0 :(得分:2)
这是因为它们被应用于对象的局部坐标系,而不是对象本身。
因此,旋转旋转坐标系,并在该旋转坐标系内应用平移。
BTW:不要通过应用负变换撤消矩阵更改。舍入错误将累积,它可能也比使用glPushMatrix和glPopMatrix
效率低