为每个要绘制的项目调用gluLookAt()?

时间:2012-02-03 22:23:01

标签: java opengl-es android-2.2-froyo opengl-es-1.1

伪代码:

drawScene() {
    for(every 3Dobject) {
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(eye, targ, up); //is there a better way?
        3Dobject[n].draw(); //this involves calling translations / rotations
    }
    //of course theres 2D GUI stuff to draw next

这是正确的(或至少不是terribad)方式吗?

2 个答案:

答案 0 :(得分:3)

你可能根本不应该打电话给glLookAt。您确定不希望在屏幕中间绘制每个对象。对象更改模型视图矩阵而不是将其放回原点是否有问题?使用glPushMatrixglPopMatrix代替重复计算。

答案 1 :(得分:1)

不,只需调用一次“设置相机”然后绘制所有对象,然后通过在世界空间中应用自己的变换来相应地进行变换。

编辑:正如Ben Voigt所建议的那样,你应该适当地推动和弹出以保留这个变换,直到绘制完所有物体。

示例:

gluLookAt(...);

//it is essential to track this state, since there are multiple stacks
glMatrixMode(GL_MODELVIEW); 

for(object : objects){
    glPushMatrix();
    glMultMatrix(object.transform);
    draw(object);
    glPopMatrix();
}

我还想提一下,在较新的OpenGL版本/配置文件中不推荐使用此功能。