openGL转换和gluLookAt()
我有一个学习项目,它代表了简单的3D场景。我想在一些非原点绘制球体。稍后我将把它作为单独的函数或方法来实现 我使用openGL转换和gluLookAt(),opengl,Opengl,我有一个学习项目,它代表了简单的3D场景。我想在一些非原点绘制球体。稍后我将把它作为单独的函数或方法来实现 我使用gllookat()设置视点,然后使用glTranslatef()转换模型视图矩阵,并使用小偏移和绘制球体。不幸的是,没有显示球体。我对模型视图矩阵的看法正确吗 void display(void){ glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); gluLookAt(1, 0 ,1, 0, 0, 0,
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。对它的调用实际上被忽略了。应将其编码为:
gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0);
glColor3b(197, 96, 63);
glPushMatrix();
glLoadIdentity(); // why it should be there?
通过将视图矩阵归零,可以相对于原点坐标绘制对象,而不考虑glLookAt。对它的调用实际上被忽略了。应将其编码为:
因此,如果你想建立一个假想的“摄像机”,你必须将物体的位置与摄像机矩阵本身结合起来。你的方法看起来并没有那么不合理。问题在于:
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
的原因