1

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

我正在使用设置观点,gluLookAt()然后我正在使用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);
}
4

2 回答 2

3

不,你不是。

gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0); 
glColor3b(197, 96, 63);    
glPushMatrix(); 
glLoadIdentity(); // why it should be there?

通过将视图矩阵归零,您将相对于原点坐标绘制对象,而不考虑您的 glLookAt。对它的调用实际上被忽略了。它应该被编码为:

  1. 设置“相机矩阵”
  2. 将矩阵推入堆栈
  3. 平移到对象的位置
  4. 绘制对象
  5. 弹出并返回 2。

因此,如果要设置假设的“相机”,则必须对象的位置与相机矩阵本身结合起来。

于 2013-02-28T13:02:16.020 回答
1

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

glPushMatrix(); 
glLoadIdentity();
glTranslatef(0.1, 0, 0);

推送(以及后来的弹出)是一个好主意,但是通过在转换之前将矩阵设置为恒等式,您会丢失之前完成的任何转换,特别是使用gluLookAt. 因此,只需删除它glLoadIdentity即可正确连接各个转换。

始终牢记所有矩阵变换函数,例如glTranslate, glOrtho,或gluLookat始终修改当前选择的 (with glMatrixMode) 矩阵,而不仅仅是替换它。glLoadIdentity这也是您在调用glOrthoand之前执行 a 的原因gluLookAt

于 2013-02-28T13:06:57.787 回答