上次交的旋转三角形有画面闪的问题,当时就注意到了,不过做好的时候已经要交总结了,就没改。
这周查了下,是MFC自带的窗口重绘和OpenGL的重绘冲突的原因。需要重载MFC视图类里面的EraseBkgnd窗口重回函数,让它直接返回TRUE,这样每次MFC响应自己的窗口重绘函数的时候就都会重绘而直接返回TRUE了。还有个问题就是在OpenGL与MFC整合的设定系统像素格式的过程中,不能打开GDI的支持,否则也会出现画面闪烁的不兼容情况。
这周没有进行理论的学习,就研究了下学OpenGL做3D游戏里面的那个漫游的代码,自己做了一个差不多的,贴图还没加上不过。
通过做这个小程序对3D游戏的实现有了一定的理解,基本上第一视角的游戏就是这样实现的吧。走动的时候只是变换相机和焦点的坐标,上楼梯也就是把坐标抬高而已,所谓的固定大小的房间也就是正好把相机坐标限定在一个范围内并且在范围的边界加上一个墙壁的模型而已,感觉没以前那么神秘了。坐标随着地形坐标而上升下降,也就实现了翻山越岭的效果。
设置摄像机:
OpenGL中变换摄像机位置、朝向、视野旋转
void gluLookAt(Gldouble相机x坐标,GLdouble相机y坐标,GLdouble相机z坐标,
GLdouble 相机焦点x坐标,GLdouble相机焦点y坐标,GLdouble相机焦点z坐标,
GLdouble 相机法线x分量,GLdouble相机法线y分量,GLdouble相机法线z分量);
首先设置了表示摄像机位置和表示焦点坐标的两个数组,分别初始化,按上下的时候分别改变两个数组中xy坐标的值,按PgUp和PgDown的时候改变Z轴的值,这里有一个不太理解,为什么学OpenGL做3D游戏里面的代码都是用Y轴的坐标表示高度的?我是按照Z轴为高度来做的,目前也没发现什么问题…
按左右键来“转头”这个就有点麻烦了,麻烦都在数学上,我本来想着是相机不动焦点改变坐标,或者反过来,但是数学上不知道怎么算…
如果可以让glRotate的原点变成相机的坐标,以相机为原点来旋转场景就很方便了,但是不知道怎么实现…感觉如果用矩阵的变换可以实现,这个再想想。
总之现在还是用的代码里的方法,设定一个旋转角度,同时移动的时候也要把角度算进去。