1

オブジェクトを表示するために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を基準にしています)、平行移動を反転し、回転を反転します。ただし、オブジェクトが(衝突時に)回転したときに得られる効果は、平行移動を適用してから回転する(つまり、半径のある点を中心に回転する)場合と似ています。さまざまな変換の組み合わせを試したので、これを理解できないようです。

どんな助けでもいただければ幸いです。

4

1 に答える 1

3

これは、オブジェクト自体ではなく、オブジェクトのローカル座標系に適用されるためです。

したがって、rotateは座標系を回転させ、平行移動はその回転された座標系内で適用されます。

ところで:負の変換を適用してマトリックスの変更を元に戻さないでください。丸め誤差が蓄積され、glPushMatrixおよびglPopMatrixを使用する場合よりも効率が低下する可能性があります。

于 2011-04-07T15:12:45.080 に答える