第八讲: OpenGL的组合图形
解释程序:A02_OpenGL的基本图形——基本图形的组合:
解释GameLoop函数:
1、画飞机 二战的飞机
2、发射台
3、发射台_飞行物、 3、发射台_飞行物
4、A03_OpenGL的组合图形 4、A03_OpenGL的组合图形
5、A04_摄像漫游 5、A04_摄像漫游
这个函数用来在场景中画横竖的水平线(画地图) 函数:GLvoid baiscobj::DrawGround() 画一个平行于OpenGL场景XZ面的网状面,将它作为地面,以此观察摄像漫游效果。 这个函数用来在场景中画横竖的水平线(画地图) glBegin(GL_LINES);//场景中画横竖的水平线 for (int x = -size0; x < size0;x+=4)//x=-80到x=80,每循环一次加4 {glVertex3i(x, 0, -size0); glVertex3i(x, 0, size0);} //因为y=0,所以在xz平面上画水平竖线 for (int z = -size0; z < size0;z+=4) {glVertex3i(-size0, 0, z); glVertex3i( size0, 0, z);} //因为y=0,所以在xz平面上画水平横线 glEnd();
函数BOOL baiscobj::DisplayScene() 这个函数是:控制键盘7个键的的功能。 shift键、及四个方向键(上、下、左、右)、up键、down键的功能。
KEY_DOWN函数: 在StdAfx.h文件中: #define KEY_DOWN(vk_code)((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) //表示传入一个vk_code(健值),告诉当前是否按下该键。
gluLookAt(…)函数: 在OpenGL中观察虚拟世界的主要函数gluLookAt(…) ,它的主要的作用是可以改变我们在OpenGL场景的观察点,这个观察点就好像是我们的眼睛,也好像是我们手中的摄像机。我们在一个场景中行走时,看到前面的物景越来越近,两边的物体在向后退,这就是我们的观察点在场景中的位置改变的结果。
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 1、改变前三个参数的值可以模拟人在实际环境中的移动; // g_eye[1]固定值,g_eye[0]、g_eye[2]值由向下和向上的方向键决定。 //所以最终向上和向下的方向键模拟人在实际环境中的移动。 2、改变中间三个参数的值,可以模拟人眼的转动,即所观察场景的变化。 //g_look[1]+g_elev的值相对是固定的。 g_look[1] = g_eye[1],g_elev的值由up\down键决定 //g_look[0]\g_look[2]值向左和向右的方向键决定。g_look[0]\g_look[2]值由rad_xz决定的。
6、A05_开天辟地
6.1模拟真实场景: 可以在OpenGL场景中建立有一定真实感的天空、地面。这个地面还有起伏的山峦,在其中漫游时还有翻山越岭、爬坡过堑的视觉效果,正是做山地游戏的绝好场景。
6.2 A05_开天辟地 程序流程解释 Render函数: m_baiscobj->DisplayScene(); //键盘控制 m_baiscobj->DrawSand();//画底面 m_baiscobj->CreateSkyBox(3,6,3,6);//画前、后、左、右、顶 5个面 m_baiscobj->picter(MAP+10,0,-MAP); //画飞行物和发射台
glDrawElements函数 glDrawElements是一个OPENGL的图元绘制函数,从数组中获得数据渲染图元。 函数原型为: 函数原型为: void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); 其中: mode指定绘制图元的类型,它应该是下列值之一,GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, and GL_POLYGON. count为绘制图元的数量乘上一个图元的顶点数。 type为索引值的类型,只能是下列值之一:GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT。 indices:指向索引存贮位置的指针。
随机地面 在用双重FOR循环生成地面MAP_W * MAP_W的平面,这个平面是一个三维量,其中的高(Y分量)取随机数。并形成顶点索引和贴图索引。
代码: for (int z = 0; z < MAP_W; z++) for (int x = 0; x < MAP_W; x++) { Vertex = z * MAP_W + x; g_terrain [Vertex][0] = float(x)*MAP_SCALE; //地域数据X分量 g_terrain [Vertex][1] = h + FRAND * h; //Y分量,随机产生山的高度 g_terrain [Vertex][2] = -float(z)*MAP_SCALE;//地域数据Z分量 g_texcoord[Vertex][0] = (float) x; //索引数组x g_texcoord[Vertex][1] = (float) z; //索引数组z g_index [index++] = Vertex; //顶点数组1维 g_index [index++] = Vertex+ MAP_W; } 显示时用命令glDrawElements(...);显示由顶点数组指定的面,结果就形成了高低不平的曲面。 在这个曲面上贴上表示地面的图形,就形成了"山"。
7、A08_显示3D模型(漫游) 6、A08_显示3D模型