您好,欢迎访问一九零五行业门户网

简析OpenGL的2D、3D切换

最近做游戏的时候遇到了一个小问题,我们的游戏是2d、3d结合的(准确的说是主菜单、议会界面是2d的,但是真实打斗场景为3d),由2d切换到3d没有问题,但是由3d切换回2d问题就来了:每次切换都只有glclear()管用,其余的加载图片之类的都显示不了。经过分析感
最近做游戏的时候遇到了一个小问题,我们的游戏是2d、3d结合的(准确的说是主菜单、议会界面是2d的,但是真实打斗场景为3d),由2d切换到3d没有问题,但是由3d切换回2d问题就来了:每次切换都只有glclear()管用,其余的加载图片之类的都显示不了。经过分析感觉应该是视图矩阵的问题,因为在3d场景中我们多次调用了gllookat()、gluperspective()等函数,而每调用一次,opengl的机理是把当前矩阵乘上转换算子,所以每次都乘,到了2d场景的时候如果不转换回来就会出问题。
可以关注我的个人主页:http://alanzjl.sinaapp.com
解决这个问题有两种办法,第一种是在display()函数里通过glpushmatrix()、glpopmatrix()解决。但是我们遇到的问题是可能在display中push、pop的次数太多,导致最终这种办法不行。还有一种就是在初始状态下记录初始矩阵,在将切换回2d的时候恢复初始矩阵。
可通过
glgetintegerv(gl_viewport,&view); //viewport
glgetdoublev(gl_modelview_matrix,&model);//model
glgetdoublev(gl_projection_matrix,&proj);//projection
得到。
但是我们只要得到一次而且是第一次的矩阵就可以,所以要借助一个static int变量。具体实现代码:
void my_display(void){ static flagggg; if(flagggg==0){ //只取第一次的初始矩阵 glgetintegerv(gl_viewport,&view); //viewport glgetdoublev(gl_modelview_matrix,&model);//model glgetdoublev(gl_projection_matrix,&proj);//projection flagggg=1; } /************************************************************** 模式入口 **************************************************************/ if(enter_mode==-1) introduction(); else if(enter_mode==0) main_menu(); else if(enter_mode==1){ adventure(); //此处是3d } else if(enter_mode==2){ //此处是2d,会由上面一种模式切换到此模式,需要矩阵还原 glloadmatrixd(view); glmatrixmode(gl_modelview); glloadmatrixd(model); glmatrixmode(gl_projection); glloadmatrixd(proj); congress(); } else if(enter_mode==3) achievement(); else if(enter_mode==4) quit(); else if(enter_mode==5) complete(); /**************************************************************/}
其中,view、model、proj被我定义为了全局变量,它们是:
glint view[4];gldouble model[16];gldouble proj[16];
其它类似信息

推荐信息