《OpenSceneGraph庄园场景漫游》实验报告_第1页
《OpenSceneGraph庄园场景漫游》实验报告_第2页
《OpenSceneGraph庄园场景漫游》实验报告_第3页
《OpenSceneGraph庄园场景漫游》实验报告_第4页
《OpenSceneGraph庄园场景漫游》实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安科技大学OpenSceneGraph庄园场景漫游 实验报告 院. 系(部) 计算机科学与技术学院 专业及班级 信息与计算科学1202班 姓 名 王 涛 学 号 1 2 0 8 0 6 0 2 2 5 日 期 2014/12/18 1. 实验目的:掌握OSG引擎的基本场景构建,并在完整的三位模型场景下实现基本的场景漫游,碰撞检测,光照模型等功能2. 实验要求:基本功能要求 完整的三维场景(模型格式不限) 室内:宿舍、教室、礼堂、家里 【附加】窗户玻璃 室外:广场、操场、树林、喷泉. 【附加】天空 综合应用各功能节点、回调功能 开关节点、空间变换节点(自动变换)、LOD 【附加】回调功能实现场景中的小动画:风扇转动、显示器 简单文字信息显示 标题、场景信息、抒情 自定义漫游器 合理的初始视点位置:场景中心地面 键盘按键(如:ADWS)控制视点“左右上下” 移动 【附加】鼠标控制(如:左键拖拽)视点“左右旋转” 【附加*】视点位置信息实时更新显示 【附加*】简单漫游碰撞检测开始3. 详细设计:结束将模型添加到场景并优化读取地形模型文件读取其他模型文件读取天空模型文件将漫游器加入场景创建状态事件创建Viewer对象 【1】.实验平台:Windows 8.1 64位专业版运行内存8GBOSG版本3.0.1(OpenSceneGraph-3.0.1-VS10.0.30319-x86-release-12741)VS版本:VS20103dmax版本:3dmax2010【2】.实验步骤及关键代码:(1) 模型修改部分:利用3dmax将已有的模型进行对象合并,减少对象个数减少模型文件的顶点数目对模型进行贴图整理使部分(丢失了桶跟数目的贴图)(2) 程序实现部分:/ 把漫游器添加到场景中TravelManipulator *TravelManipulator:TravelToScence(osg:ref_ptr viewer)TravelManipulator* camera = new TravelManipulator;viewer-setCameraManipulator(camera);camera-m_pHostViewer = viewer;return camera;/ 得到矩阵osg:Matrixd TravelManipulator:getMatrix(void)constosg:Matrixd mat;mat.makeRotate(m_vRotation._v0, osg:Vec3(1.0f, 0.0f, 0.0f), m_vRotation._v1, osg:Vec3(0.0f, 1.0f, 0.0f), m_vRotation._v2, osg:Vec3(0.0f, 0.0f, 1.0f);return mat * osg:Matrixd:translate(m_vPosition); / 得到逆矩阵osg:Matrixd TravelManipulator:getInverseMatrix(void) constosg:Matrixd mat;mat.makeRotate(m_vRotation._v0, osg:Vec3(1.0f, 0.0f, 0.0f),m_vRotation._v1, osg:Vec3(0.0f, 1.0f, 0.0f),m_vRotation._v2, osg:Vec3(0.0f, 0.0f, 1.0f);return osg:Matrixd:inverse(mat * osg:Matrixd:translate(m_vPosition);/ 事件处理函数bool TravelManipulator:handle(const osgGA:GUIEventAdapter &ea, osgGA:GUIActionAdapter &us)/ 获取鼠标位置float mouseX = ea.getX();float mouseY = ea.getY();switch(ea.getEventType()case(osgGA:GUIEventAdapter:KEYDOWN):/ 空格键if(ea.getKey() = 0x20)us.requestRedraw();us.requestContinuousUpdate(false);return true;/ 上移键if (ea.getKey() = 0xFF50)ChangePosition(osg:Vec3(0, 0, m_fMoveSpeed);return true;/ 下移键if (ea.getKey() = 0xFF57)ChangePosition(osg:Vec3(0, 0, -m_fMoveSpeed);return true;/ 加速if (ea.getKey() = 0x2B)m_fMoveSpeed += 1.0f;return true;/ 减少速度if (ea.getKey() = 0x2D)m_fMoveSpeed -= 0.1f;if(m_fMoveSpeed = 3.14)m_vRotation._v0 = 3.14;if (m_vRotation._v0 = 0)m_vRotation._v0 = 0;return false;/ 鼠标释放case(osgGA:GUIEventAdapter:RELEASE):if (ea.getButton() = 1)m_bLeftButtonDown = false;return false;default:return false;/ 位置变换函数void TravelManipulator:ChangePosition(osg:Vec3 &delta)/ 碰撞检测if (m_bPeng)/ 得到新的位置osg:Vec3 newPos1 = m_vPosition + delta;osgUtil:IntersectVisitor ivXY;/ 根据新的位置得到两条线段检测osg:ref_ptrlineXY = new osg:LineSegment(newPos1, m_vPosition);osg:ref_ptrlineZ = new osg:LineSegment(newPos1 + osg:Vec3(0.0f, 0.0f, 10.0f), newPos1 - osg:Vec3(0.0f, 0.0f, -10.0f);ivXY.addLineSegment(lineZ.get();ivXY.addLineSegment(lineXY.get();/ 结构交集检测m_pHostViewer-getSceneData()-accept(ivXY);/ 如果没有碰撞if (!ivXY.hits()m_vPosition += delta;elsem_vPosition += delta;/ 设置速度void TravelManipulator:setSpeed(float &sp)m_fMoveSpeed = sp;/ 获得当前速度float TravelManipulator:getSpeed()return m_fMoveSpeed;/ 设置起始的位置void T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论