伪代码:
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)方式吗?
答案 0 :(得分:3)
你可能根本不应该打电话给glLookAt
。您确定不希望在屏幕中间绘制每个对象。对象更改模型视图矩阵而不是将其放回原点是否有问题?使用glPushMatrix
和glPopMatrix
代替重复计算。
答案 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版本/配置文件中不推荐使用此功能。