我有一个代表简单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);
}
答案 0 :(得分:3)
不,你不是。
gluLookAt(1, 0 ,1, 0, 0, 0, 0, 1, 0);
glColor3b(197, 96, 63);
glPushMatrix();
glLoadIdentity(); // why it should be there?
通过将视图矩阵归零,您将相对于原点坐标绘制对象,不考虑glLookAt 。对它的调用实际上被忽略了。它应编码为:
因此,如果你想设置假想的“相机”,你必须将对象的位置与相机矩阵本身结合起来。
答案 1 :(得分:1)
你的做法看起来并不合理。问题出在这里:
glPushMatrix();
glLoadIdentity();
glTranslatef(0.1, 0, 0);
推送(以及后来的弹出)是一个好主意,但是通过在翻译之前将矩阵设置为标识,您将丢失之前完成的任何转换,特别是使用gluLookAt
建立的查看转换。因此,只需删除此glLoadIdentity
即可正确连接各个转换。
请务必记住,所有矩阵转换函数(例如glTranslate
,glOrtho
或gluLookat
)始终会修改当前选定的(使用glMatrixMode
)矩阵并且不要只是替换它。这也是您在调用glLoadIdentity
和glOrtho
之前执行gluLookAt
的原因。