




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机科学与技术学院天津理工大学计算机科学与技术学院实验报告2015 至 2016 学年 第 二 学期课程名称计算机图形学学号学生姓名年级专业课程号实验地点实验时间主讲教师辅导教师实验( 四 )实验名称场景漫游软件环境Visual Studio 2010OSG-3.1.0Windows 7硬件环境2G内存显卡GT610CPU奔腾双核硬盘320G实验目的1. 掌握透视投影与平行投影的基本原理。 2. 掌握投影变换的操作方法。实验内容(应包括实验题目、实验要求、实验任务等)实验题目:1. 构建地形场景。2. 构建人物模型3. 交互式方式浏览场景各部分4. 交互式人的运动操作5. 设计视点运动轨迹实验要求:1. 采用OpenSceneGraph创建图形窗口和实现人机交互功能,采用方向键控制对场景的浏览。2. 要求漫游操作方便,视点运动自然流畅。3. 提交电子版实验报告及工程代码,试验报告模板可参考计算机学院统一模板4. 提交的工程代码必须删除其中的Debug或Release文件夹实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)节点模型:GroupNode(加载地形)MatrixTransformGroup(加载机器人)实验步骤:1. 用Node节点去放置加载的地形数据,并加载之前设定的机器人,将其放入同一个场景之中;2. 建立类并使其继承osgGA:CameraManipulator,处理鼠标键盘事件,对各种操作进行处理,实现场景漫游,对不同的按键处理不同的操作,主要为机器人前进、后退,转身,以及通过方向键控制漫游,实现相机视点的旋转,通过w/s/a/d键实现视点的前进后踢,通过i/k/j/l键实现机器人的运动;3. 通过单机F键实现窗口视图和全屏视图;4. 将程序各模块接入主程序,实现场景的自由漫步。实验效果:附录(可包括源程序清单或其它说明)源程序:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; osg:ref_ptr root_Tr = new osg:MatrixTransform;osg:ref_ptr head_Tr = new osg:MatrixTransform;osg:ref_ptr body_Tr = new osg:MatrixTransform;osg:ref_ptr left_arm_Tr =new osg:MatrixTransform;osg:ref_ptr right_arm_Tr =new osg:MatrixTransform;osg:ref_ptr left_leg_Tr =new osg:MatrixTransform;osg:ref_ptr right_leg_Tr =new osg:MatrixTransform;class TravelManipulator:public osgGA:CameraManipulator private:float angle1;float angle;float move;float scale;int singal;public: TravelManipulator(void); TravelManipulator(void); / 把漫游器添加到场景中 static TravelManipulator * TravelToScence(osg:ref_ptrviewer); private: osg:ref_ptrm_pHostViewer; / 移动速度 float m_fMoveSpeed; / 当前位置 osg:Vec3 m_vPosition; / 旋转角度 osg:Vec3 m_vRotation; public: / 鼠标左键状态 bool m_bLeftButtonDown; / 鼠标位置 float m_fpushX; float m_fpushY; / 设置矩阵 virtual void setByMatrix(const osg:Matrix &matrix); / 设置逆矩阵 virtual void setByInverseMatrix(const osg:Matrix &matrix); / 获取矩阵 virtual osg:Matrixd getMatrix() const; / 获取逆矩阵 virtual osg:Matrixd getInverseMatrix() const; / 事件处理函数 virtual bool handle(const osgGA:GUIEventAdapter &ea, osgGA:GUIActionAdapter &us); / 屏幕角度 float m_fAngle; / 位置变换 void ChangePosition(osg:Vec3 &delta); / 碰撞检测状态 bool m_bPeng; / 设置速度 float getSpeed(); void setSpeed(float &); / 设置初始位置 void SetPosition(osg:Vec3 &position); osg:Vec3 GetPosition(); ; / 构造函数 TravelManipulator:TravelManipulator():m_fMoveSpeed(1.0f), m_bLeftButtonDown(false), m_fpushX(0), m_fAngle(2.5), m_bPeng(true), m_fpushY(0) m_vPosition = osg:Vec3(-22.0f, -274.0f, 100.0f); m_vRotation = osg:Vec3(osg:PI_2, 0.0f, 0.0f); angle1=0;angle=0;move=1;scale=1;singal=0; TravelManipulator:TravelManipulator(void) / 把漫游器添加到场景中 TravelManipulator *TravelManipulator:TravelToScence(osg:ref_ptr viewer) TravelManipulator* camera = new TravelManipulator; viewer-setCameraManipulator(camera); camera-m_pHostViewer = viewer; return camera; / 设置矩阵 void TravelManipulator:setByMatrix(const osg:Matrix &matrix) / 设置逆矩阵 void TravelManipulator:setByInverseMatrix(const osg:Matrix &matrix) / 得到矩阵 osg:Matrixd TravelManipulator:getMatrix(void)const osg: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) const osg: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): angle=osg:PI_2/3;if(ea.getKey()=i)if(singal=0)left_leg_Tr-setMatrix(osg:Matrix:translate(1.5,0,-8)*osg:Matrix:rotate(angle,osg:Vec3(-1,0,0)*osg:Matrix:translate(-1.5,0,8)*osg:Matrix:translate(0,-move,0);else if(singal=1)body_Tr-setMatrix(osg:Matrix:translate(0,-move,0);head_Tr-setMatrix(osg:Matrix:translate(0,-move,0);left_arm_Tr-setMatrix(osg:Matrix:translate(0,-move,0);right_arm_Tr-setMatrix(osg:Matrix:translate(0,-move,0);left_leg_Tr-setMatrix(osg:Matrix:translate(1.5,0,-8)*osg:Matrix:rotate(angle,osg:Vec3(1,0,0)*osg:Matrix:translate(-1.5,0,8);left_leg_Tr-setMatrix(osg:Matrix:translate(0,-move,0);right_leg_Tr-setMatrix(osg:Matrix:translate(0,-move,0);singal+;singal%=2;move+;return true ;else if(ea.getKey()=k)if(singal=0)right_leg_Tr-setMatrix(osg:Matrix:translate(-1.5,0,-8)*osg:Matrix:rotate(angle,osg:Vec3(1,0,0)*osg:Matrix:translate(1.5,0,8)*osg:Matrix:translate(0,-move,0);else if(singal=1)body_Tr-setMatrix(osg:Matrix:translate(0,-move,0);head_Tr-setMatrix(osg:Matrix:translate(0,-move,0);left_arm_Tr-setMatrix(osg:Matrix:translate(0,-move,0);right_arm_Tr-setMatrix(osg:Matrix:translate(0,-move,0);left_leg_Tr-setMatrix(osg:Matrix:translate(-1.5,0,-8)*osg:Matrix:rotate(angle,osg:Vec3(-1,0,0)*osg:Matrix:translate(1.5,0,8);left_leg_Tr-setMatrix(osg:Matrix:translate(0,-move,0);right_leg_Tr-setMatrix(osg:Matrix:translate(0,-move,0);singal+;singal%=2;move-;return true ;else if(ea.getKey()=j)angle1+=osg:PI_2;root_Tr-setMatrix(osg:Matrix:rotate(angle1,osg:Vec3(0,0,1);return true ;else if(ea.getKey()=l)angle1+=osg:PI_2;root_Tr-setMatrix(osg:Matrix:rotate(angle1,osg:Vec3(0,0,-1);return true ;/ 空格键 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; else m_vPosition += delta; / 设置速度 void TravelManipulator:setSpeed(float &sp) m_fMoveSpeed = sp; / 获得当前速度 float TravelManipulator:getSpeed() return m_fMoveSpeed; / 设置起始的位置 void TravelManipulator:SetPosition(osg:Vec3 &position) m_vPosition = position; / 得到当前所在位置 osg:Vec3 TravelManipulator:GetPosition() return m_vPosition; osg:Group * createPerson()osg:ref_ptr node = new osg:Node;osg:ref_ptr group = new osg:Group;group-addChild(root_Tr.get();osg:ref_ptr head = new osg:Geode;head_Tr-addChild(head.get();osg:ref_ptr body = new osg:Geode;body_Tr-addChild(body.get();osg:ref_ptr left_arm = new osg:Geode; /左胳膊left_arm_Tr-addChild(left_arm.get();osg:ref_ptr right_arm = new osg:Geode; /右胳膊right_arm_Tr-addChild(right_arm.get();osg:ref_ptr left_leg = new osg:Geode; /左腿left_leg_Tr-addChild(left_leg.get();osg:ref_ptr right_leg = new osg:Geode; /右腿right_leg_Tr-addChild(right_leg.get();root_Tr-addChild(head_Tr.get();root_Tr-addChild(body_Tr.get();root_Tr-addChild(left_arm_Tr.get();root_Tr-addChild(right_arm_Tr.get();root_Tr-addChild(left_leg_Tr.get();root_Tr-addChild(right_leg_Tr.get();osg:ref_ptr head_sp = new osg:Sphere(osg:Vec3(0,0.0,20),2); osg:ref_ptr head_ShapeDrawable = new osg:ShapeDrawable(head_sp.get(); head_ShapeDrawable-setColor(osg:Vec4(1,0,0,1);head-addDrawable(head_ShapeDrawable.get(); osg:ref_ptr eye1_sp = new osg:Sphere(osg:Vec3(-0.7,-1.7,21),0.5); osg:ref_ptr eye1_ShapeDrawable = new osg:ShapeDrawable(eye1_sp.get(); eye1_ShapeDrawable-setColor(osg:Vec4(0,0,1,1);head-addDrawable(eye1_ShapeDrawable.get(); osg:ref_ptr eye2_sp = new osg:Sphere(osg:Vec3(0.7,-1.7,21),0.5); osg:ref_ptr eye2_ShapeDrawable = new osg:ShapeDrawable(eye2_sp.get(); eye2_ShapeDrawable-setColor(osg:Vec4(0,0,1,1);head-addDrawable(eye2_ShapeDrawable.get(); osg:ref_ptr ear1_sp = new osg:Sphere(osg:Vec3(0,-1.7,20),0.5); osg:ref_ptr ear1_ShapeDrawable = new osg:ShapeDrawable(ear1_sp.get(); ear1_ShapeDrawable-setColor(osg:Vec4(0,0,1,1);head-addDrawable(ear1_ShapeDrawable.get(); osg:ref_ptr head_Cylinder = new osg:Cylinder(osg:Vec3(0,0,18), 1, 2);osg:ref_ptr cylinderDrawable = new osg:ShapeDrawable(head_Cylinder.get();cylinderDrawable-setColor(osg:Vec4(1,0,0,1);head-addDrawable(cylinderDrawable);osg:ref_ptr body_Shape = new osg:ShapeDrawable( new osg:Box(osg:Vec3(0.0f, 0.0f, 13.0f), 6.0f, 3.0f, 8.0f);body_Shape-setColor(osg:Vec4(1,0,0,1);body-addDrawable(body_Shape.get();osg:ref_ptr left_arm_shape = new osg:Cylinder(osg:Vec3(-4,0,14), 1, 6);osg:ref_ptr left_arm_Drawable = new osg:ShapeDrawable(left_arm_shape.get();left_arm_Drawable-setColor(osg:Vec4(0,1,0,1);left_arm-addDrawable(left_arm_Drawable);osg:ref_ptr right_arm_shape = new osg:Cylinder(osg:Vec3(4,0,14), 1, 6);osg:ref_ptr right_arm_Drawable = new osg:ShapeDrawable(right_arm_shape.get();right_arm_Drawable-setColor(osg:Vec4(0,1,0,1);right_arm-addDrawable(right_arm_Drawable);osg:ref_ptr left_leg_shape = new osg:Cylinder(osg:Vec3(-1.5,0,6), 1, 8);osg:ref_ptr left_leg_Drawable = new osg:ShapeDrawable(left_leg_shape.get();left_leg_Drawable-setColor(osg:Vec4(1,0,0,1);left_leg-addDrawable(left_leg_Drawable);osg:ref_ptr right_leg_shape = new osg:Cylinder(osg:Vec3(1.5,0,6), 1, 8);osg:ref_ptr right_leg_Drawable = new osg:ShapeDrawable(right_leg_shape.get();right_leg_Drawable-set
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股权溢价协议书
- 典当行协议书
- 阴阳婚前协议书
- 签订师徒协议书讲话
- 中美协议书丧权
- 不承担责任协议书
- 阅文新合同基础协议书
- 投资辅导协议书
- 2025租赁合同案例
- 合伙商铺协议书
- 2024北森图形推理题
- 第一次月考2024-2025学年度九年级英语
- 二级公立医院绩效考核三级手术目录(2020版)
- 招聘会会展服务投标方案(技术标 )
- 07FK02防空地下室通风设备安装图集
- 第四讲 坚持以人民为中心PPT习概论2023优化版教学课件
- 冠心病案例汇总
- 2022年河北邢台市中心血站招聘编外工作人员10人笔试备考题库及答案解析
- GB/T 4985-2021石油蜡针入度测定法
- 儿童认知发展
- 海船船员甲类三管轮实习记录簿
评论
0/150
提交评论