Java OpenGL中的矩阵变换
我正在用Java构建一个2D物理引擎,使用OpenGL(从)来显示对象。我遇到的问题是,我应用于框架的变换矩阵似乎以不同的顺序应用于它所说的Java OpenGL中的矩阵变换,java,opengl,lwjgl,coordinate-transformation,Java,Opengl,Lwjgl,Coordinate Transformation,我正在用Java构建一个2D物理引擎,使用OpenGL(从)来显示对象。我遇到的问题是,我应用于框架的变换矩阵似乎以不同的顺序应用于它所说的 /** * Render the current frame */ private void render() { GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GL11.glOrtho(0, Display.getDisplayMode().getW
/**
* 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);
}
}
/**
*渲染当前帧
*/
私有void render(){
GL11.glMatrixMode(GL11.GLU投影);
GL11.glLoadIdentity();
GL11.glOrtho(0,Display.getDisplayMode().getWidth(),0,Display
.getDisplayMode().getHeight(),-1,1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glClear(GL11.GL_颜色_缓冲_位| GL11.GL_模具_缓冲_位);
GL11.glPushMatrix();
GL11.glTranslatef(Display.getDisplayMode().getWidth()/2,Display
.getDisplayMode().getHeight()/2,0.0f);
renderFrameObjects();
GL11.glPopMatrix();
}
public void renderFrameObjects(){
向量对象=frame.getObjects();
对于(int i=0;i
在renderFrameObjects()中,我应用旋转、平移、绘制对象(网格坐标相对于对象的x、y)、反转平移和反转旋转。然而,当一个对象旋转(碰撞时)时,它所产生的效果类似于先应用平移,然后应用旋转(即围绕半径处的点旋转)。在尝试了各种转换组合后,我似乎无法理解这一点
任何帮助都将不胜感激。这是因为它们应用于对象的局部坐标系,而不是对象本身 因此,“旋转”旋转坐标系,并在该旋转坐标系内应用平移
顺便说一句:不要通过应用负变换撤消矩阵更改。舍入误差会累积,并且可能比使用glPushMatrix和glPopMatrix效率更低我理解您的意思,但我不确定如何实现它。我之前做的是旋转然后平移,效果很好。不管怎样,谢谢你的提示,现在就可以了。此外,我还需要旋转网格本身以进行碰撞检测,所以在渲染时不需要旋转。先应用平移,然后应用旋转。