我在(0,0)有一个赛车抽签并且设置了一些障碍但是现在我的主要关注点是从glPerspective切换到glOrtho,反之亦然。当我从透视切换到正射时,我得到的只是黑屏。
void myinit(){
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60,ww/wh,1,100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(-5,5,3,backcarx,topcarx,0,0,0,1);
}
void menu(int id){
/*menu selects if you want to view it in ortho or perspective*/
if(id == 1){
glClear(GL_DEPTH_BUFFER_BIT);
glViewport(0,0,ww,wh);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2,100,-2,100,-1,1);
glMatrixMode(GL_MODELVIEW);
glutPostRedisplay();
}
if(id == 2){
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60,ww/wh,1,100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
viewx = backcarx - 10;
viewy = backcary - 10;
gluLookAt(viewx,viewy,viewz,backcarx,topcarx,0,0,0,1);
}
}
我尝试过使用清晰的深度缓冲区但仍无法正常工作。
答案 0 :(得分:2)
你的心理障碍在于:
void myinit(){ glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60,ww/wh,1,100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(-5,5,3,backcarx,topcarx,0,0,0,1); }
OpenGL 未初始化!是的,只是偶尔进行操作,比如加载纹理。但一般来说OpenGL是一个基于状态的绘图系统。这意味着,您在使用之前就已经设置了所有与绘图相关的内容。 “myinit”函数中的代码实际上属于显示功能。一旦你有了它,切换就变得微不足道了:根据变量的值设置一个枚举变量并在绘图之前设置正确的投影。
作为一般规则:OpenGL绘图操作 - 设置转换状态属于该组操作 - 仅属于绘图代码。因此,你的“菜单”功能毫无意义。这是一个事件处理程序。事件处理程序处理输入,它们不生成输出。在事件处理程序中,您可以更改变量的值,然后标记要执行的输出。
typedef enum ProjectionType_t { Ortho, Perspective } ProjectionType;
ProjectionType projection;
void onMenu(int entry)
{
swtich(entry) {
case ...:
projection = Ortho; break;
case ...:
projection = Perspective; break;
}
glutPostRedisplay();
}
void display(void)
{
glClear(...);
glViewport(...);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
switch(projection) {
case Ortho:
glOrtho(...); break;
case Perspective:
gluPerspective(...); break;
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
...
}