欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    虚拟现实技术基础与应用代码8 综合实例.docx

    • 资源ID:12954207       资源大小:20.28KB        全文页数:18页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    虚拟现实技术基础与应用代码8 综合实例.docx

    1、虚拟现实技术基础与应用代码8 综合实例8.3.2 场景模型的构建 建立了消防车的3ds模型后,我们就可以来定义一个消防车类了。消防车类中包含车身、云梯、吊篮成员对象,这些对象通过前节介绍的3ds载入类C3DSLoader来定义。此外我们在吊篮上安置一个消防水枪来模拟喷水效果,为此用前章定义好的粒子系统类CparticleSys来定义一个水枪效果对象。为实现云梯的交互运动,增加了云梯水平旋转的变量theta,和俯仰运动的变量phi。车身的运动由变量Position来控制。其消防车类的定义如下:/注:以下代码写在文件Motor.h中#include gl/glut.h#include 3DSLoa

    2、der.h#include 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; /水枪效果 CMotor(); /构造函数 virtual CMotor()

    3、; /析构函数 void DrawMotor(); /绘制车 void Init(); /初始化;车身模型,云梯模型和吊篮模型的载入以及水枪的初始化通过成员函数Init来完成,其实现形式如下:/注:以下代码写在文件Motor.cpp中void CMotor:Init() m_3DSMotor.Load3DSModel(3DSModel武警学院车身1.3DS); m_3DSSupport.Load3DSModel(3DSModel云梯支架.3ds); m_3DSLadder.Load3DSModel(3DSModel云梯.3ds); m_3DSBasket.Load3DSModel(3DSMod

    4、el吊篮.3ds); m_WaterGun.SetPosition(0,0,0); /水枪位置 m_WaterGun.SetMode(0.5,100, 10,-0.8,1); /粒子系统模式设置 m_WaterGun.Init(PI/2,PI/3); /水枪方向 消防车的绘制过程在成员函数DrawMotor中来完成,其实现形式如下: /注:以下代码写在文件Motor.cpp中void CMotor:DrawMotor() glPushMatrix(); /车身 glColor3f(1.0,1.0,1.0); glRotatef(90,0.0,1.0,0.0); /车的面向 glScalef(1

    5、.0, 1.0, 1.0); m_3DSMotor.Draw(); /旋转支架 glScalef(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(0.0f,-10.0f,28

    6、0.0f); glRotatef(-phi,1.0,0.0,0.0); /篮保持水平 m_3DSBasket.Draw(); /水枪 glTranslatef(0.0f,50.0f,0.0f); glScalef(5.0, 5.0, 5.0); m_WaterGun.DrawSys(); glPopMatrix();定义一个地面类Cground,其类的定义形式如下:/注:以下代码写在文件Ground.h中 #include CBMPTexture.hclass CGround public: CBMPTexture textObj; /地面纹理 float length; /长度 float

    7、width; /宽度 float height; /高度 CGround(); /构造函数 CGround(char file255); /构造函数 virtual CGround(); /析构函数 void Render(); /绘制 void Init(); /初始化; 类Cground中通过构造函数来载入位图文件,并对成员对象textObj及其他数据进行初始化,其实现代码为:/注:以下代码写在文件Ground.cpp中 CGround:CGround(char file255):textObj(1,file) length=450.0f; /纵深 width=450.0f; /宽 hei

    8、ght=5.0f; /高地面的纹理过程通过调用成员函数Init来实现,其实现代码为:/注:以下代码写在文件Ground.cpp中void CGround:Init() textObj.TextureInit(); /地面纹理由此获得的纹理名称存放在对象textObj的数据成员texture0中。定义好纹理后,就可以来绘制地面了。地面的绘制通过调用成员函数Render来实现,其实现代码为:/注:以下代码写在文件Ground.cpp 中void CGround:Render() /获得场景中光照状态 GLboolean lp; glGetBooleanv(GL_LIGHTING,&lp); glD

    9、isable(GL_LIGHTING); /关闭光照 / 开始绘制 glEnable(GL_TEXTURE_2D); /绘制地面 glPushMatrix(); glTranslatef(0,0,-10); glBindTexture(GL_TEXTURE_2D, textObj.texture0); glBegin(GL_QUADS); /指定纹理坐标和顶点坐标 glTexCoord2f(1.0f, 0.0f); glVertex3f( width, height, length); glTexCoord2f(1.0f, 1.0f); glVertex3f( width, height, -

    10、length); glTexCoord2f(0.0f, 1.0f); glVertex3f( -width, height, -length); glTexCoord2f(0.0f, 0.0f); glVertex3f( -width, height, length); glEnd(); glPopMatrix(); /绘制结束 if(lp) / 恢复光照状态 glEnable(GL_LIGHTING);1.场景类的描述以下我们来定义一个场景类,场景类是一个组合类,其数据成员包括:一个地面对象,一个消防车对象,一个油罐对象以及火焰对象,此外还包含相应的初始化函数和图形绘制函数,场景类的描述如下

    11、:/注:以下代码写在文件Scene.h中#include Motor.h#include Ground.h class CScene public: float PI; /圆周率 float rad; /角度(弧度) float angle; /角度 float Look3; /观察目标点 float Eye3; /眼睛位置 CGround ground; /大地CMotor motor; /消防车 CParticleSys m_Fire; /火焰 C3DSLoader build1; /建筑物(油罐)CScene(); /构造函数 CScene(char file1255); /构造函数 v

    12、irtual CScene(); /析构函数void Init(); /初始化 void DrawScene(); /绘制;带参数的构造函数主要对类Cscene对象的属性进行初始化,其实现形式如下:/注:以下代码写在文件Scene.cpp中CScene:CScene(char file1255):ground(file1) angle=-90.0; PI=3.14159; rad=float(PI*angle/180.0); Eye0=0.0; /眼睛前方65个单位的位置 Eye1=30.0; Eye2=300.0; Look0=0.0; /观察目标点的位置 Look1=30.0; Look2

    13、=0.0; motor.Position0=Eye0; /消防车的位置 motor.Position1=0; motor.Position2=Eye2;而成员函数Init主要对类Cscene中内嵌对象ground,motor,m_Fire和build1的纹理映射进行初始化,其实现形式取下:/注:以下代码写在文件Scene.cpp中void CScene:Init() motor.Init(); ground.Init(); build1.Load3DSModel(3DSModel卧式油罐.3DS);/火焰设置 m_Fire.SetPosition(200.0,63.0,0.0); m_Fire

    14、.SetMode(20,50,10,0.0,0); m_Fire.Init(PI/2,0);成员函数DrawScene主要完成类Cscene中各个内嵌对象的绘制工作,实现形式为: /注:以下代码写在文件Scene.cpp中void CScene:DrawScene() /消防车随控制键运动,位置更新 motor.Position0=Eye0; motor.Position1=10; motor.Position2=Eye2; /地面 glPushMatrix(); glColor3f(1.0,1.0,1.0); /改变颜色 ground.Render(); glPopMatrix(); /火焰

    15、 glPushMatrix(); glColor3f(1.0,1.0,1.0); /改变颜色 m_Fire.DrawSys(); glPopMatrix(); /建筑物 glPushMatrix(); glColor3f(1.0,1.0,1.0); glTranslatef(200.0,30.0,0.0); glScalef(1.0,1.0,1.0); build1.Draw(); /绘制建筑物 glPopMatrix(); /消防车(整体) glPushMatrix(); /设消防车位置 glTranslatef(motor.Position0,motor.Position1,motor.P

    16、osition2); glRotatef(-angle,0.0,1.0,0.0); glScalef(0.2,0.2,0.2); motor.DrawMotor(); /绘制消防车 glPopMatrix();8.3.3初始化场景在三维场景的初始化中,主要涉及相关库文件的包含,窗口的大小,场景的大小,场景对象的定义,以及光照效果设置等,其代码如下:/注:以下代码写在文件main.cpp中#include #include #include Scene.h GLint screenWidth=800; /窗口宽GLint screenHeight=600; /窗口高GLint sceneWidt

    17、h=450; /场景横宽GLint sceneLength=450; /场景纵深GLfloat m_width; /记录窗口大小GLfloat m_height; /场景所需位图文件路径char g_filepath1255=data/detail.BMP; /地面纹理图片/场景对象定义CScene scene(g_filepath); const float PI=3.1415926;场景光照效果设置在函数Light完成,实现形式为: /注:以下代码写在文件main.cpp中void Light(void) GLfloat ambientLight=0.3f,0.3f,0.3f,1.0f;

    18、GLfloat diffuseLight=1.0f,1.0f,1.0f,1.0f; GLfloat specular=1.0f,1.0f,1.0f,1.0f; GLfloat lightPos=1.0f,1.0f,1.0f,0.0f; /创建光源 glLightfv(GL_LIGHT1,GL_AMBIENT,ambientLight); /设置光为环境光。 glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuseLight); /设置漫射光 glLightfv(GL_LIGHT1,GL_POSITION,lightPos); /设置光源位置 /选择光照模型 GLfloat

    19、lmodel_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_VIEWER, local_view); glEnable(GL_LIGHTING); glEnable(GL_LIGHT1); glEnable(GL_COLOR_MATERIAL);/激活光照的情况下用glColor函数给物体上色以上光照设置函数和场景对象scene的初始化通过以下

    20、函数来调用:void Init() glClearColor(0.2, 0.2, 0.2, 1.0); /背景颜色 glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); /启动深度测试 glDepthFunc(GL_LESS); /启动裁剪 Light(); /场景灯光 scene.Init(); /场景初始化8.3.4键盘交互实现程序中UP、DOWN、LEFT和RIGHT键的回调函数实现形式如下:/注:以下代码写在文件main.cpp中void Control(GLint specialKey,GLint xMouse,GLint yMouse)

    21、 switch(specialKey) case GLUT_KEY_LEFT: /left scene.rad=float(scene.PI*scene.angle/180.0); scene.angle-=1; scene.Look0=float(scene.Eye0+1000*cos(scene.rad); /实现转向 scene.Look2=float(scene.Eye2+1000*sin(scene.rad); break; case GLUT_KEY_RIGHT: /right scene.rad=float(scene.PI*scene.angle/180.0); scene.a

    22、ngle+=1; scene.Look0=float(scene.Eye0+1000*cos(scene.rad); scene.Look2=float(scene.Eye2+1000*sin(scene.rad); break; case GLUT_KEY_DOWN: /down scene.rad=float(scene.PI*scene.angle/180.0); scene.Eye2-=(float)sin(scene.rad)*1.0; /实现向后运动 scene.Eye0-=(float)cos(scene.rad)*1.0; if( scene.Eye0sceneWidth |

    23、scene.Eye0sceneLength | scene.Eye2sceneWidth | scene.Eye0sceneLength|scene.Eye2-sceneLength) scene.Eye2-=(float)sin(scene.rad)*1.0; /一旦进入障/碍区域取消这次运动,等于不能进入障碍区域 scene.Eye0-=(float)cos(scene.rad)*1.0; scene.Look0=float(scene.Eye0+1000*cos(scene.rad); scene.Look2=float(scene.Eye2+1000*sin(scene.rad); b

    24、reak; default: break; 其他数字键和符号键的回调函数为:/注:以下代码写在文件main.cpp中 void keyboard(unsigned char key,int x,int y) switch(key) case f: /着火 scene.m_Fire.fire=!scene.m_Fire.fire; break; case g: /水枪发射 scene.motor.m_WaterGun.fire=!scene.motor.m_WaterGun.fire; break; /云梯运动控制 case 4: / 键 scene.motor.theta-=5; /云梯支架向

    25、右旋转 break; case 8: scene.motor.phi+=5; /云梯支架俯仰旋转 if(scene.motor.phi0) scene.motor.phi=0; break; case 2: scene.motor.phi-=5; if(scene.motor.phi-90) scene.motor.phi=-90; break; case a: glutFullScreen(); /全屏现实 break; case r: glutPositionWindow(100,100); glutReshapeWindow(screenWidth,screenHeight); brea

    26、k; case 27: /按ESC键 exit(0); / 退出系统 break; default: break; 上面函数中除实现交互功能外,还增加了按键a,r和ESC的响应过程,按a和r键分别实现全屏显示和恢复窗口大小,按ESC键来退出系统。8.3.5多视口的实现场景中通过设置两个摄像机(即设置两个gluLookAt函数)来实现窗口多视口效果,其中一个主视口的大小与窗口大小一致,而子视口位于主窗口左下角,大小是主视口的四分之一,并都采用透视投影方式,其代码实现如下: /注:以下代码写在文件main.cpp中 void RenderScene(void) glClear(GL_COLOR_B

    27、UFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); for(int i=0;i2;i+) if (i=1) /子视口 glEnable(GL_SCISSOR_TEST); glScissor(0,0,m_width/4-1,m_height/4-1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); glViewport(0,0,m_width/4-1,m_height/4-1); glMatrixMode(GL_PROJECTION); glLoadIdentity();


    注意事项

    本文(虚拟现实技术基础与应用代码8 综合实例.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开