Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL中的矩阵变换_Java_Opengl_Lwjgl_Coordinate Transformation - Fatal编程技术网

Java 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

我正在用Java构建一个2D物理引擎,使用OpenGL(从)来显示对象。我遇到的问题是,我应用于框架的变换矩阵似乎以不同的顺序应用于它所说的

/**
 * 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效率更低

我理解您的意思,但我不确定如何实现它。我之前做的是旋转然后平移,效果很好。不管怎样,谢谢你的提示,现在就可以了。此外,我还需要旋转网格本身以进行碰撞检测,所以在渲染时不需要旋转。先应用平移,然后应用旋转。