版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8.3.2场景模型的构建建立了消防车的3ds模型后,我们就可以来定义一个消防车类了。消防车类中包含车 身、云梯、吊篮成员对象,这些对象通过前节介绍的3ds载入类C3DSLoader来定义。此外 我们在吊篮上安置一个消防水枪来模拟喷水效果,为此用前章定义好的粒子系统类 CparticleSys来定义一个水枪效果对象。为实现云梯的交互运动,增加了云梯水平旋转的 变量theta,和俯仰运动的变量phi。车身的运动由变量Position来控制。其消防车类的定 义如下:注:以下代码写在文件Motor.h中#include gl/glut.h”#include H3DSLoader.hH#inchide
2、Particle.hclass CMotor/消防车类( public:float Position3;车位置float theta;云梯支架旋转角float phi;云梯俯仰角定义3ds载入对象C3DSLoader m_3DSMotor;车 身C3DSLoader m_3DSSupport;云梯支架C3DSLoader m_3DSLadder;云梯C3DSLoader m_3DSBasket;篮子CParticleSys m_WaterGun;水 枪效果CMotorQ;构造函数virtual y Motor。;析构函数void Dra wMotor();绘制车void Init();初始化;
3、车身模型,云梯模型和吊篮模型的载入以及水枪的初始化通过成员函数Init来完成, 其实现形式如下:注:以下代码写在文件Motor.cpp中void CMotor: :IiutO (m_3DSMotor.Load3DSModel(H3DSModel 武警学院车身 1.3DS”); m_3DSSupport.Load3DSModel(n3DSModel 云梯支架.3ds”); m_3DSLadder.Load3DSModel(n3DSModel 云梯.3ds“); m_3DSBasket.Load3DSModelC3DSModel 吊篮.3ds“); m_WaterGiin. SetPosition
4、(0,0,0);水枪位置m_WaterGun.SetMode(0.5 JOO, 10 广 0.8 J); /粒子系统模式设置 m_Watei,Gun.Init(PI/2,PI/3); 水 枪方向消防车的绘制过程在成员函数DrawMotor中来完成,其实现形式如下: 注:以下代码写在文件Motor.cpp中 void CMotor:DrarMotor()glPusliMatiix();车身glColor3f(l .0,1.0,1.0);glRotatef(90,0.0,1.0,0.0);车的面向glScalef(1.0, 1.0, 1.0); m_3DSMotor.DrawO;旋转支架glSca
5、lef(1.0, 1.0, 1.0);glTranslatef(0.0f?73.0f,-130.0f);glRotatef(theta,0.0,1.0,0.0); 支架旋转m_3DSSupport.Draw();云梯glScalef(1.0, 1.0, 1.0);glTranslatef(0.0f?27.0f,0.0f);glRotatef(phi, 1 0?0.0,0.0);云梯俯仰m_3DSLadder.Draw();/篮glTranslatef(O.Ofr 10.0280.00;glRotatef(phi, 1.000,0.0);篮保持水平m_3DSBasket.Draw();/水枪gl
6、Translatef(0.0f,50.0f,0.0f);glScalef(5.0, 5.0, 5.0); m_Wateijiin.DrawSys();glPopMatrix();定义一个地面类Cground,其类的定义形式如下:注:以下代码写在文件Grouiid.h中#iiiclude CBMPTexture.h”class CGroimdpublic:CBMPTexture textObj;地面纹理floatlength;长度floatwidth;宽度floatheight;局度CGroiuid0();构造函数CGround(chai, file255); 构造函数virtual CGrou
7、nd();析构函数void Render0;绘制void Iiiit();初始化类Cground中通过构造函数来载入位图文件,并对成员对象textObj及其他数据进行初始化,其实现代码为:注:以下代码写在文件Ground.cpp中CGroimd: CGiound(char file255):textObj(l?file) (length=450.0f; 纵深width=450.0f; 宽height=5.Of; 高地面的纹理过程通过调用成员函数Init来实现,其实现代码为:注:以下代码写在文件Ground.cpp中 void CGroimd:Init() (textObj Texturehii
8、tO; 地面纹理由此获得的纹理名称存放在对象textObj的数据成员texture0中。定义好纹理后,就可以来绘制地面了。地面的绘制通过调用成员函数Render来实现, 其实现代码为:注:以下代码写在文件Groxuid.cpp中 void CGround: Render。 (获得场景中光照状态GLboolean Ip;glGetBooleanv(GL_LIGHTING,&lp);glDisable(GL_LIGHTING); 关闭光照/开始绘制glEnable(GL_TEXTURE_2D);/绘制地面glPusliMatiix();glTranslatef(050r10);glBindText
9、uie(GL_TEXTURE_2D, textObj.texture0); glBegin(GL_QUADS);指电纹理坐标和顶点坐标glTexCoord2f(l .0f? O.Of); gl宅rtex3f( width, heiglit, lengtli);glTexCoord2f(1.0f? l .Of); gl宅rtex3f( width, height, -length); glTexCoord2f(0.0f? l .Of); gl宅rtex3f( -width, height, -lengtli); glTexCoord2f(0.Of, O.Of); gl宅rtex3f( width
10、, height, length);glEnd();glPopMatrixO;/绘制结束if(lp)/恢复光照状态glEnable(GL_LIGHTING); 1.场景类的描述以下我们来定义一个场景类,场景类是一个组合类,其数据成员包括:一个地面对象, 一个消防车对象,一个油罐对象以及火焰对象,此外还包含相应的初始化函数和图形绘制函 数,场景类的描述如下:/注:以卜代码写在文件Scene.h中#include Wotor.1T#include Ground.h” class CScenepublic:float PI;float rad;圆周率角度(弧度)float angle;角度float
11、 Look3;观察目标点float Eye3;眼睛位置CGrotmd ground; 大地CMotor motor; 消防车CPaiticleSys m_Fire; 火焰C3DSLoader buildl;建筑物(油罐)CSceneO;构造函数CScene(char filel255); 构造函数virtual y Scene。; 析构函数void ImtO;/初始化void DrawSceneQ;绘制;带参数的构造函数主要对类Cscene对象的属性进行初始化,其实现形式如下: 注:以下代码写在文件Scene.cpp中CScene: :CScene(char file 1 255): gi-o
12、und(file 1)angle=-90.0;PI=3.14159;rad=float(PI*aiigle/l 80.0);Eyel=30.0;Eye2=300.0;观察目标点的位置Look0=0.0;Lookl=30.0;Look =0.0;motor.Position0=Eye0; /消防车的位置 motor.Position 1 =0;motor.Position2=Eye2;而成员函数Init主要对类Cscene中内嵌对象ground, motor m_Fire和buildl的纹 理映射进行初始化,其实现形式取下:注:以卜代码写在文件Scene.cpp中void CScene: :In
13、itOmotor.InitO; gi-ound.Iiiit();buildl.Load3DSModelC3DSModel 卧式油罐.3DS,火焰设置m_Fire.SetPosition(200.0,63.0,0.0);m_Fire.SetMode(20,50,10,0.0,0);m_Fire.Init(PI/2,0);成员函数DrawScene主要完成类Cscene中各个内嵌对象的绘制工作,实现形式为:注:以卜代码写在文件Scene.cpp中void CScene:DrawSceneO(消防车随控制键运动,位置更新motor.Position0=Eye0;motor.Position 1 =1
14、0;motor.Position2=Eye2;地面glPusliMatiix();glColor3f(l.0,1.0,1.0);改变颜色ground.Render();glPopMatiix();火焰glPusliMatiix();glColor3f(l .0,1.0,1.0);/改变颜色m_F ire. DrawSysO ;glPopMatiix();建筑物glPusliMatiix();glColor3Rl.0,1.0,1.0);glTranslatef(200.0,30.000);glScalef(1.0,1.0,1.0);buildl.DiawO;绘制建筑物glPopMatiix();
15、消防车(整体)glPusliMatiix();设消防车位置glTranslatef(motor. PositionfO motor.Positionl 1 Lmotor.Position2);glRotatef(angle)0.0,1.0,0.0);glScalef(020.2,0.2);motor. Dra wMotorQ;绘制消防车glPopMatrixO;8.3.3初始化场景在三维场景的初始化中,主要涉及相关库文件的包含,窗II的大小,场景的大小,场 景对象的定义,以及光照效果设置等,其代码如下:/注:以下代码写在文件maiii.cpp中#include #include #includ
16、e HScene.hHGLint screen Width=800; 窗 口 宽GLint screenHeight=600; 窗I 高GLint scene Width=450;场景横宽GLint sceneLength=450;场景纵深GLfloat m_width; 记录窗 口大小GLfloat m_height;场景所浦位图文件路径chai g_filepathl255=(ndata/detail.BMPH); 地面纹理图片场景寸象定义CScene scene(g_filepath);const float PI=3.1415926;场景光照效果设置在函数Light完成,实现形式为:注
17、:以下代码写在文件main.cpp中void Light(void)(GLfloat ambientLight=(0.3f,0.3f,0.3f,1.0f);GLfloat diffiiseLight=1 .Of, 1 .Of, 1 .Of, 1 .Of);GLfloat specular=(1.0f51 .Of, 1 .Of, 1 .Of;GLfloat liglitPos=1.0f51 .Of, 1 .Of,O.Of;/创建光源glLightfV(GL_LIGHT 1,GL_AMBIENT,ambientLight); 设置光为环境光。glLightfV(GL_LIGHTl ,GL_DIFF
18、USE0fftiseLight); 设置漫射光 glLightfV(GL_LIGHTl ,GL_POSmON,lightPos); 设置光源位置 选择光照感 一GLfloat liiiodel_ambient = 0.4, 0.4, 0.4, 1.0 );GLfloat local_view = ( 0.0 );glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);glLightModelfv(GL_LIGHT_MODEL_LOCAL_TEWER,local_view);glEnable(GL_LIGHTING);glEnable(GL_L
19、IGHTl);glEnable(GL_COLOR_MATERIAL);/Z激活光照的情况卜用glColor函数给物 体上色以上光照设置函数和场景对象scene的初始化通过以下函数来调用:void InitQglClearColor(0.2, 0.2,0.2,1.0); 背景颜色 glShadeModel(GL_SMOOTH);glEnable(GL_DEPTH_TEST); 启动深度测试glD epthFunc(GL_LE SS);启动裁剪LightO;场景灯光scene.Init();场景初始化8.3.4键盘交互实现程序中UP、DOWN、LEFT和RIGHT键的回调函数实现形式如下: 注:以
20、下代码写在文件main.cpp中 void Contiol(GLiiit specialKeyGLmt xMouse.GLint yMouse) ( switch(specialKey) ( case GLUT_KEY_LEFT:/leftscene.rad=float(scene.PI*scene.angle/180.0); scene.angle1; scene.Look0=float(scene.Eye0-rl000*cos(scene.rad);实现转向 scene.Look2=float(scene.Eye2-rl000*siii(scene.rad); break; case GL
21、UT_KEY_RIGHT:Z/riglitscene.rad=float(scene.PI*scene.angle/180.0); scene.angle+=l; scene.Look0=float(scene.Eye0-rl000*cos(scene.rad); scene.Look2=float(scene.Eye2-rl000*siii(scene.rad); break; case GLUT_KEY_DOWN:/downscene.rad=float(scene.PI*scene.angle/180.0); scene.Eye 2-=(float)sin(scene.rad)*l .0
22、;实现向后运动scene.EyeO(float)cos(scene.rad)* 1.0; if(scene.EyeOscene Width|scene.EyeOsceneLengtli |i scene.Eye2scene Width|scene.EyeOsceneLength|scene.Eye2键scene.motor.theta-=5; /云梯支架向右旋转 break;case 8:scene.motor.phi+=5; 云梯支架俯仰旋转 if(scene.motor.phi0) scene.motor.phi=0; break;case 2:scene.motor.phi-=5;if(
23、scene.motor.phi-90) scene.motor.phi=-90; break;case a1:glutFullScreen(); 全屏现实 break;case Y: glutPositionWiiidow( 100,100);glutReshapeWmdow(screenWidth, screenHeiglit);break;case 27:按 ESC 键exit(O); /退出系统break;default:break;上面函数中除实现交互功能外,还增加了按键a, r和ESC的响应过程,按a和r键分 别实现全屏显示和恢复窗I大小,按ESC键来退出系统。8.3.5多视口的实现
24、场景中通过设置两个摄像机(即设置两个gluLookAt函数)来实现窗II多视II效果, 其中一个主视口的大小与窗I大小一致,而子视1位于主窗佐下角,大小是主视门的四分 之一,并都采用透视投影方式,其代码实现如下:注:以下代码写在文件main.cpp中void RenderScene(void)(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadldentityO;fbr(int i=0;i2;i+)(lf(i=l)/ 子视口glEnable(GL_SCISSOR_TEST);glScissor(0,O,m_width/4 1 ,m
25、_height/4 1);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glDisable(GL_SCISSOR_TEST);grviewport(0Qm_width,4.1 ,m_height/4 1);glMatnxMode(GL_PROJECTION);glLoadldentityO;gluPerspective(45 .Of,(GLfloat)m_width/(GLfloat)m_heightOf, 1000.Of);glMatnxMode(GL_MODELTEW);glLoadldentityO;gluLookAt(0,scene.Eyel,0,/摄像机固定在场景中央,会跟踪消防车 scene.EyeO,scene.Eyel ,scene.Eye2,0.0,1.000);scene.DrawScene();else/主视口grviewport(0,0,(GLsizei)m_width,(GLsizei)m_height);glMatnxMode(GL_PROJECTION);glLoadldentityO;ghiPei*spective(45.0?(GLfloat)m_width/(GLfloat)m_height? 1.0,1000.0); gl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护士基础护理个人述职
- 职业生涯规划的自我监控
- 学会谈判做销冠
- 兽药课件下载
- 案例研究-广西大学文化素质教育基地
- 财务共享服务中心自建与外包的选择
- 2025年部门预算支出经济分类科目修订前后对比表
- 小学体育课件下载
- 健康幼儿园课件
- 广东省佛山市南海区2024-2025学年高一上学期学业水平测试(12月)数学试题 含解析
- DDI-目标选才经典
- 2023年注册验船师职业资格考试大纲
- EPC总承包项目管理组织方案(投标)
- 餐厅包厢改造报价清单
- 占用、挖掘城市道路审批
- XX集团公司供应商管理办法
- GB/T 12579-2002润滑油泡沫特性测定法
- 诺如病毒(同名315)课件
- 火山成因矿床课件
- 消防主机操作规范课件
- 体态与健康1剖析课件
评论
0/150
提交评论