openGL转换和gluLookAt()

openGL转换和gluLookAt(),opengl,Opengl,我有一个学习项目,它代表了简单的3D场景。我想在一些非原点绘制球体。稍后我将把它作为单独的函数或方法来实现 我使用gllookat()设置视点,然后使用glTranslatef()转换模型视图矩阵,并使用小偏移和绘制球体。不幸的是,没有显示球体。我对模型视图矩阵的看法正确吗 void display(void){ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); gluLookAt(1, 0 ,1, 0, 0, 0,

我有一个学习项目,它代表了简单的3D场景。我想在一些非原点绘制球体。稍后我将把它作为单独的函数或方法来实现

我使用
gllookat()
设置视点,然后使用
glTranslatef()
转换模型视图矩阵,并使用小偏移和绘制球体。不幸的是,没有显示球体。我对模型视图矩阵的看法正确吗

void display(void){    
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0);    
    glColor3b(197, 96, 63);    
    glPushMatrix(); 
    glLoadIdentity();
    glTranslatef(0.1, 0, 0);
    glutWireSphere(0.2, 20, 10);
    glPopMatrix();     
    glFlush();
}

void reshape(int w, int h){
    glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho ((float)w/(float)h, (float)-w/(float)h, -1, 1, 0.8, 100);
    glMatrixMode(GL_MODELVIEW);
}
不,你不是

gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0); 
glColor3b(197, 96, 63);    
glPushMatrix(); 
glLoadIdentity(); // why it should be there?
通过将视图矩阵归零,可以相对于原点坐标绘制对象,而不考虑glLookAt。对它的调用实际上被忽略了。应将其编码为:

  • 设置“摄像机矩阵”
  • 将矩阵推到堆栈上
  • 平移到对象的位置
  • 绘制对象
  • 弹出并返回到2
  • 因此,如果你想设置假想的“摄像机”,你必须将物体的位置与摄像机矩阵本身结合起来。

    不,你没有

    gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0); 
    glColor3b(197, 96, 63);    
    glPushMatrix(); 
    glLoadIdentity(); // why it should be there?
    
    通过将视图矩阵归零,可以相对于原点坐标绘制对象,而不考虑glLookAt。对它的调用实际上被忽略了。应将其编码为:

  • 设置“摄像机矩阵”
  • 将矩阵推到堆栈上
  • 平移到对象的位置
  • 绘制对象
  • 弹出并返回到2

  • 因此,如果你想建立一个假想的“摄像机”,你必须将物体的位置与摄像机矩阵本身结合起来。

    你的方法看起来并没有那么不合理。问题在于:

    glPushMatrix(); 
    glLoadIdentity();
    glTranslatef(0.1, 0, 0);
    
    推送(以及随后的弹出)是一个好主意,但是通过在转换之前将矩阵设置为identity,您可以释放之前完成的任何转换,特别是使用
    gluLookAt
    建立的查看转换。因此,只需删除此
    glLoadIdentity
    ,即可正确连接各个转换


    请始终记住,所有矩阵变换函数,如
    glTranslate
    glOrtho
    gllookat
    ,都会修改当前选择的(使用
    glMatrixMode
    )矩阵,而不只是替换它。这也是为什么您在调用
    glOrtho
    gllookat
    之前执行
    glLoadIdentity
    的原因。您的方法看起来并没有那么不合理。问题在于:

    glPushMatrix(); 
    glLoadIdentity();
    glTranslatef(0.1, 0, 0);
    
    推送(以及随后的弹出)是一个好主意,但是通过在转换之前将矩阵设置为identity,您可以释放之前完成的任何转换,特别是使用
    gluLookAt
    建立的查看转换。因此,只需删除此
    glLoadIdentity
    ,即可正确连接各个转换

    请始终记住,所有矩阵变换函数,如
    glTranslate
    glOrtho
    gllookat
    ,都会修改当前选择的(使用
    glMatrixMode
    )矩阵,而不只是替换它。这也是在调用
    glOrtho
    gllookat
    之前执行
    glLoadIdentity
    的原因