1、第 1 页 共 10 页天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名 学号 专业 计算机科学与技术班级 实验项目课程名称 计算机图形学 课程代码实验时间 实验地点 计算机软件实验室批改意见 成绩教师签字: 实验目的:1. 采用 glut 创建图形窗口和实现人机交互功能。2. 情节合理,交互操作简便灵活,动作过程平滑、真实。实验内容:1、 设计一主题场景2、 场景中包括地形、天空和人物造型。3、 至少实现人物沿着地形行走的动作。4、 实现行走运动过程中的碰撞检测(可选做) 。5、 实现交互式场景的浏览。第 2 页 共 10 页实验过程记录虚拟校园漫游设计流程:模块设计公共基础模块
2、:提供场景视角变换,基本数学算法。提供读入 INI 文件接口。场景设计模块设计场景模型、地形布局。设计地形,计算地形高度。文件、资源管理模块:向上提供模型、图片、纹理载入接口。输入系统模块:管理输入设备,提供交互系统接口。对象管理模块:管理静态动态实体,渲染图形。控制动态实体动作。设计相关操作。设计碰撞检测,漫游算法。主要类的属性和方法的功能说明class Ccamera 摄像机类Milkshape 3d 实景照片.3d.ms3d 场景数据 纹理材质OpenGL 开发工具漫游功能在 VS2008 中制作虚拟校园漫游系统第 3 页 共 10 页static CCamera *m_pCamera;
3、float dist_to_role; 到英雄的矩离vector3d position; 摄像机的位置vector3d role_pos; 英雄的位置float direction; 旋转角度float pitch; 倾斜int va;视角模式int vm; 旋转模式void FrameMove(void); 根据当前摄像机的位置角度变换矩阵void Update(void); 更新摄像的参数,把它放到主循环中class CTerrain地形类unsigned int m_nWidth; 地形大小为m_iWidth*m_iWidthshort* heightMap; 动态高程映射 定义地形高度
4、、为m_iWidth*m_iWidth矩阵unsigned int m_nCellWidth; 每个格子的宽度CTexture terrainTex; 地形上的多重纹理void Render(void);插值计算地形高度并渲染BOOL Init(int _width,char* TexFile);初始化高程映射和多重纹理class CKeyboard键盘类BOOL KeyDown(int key); key键是否按下BOOL Update();更新键盘数据,放在主循环中class CMouse鼠标类BOOL ButtonDown(int button) 鼠标某键是否按下,0-左键,1-右键;/
5、void GetMovement(int 获得光标坐标变化SPoint2 GetMousePos();获得光标位置void setmousepos(int dx, int dy) 设置光标位置int GetWheelState();获得鼠标滚轮状态BOOL Update();更新鼠标参数struct SActiveObjPro动态实体的信息结构void ChangeCurrFrame();改变当前帧Update() 更新实体的信息结构class Object游戏实体类的基类float r1,r2;包围盒的半径,分别是 x,y 上的分量class CActiveObj:public Object
6、 游戏中的活动实体BOOL IsArrive(void);是否到达目的地void SetActive(BOOL _active) 设定人物动作第 4 页 共 10 页class CRole:public CActiveObj 游戏中的人物virtual void EndRender(void);渲染后操作virtual void OnRender(void)渲染人物说明类的继承关系功能函数的流程图这里主要列举了几个功能的流程图:1.声音播放函数:Play(DWORD loop)if( bEnable=FALSE | !DSSoundFX ) return;DWORD *Status1=NULL
7、;if( (DSSoundFX-GetStatus(Status1)!=DS_OK ) goto _next;if( (*Status1 _next:DSSoundFX-SetCurrentPosition(0);if( loop=-1 ) loop=DSBPLAY_LOOPING; /循环播放DSSoundFX-Play(0,0,loop);声音播放功能函数的流程图:2.用鼠标实现输入功能的函数:Update()if (FAILED(m_pDIDev-GetDeviceState(sizeof(DIMOUSESTATE), if (FAILED(m_pDIDev-GetDeviceState
8、(sizeof(DIMOUSESTATE), 第 6 页 共 10 页m_sMousePos.x+=m_state.lX;m_sMousePos.y-=m_state.lY;if(m_sMousePos.xm_iWidth)m_sMousePos.x=m_iWidth;if(m_sMousePos.ym_iHeight)m_sMousePos.y=m_iHeight;return TRUE;用鼠标实现输入功能的流程图:3. 3d 图片文件的显示功能的函数:Render()glEnable(GL_TEXTURE_2D);glColor3f(1.f,1.f,1.f);int triangleInd
9、ex;int index;for (unsigned short i = 0; i GetCameraPos(texture.Bind(0);glDisable(GL_DEPTH_TEST);glEnable(GL_TEXTURE_2D);glPushMatrix();glTranslatef(m_sCameraPos.x,-40,m_sCameraPos.z-CCamera:GetCameraPointer()-GetDestToRole();glRotatef(yrot,0.f,1.f,0.f);glColor3f(1.f,1.f,1.f);glBegin(GL_TRIANGLE_FAN)
10、;glTexCoord2f(0.5,0.5);第 8 页 共 10 页glVertex3f(0,300,0);glTexCoord2f(0,0);glVertex3f(-300,0, 300);glTexCoord2f(1,0);glVertex3f(-300,0,-300);glTexCoord2f(1,1);glVertex3f( 300,0,-300);glTexCoord2f(0,1);glVertex3f( 300,0, 300);glTexCoord2f(0,0);glVertex3f(-300,0, 300);glEnd();glPopMatrix();glDisable(GL_
11、TEXTURE_2D);glEnable(GL_DEPTH_TEST);yrot += 0.04f;if(yrot 360.0f)yrot -= 360.0f;游戏场景天空的场景显示的流程图:5. 消息处理功能函数:Run()if(GetMsgNum()IsPlay()CMusic:GetSysMusic()-Stop();CMusic:GetSysMusic()-LoadMusic(m_dQueue0.str1);第 9 页 共 10 页CMusic:GetSysMusic()-Play();Delete();break;case MSG_STOP_MUSIC:if(CMusic:GetSy
12、sMusic()-IsPlay()CMusic:GetSysMusic()-Stop();Delete();break;case MSG_PAUSE_MUSIC:if(CMusic:GetSysMusic()-IsPlay()CMusic:GetSysMusic()-Pause();Delete();break;case MSG_RESUME_MUSIC:if(!CMusic:GetSysMusic()-IsPlay()CMusic:GetSysMusic()-Resume();Delete();break;case MSG_FADE:GUIMgr:GetSysGUIMgr()-BeginFa
13、de();Delete();break;case MSG_PLAYAVI:SceneMgr:GetSysSceneMgr()-SetScene(SCE_AVI);SceneMgr:GetSysSceneMgr()-LoadIni(m_dQueue0.str1,m_dQueue0.str2);Delete();break;case MSG_TITLE:SceneMgr:GetSysSceneMgr()-SetScene(SCE_TITLE);SceneMgr:GetSysSceneMgr()-LoadIni(m_dQueue0.str1,m_dQueue0.str2);Delete();brea
14、k;case MSG_SELCHAR:SceneMgr:GetSysSceneMgr()-SetScene(SCE_SELCHAR);SceneMgr:GetSysSceneMgr()-LoadIni(m_dQueue0.str1,m_dQueue0.str2);Delete();break;case MSG_OPENAIR:SceneMgr:GetSysSceneMgr()-SetScene(SCE_OPENAIR);SceneMgr:GetSysSceneMgr()-LoadIni(m_dQueue0.str1,m_dQueue0.str2);Delete();break;第 10 页 共 10 页case MSG_EXIT:PostQuitMessage(0);Delete();break;消息处理功能的流程图: