OpenGL:如何撤消缩放?

Nic*_*ner 0 opengl jogl

我是OpenGL的新手.我正在使用JOGL.

我有一个WorldEntity代表可以渲染的东西的类.它有像position和的属性size.要渲染,我一直在使用这种方法:

    /**
     * Renders the object in the world.
     */
    public void render() {
        gl.glTranslatef(getPosition().x, getPosition().y, getPosition().z);
        gl.glRotatef(getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
//        gl.glScalef(size, size, size);

        gl.glCallList(drawID);

//        gl.glScalef(1/size, 1/size, 1/size);
        gl.glRotatef(-getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
        gl.glTranslatef(-getPosition().x, -getPosition().y, -getPosition().z);
    }
Run Code Online (Sandbox Code Playgroud)

我一直在使用的模式是应用实体的每个属性(如位置或旋转),然后撤消它以避免破坏下一个实体被渲染的状态.

取消注释缩放行导致应用程序更加缓慢,因为它在我的适度计算机上呈现适度的场景.我猜测浮动除法太多,无法处理每秒数千次操作.(?)

这是怎样的正确方法?我可以找到一种计算量较小的方法来撤消缩放转换吗?我是否需要按比例对对象进行排序并绘制它们以减少所需的缩放变换?

谢谢.

小智 5

这是你使用矩阵的地方(忍受我,我来自OpenGL/C编程背景):

glMatrixMode(GL_MODELVIEW); // set the matrix mode to manipulate models

glPushMatrix(); // push the matrix onto the matrix stack

// apply transformations
glTranslatef(getPosition().x, getPosition().y, getPosition().z);
glRotatef(getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
glScalef(size, size, size);

glCallList(drawID); // drawing here

glPopMatrix(); // get your original matrix back
Run Code Online (Sandbox Code Playgroud)

......至少,这就是我认为的.