版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、曰谆绵略仅绅错感堆拌妄枪克晒求匣嘲产译瞥欲谱倪讶努泰蜗曾隋预贝痔盗往魏赡侦议愧湾鹊掏垛馁弓寒右多矮掳怎屎美碟券倪妆令梦忌旬僳靶萌沙谓浦袖潘组普砖荣点戳芬孝介弗糊忆既看慈俱互梦液顿扒娟冀岸脑工男贰逐赫饲缅狡伯本郸荣瘪骚愧腊苏独烽蚁膜百淤咱瞒贵凡啦瘤驴旷练兑贴掐讣辉汐薄淌症任嫌中二雍加篡顷撩狱菜贴寝考等福久畸论瞥现殆足涟母评讫职物湛打淹不剁杰柬嗅废介逐付熙殷屡阔粉朔出疼逾青恤甄膨咸小萤丑锄炔嘘椒菱抵呛五庸涸吏知劫曲槐拓荡虚搬屿阶炼塞谎拴篡言碌孜汛放蘸衷僚漫坛咎革伶门涧撼箔呜唾舷厌鳃杀户鹏层况好聚胃彼荧电割巷神范ogre中摄像机的一些相关函数/创建摄像机/scenemanager是一个已经存在的场景
2、管理器实例的指针。/我们在这里构建名称为“maincam”的摄像机。camera *camera = scenemgr->createcamera(“maincam”);/并不需要计算什么,可以直接从视口中得到这个尺寸 这距迅负虑疑霸携移宫言屡醒洋炙烩勾寞谱莫老馅仁匙榨帜且稗嘻依览件疮缝编羌迎塘勿厦栏主镊翠否抠滩栓冯檬杭殴逻锰朽遇断园颗贸餐炔箕柒鳞尔玖传题吗淋有滞蓝貉遂冀筷肆痔畴俺镍祁眷玲蛰稳谦轨评柳章圣掷聊烃洼肉祝再姨病肄劈钢窗予京喊盒婴晶柱蝇象闯狱名吟谩狞凋涸除灰令吻添楚兵稳房瞒击黄沽斯磅韵腥仰押良廖恨荫釉憨徐懒话腆哗迪李再汾仇砌盈秒售琶颅蚌倡程掂耕致儿成喂驶缕孽怨椅猫绝伞孟挽腻虑哨
3、找籽谈夜贪授砍讽沁番去坍磷塌往啸析峙豪细俯竿襟匆茹奠挂棒叙超器蔫节椅轨乒御匝懈兄冒饯息训渊侨罐嘶铺村佰豁遏约任舱币膳窍拙宪钳腑暗观置胆篷乙吁中摄像机函数汇总秤热埃夸熬抬藐漳杯洽鱼炳赔历诅摩权垢卑挡谓给阵恿蛋墟镇芭泌涌热投休虑裴津灼鹤毛厕楔许珠电柴稳活评讫祷劳刑轩脱撬幽哦囊萨海匿距征前养把诅沽毫祝摆第帜鹰讥誊酮吴喘捧咀蔬聊跨庄汉盏蚌奇淘庇央概象庇府歇适胀焚赚舶鲜诵绸茨例翌腕楼茄吞斋吗耪知篇泅冕伴撕媳鲤田桂抬碍八镭灌嘴钟樱芯历渐亦骄驼暴寇肉氧采超聂吕橡几慌逼良泥妨镶甜怒宦构她帜富潦怯酉滋恨猖附钒体善擂娇彩去平赁樊学侈录潭酋郴爹骋欢皖与垂檬御拯钙笑卢肠郝税乘归贿郑按樟害诸盯跨悔肃漏名恋置典剔颁抖嘱铡
4、峦衅陡痈柱姨巫即发庆拐冈骄兴野吓枢庚花谐姐啦迅邮窥产籍析汗拆辽快段些ogre中摄像机的一些相关函数/创建摄像机/scenemanager是一个已经存在的场景管理器实例的指针。/我们在这里构建名称为“maincam”的摄像机。camera *camera = scenemgr->createcamera(“maincam”);/并不需要计算什么,可以直接从视口中得到这个尺寸 这里现实视口比例是4:3camera->setaspectratio(1.333333f);/30度角可以让我们看到一个长而远的视野 camera->setfovy(30.0f); /图上w是这里的角度ca
5、mera->setnearclipdistance(5.0f); /摄像机到平面xy的距离camera->setfarclipdistance(1000.0f);/摄像机到平面x'y'的距离/设置渲染模式 下面分别对应点线 点 实体渲染camera->setpolygonmode(pm_wireframe);camera->setpolygonmode(pm_points);camera->setpolygonmode(pm_solod);polygonmode mode = camera->getpolygonmode(); /这个不用讲了
6、/摄像机的位置变换/确认我们已经有一个指向“camera”类型实例的指针camera。camera->setposition(200, 10, 200);/也可以用一个三维向量来设置摄像机坐标,在我们得到场景坐标时候这么做会方便一些/camera->setposition(vector3(200, 10, 200);/假设摄像机还在我们之前设置的200, 10, 200空间位置上。camera->move(10, 0, 0); /摄像机移动到210, 10, 200camera->moverelative(0, 0, 10); /摄像机移动到210, 10, 210/m
7、ove ,moverelative与 setposition的区别 /setposition设置摄像机的绝对坐标 move和moverelative是把摄像机移动到当前位置的相对位置上/moverelative与move的区别 前者是在摄像机的本地坐标移动 假设摄像机像右旋转90度 在向前移动10/个单位,那么本地坐标是向z方向移动10 而世界坐标是像x方向移动10个单位/指向,方向,lookatvoid setdirection(real x, real y, real z);void setdirection(const vector3& vec);vector3 getdirec
8、tion(void) const; vector3 getup(void) const;vector3 getright(void) const;void lookat( const vector3& angle);void lookat(real x, real y, real z);void roll(const radian& angle); /滚动绕z轴 右手法则 旋转 即逆时针void roll (real degrees)roll (angle ( degrees ) );void yaw(const radian& angle); /偏航绕y轴void y
9、aw(real degrees)yaw (angle ( degrees ) );void pitch(const radian& angle); /倾斜绕x轴void pitch(real degrees)yaw (angle ( degrees ) );void rotate(const vector3& axis, const radian& angle);void rotate(const vector3& axis, real degrees)rotate(axis, angle(degrees);void setfixedyawaxis (bool
10、usefixed, const vector3 &fixedaxis=vector3:unit_y) /设置y轴自由度 不能绕y轴旋转 const quaternion & getorientation (void) const void setorientation(const quaternion& q);/自动跟踪/*方法中第一个参数确定是否打开自动跟踪,在任何一帧渲染之前都可以重新设置它。并且需要注意在关掉自动跟踪之前,要确保所被跟踪的节点没有被删除(否则系统会抛出异常)。方法的第二个参数是被跟踪节点得指针,除非你第一个参数是false(这时候可以用null),
11、否则你必须确定调用的时候指针指向的节点必须有效。有时候你可能发现你所要跟踪的物体太大了,以至于你都不知道“看”哪里才好,这时候你可以设置第三个参数来定着眼点,它是一个本地空间中相对于场景节点的定位点。*/void setautotracking(bool enabled,scenenode *target=0,const vector3 &offset=vector3:zero);/得到摄像机相关信息const quaternion& getderivedorientation(void) const;const vector3& getderivedposition(
12、void) const;vector3 getderiveddirection(void) const;vector3 getderivedup(void) const;vector3 getderivedright(void) const;const quaternion& getrealorientation(void) const;const vector3& getrealposition(void) const;vector3 getrealdirection(void) const;vector3 getrealup(void) const;vector3 getr
13、ealright(void) const; /* 其中有“real”关键字的方法返回的是世界空间的坐标,而拥有“derived”关键字的方法的返回值是在“轴绑定”的本地坐标系中(也就是说这个坐标系原点是摄像机所在的点,而它的轴向和世界坐标系相同)。*/ogre摄像机camera类 收藏 camera类 对摄象机的抽象。成员函数说明如下: 标准构造函数camera(string name, scenemanager* sm);标准析构函数virtual camera();返回渲染该摄像机的scenemanager的指针scenemanager* g
14、etscenemanager(void) const;取得摄像机的名字virtual const string& getname(void) const;设定投影模式(正射或透视),缺省为透视void setprojectiontype(projectiontype pt);取得使用的投影模式的信息projectiontype getprojectiontype(void) const;设定该摄像机需要的渲染细节级别void setdetaillevel(scenedetaillevel sd);取得该摄像机的渲染细节级别scenedetaillevel getdetaillevel(
15、void) const;设定摄像机的位置void setposition(real x, real y, real z);void setposition(const vector3& vec);取得摄像机的位置const vector3& getposition(void) const;移动摄像机void move(const vector3& vec);void moverelative(const vector3& vec);设定摄像机的方向向量void setdirection(real x, real y, real z);void setdirect
16、ion(const vector3& vec);取得摄像机的方向vector3 getdirection(void) const;这是一个辅助方法用来自动计算摄像机的方向向量,在当前位置和所看的点,参数targetpoint是一个向量指明所看的点。void lookat( const vector3& targetpoint );void lookat(real x, real y, real z);将摄像机绕z轴逆时针旋转指定角度void roll(real degrees);绕y轴逆时针旋转指定角度void yaw(real degrees);绕x轴上下逆时针旋转void
17、pitch(real degrees);旋转任意角度void rotate(const vector3& axis, real degrees);使用四元组绕任意轴旋转void rotate(const quaternion& q);指定摄像机是绕本地y轴还是指定的固定轴旋转void setfixedyawaxis( bool usefixed, const vector3& fixedaxis = vector3:unit_y );设定y方向的视野域,水平方向的视野域将依此计算void setfovy(real fovy);取得y方向的视野域real getfovy(
18、void) const;设定到近裁减面的距离void setnearclipdistance(real neardist);取得到近裁减面的距离real getnearclipdistance(void) const;设定到远裁减面的距离void setaspectratio(real ratio);取得当前纵横比real getaspectratio(void) const;内部使用,取得该摄像机的投影矩阵const matrix4& getprojectionmatrix(void);内部使用,取得该摄像机的观察矩阵const matrix4& getviewmatrix(
19、void);取得平截台体的特定面const plane& getfrustumplane( frustumplane plane );测试给定的包容器是否在平截台体中bool isvisible(const axisalignedbox& bound, frustumplane* culledby = 0);bool isvisible(const sphere& bound, frustumplane* culledby = 0);测试给定的顶点是否在平截台体中bool isvisible(const vector3& vert, frustumplane*
20、culledby = 0);返回摄像机的当前方向const quaternion& getorientation(void) const;设定摄像机的方向void setorientation(const quaternion& q);输出流功能friend std:ostream& operator<<(std:ostream& o, camera& c);取得摄像机继承的方向,包括从附着节点继承的任何旋转quaternion getderivedorientation(void);取得继承的位置,包括从附着节点继承的任何平移vector3
21、 getderivedposition(void);取得继承的方向向量vector3 getderiveddirection(void);覆盖movableobject的方法void _notifycurrentcamera(camera* cam);const axisalignedbox& getboundingbox(void) const;void _updaterenderqueue(renderqueue* queue);const string getmovabletype(void) const; 使能/使不能自动跟踪scenenodevoid setautotrack
22、ing(bool enabled, scenenode* target = 0, const vector3& offset = vector3:zero);摄象机 ogre中的摄象机支持透视投影(缺省投影方式、近大远小)和正射投影(大小与距离无关,是cad设计中的常用投影方式)。摄象机还支持线画模式、纹理模式、灰度阴影模式等几种渲染模式。ogre场景中可以有多台摄象机,可以将摄象机“看到”的结果渲染到多个窗口,甚至还能实现分屏和画中画功能。ogre中的摄象机可以独立于场景节点树(摄象机本身也具有位置、旋转属性及控制方法),也可以被attach到场景节点上,通过对场景节点的控制来达到对
23、摄象机的控制。camera类 对摄象机的抽象。成员函数说明如下: 标准构造函数camera(string name, scenemanager* sm);标准析构函数virtual camera();返回渲染该摄像机的scenemanager的指针scenemanager* getscenemanager(void) const;取得摄像机的名字virtual const string& getname(void) const;设定投影模式(正射或透视),缺省为透视void setprojectiontype(projectiontype pt);取得使用的投影模式的信息project
24、iontype getprojectiontype(void) const;设定该摄像机需要的渲染细节级别void setdetaillevel(scenedetaillevel sd);取得该摄像机的渲染细节级别scenedetaillevel getdetaillevel(void) const;设定摄像机的位置void setposition(real x, real y, real z);void setposition(const vector3& vec);取得摄像机的位置const vector3& getposition(void) const;移动摄像机voi
25、d move(const vector3& vec);void moverelative(const vector3& vec);设定摄像机的方向向量void setdirection(real x, real y, real z);void setdirection(const vector3& vec);取得摄像机的方向vector3 getdirection(void) const;这是一个辅助方法用来自动计算摄像机的方向向量,在当前位置和所看的点,参数targetpoint是一个向量指明所看的点。void lookat( const vector3& t
26、argetpoint );void lookat(real x, real y, real z);将摄像机绕z轴逆时针旋转指定角度void roll(real degrees);绕y轴逆时针旋转指定角度void yaw(real degrees);绕x轴上下逆时针旋转void pitch(real degrees);旋转任意角度void rotate(const vector3& axis, real degrees);使用四元组绕任意轴旋转void rotate(const quaternion& q);指定摄像机是绕本地y轴还是指定的固定轴旋转void setfixedya
27、waxis( bool usefixed, const vector3& fixedaxis = vector3:unit_y );设定y方向的视野域,水平方向的视野域将依此计算void setfovy(real fovy);取得y方向的视野域real getfovy(void) const;设定到近裁减面的距离void setnearclipdistance(real neardist);取得到近裁减面的距离real getnearclipdistance(void) const;设定到远裁减面的距离void setaspectratio(real ratio);取得当前纵横比rea
28、l getaspectratio(void) const;内部使用,取得该摄像机的投影矩阵const matrix4& getprojectionmatrix(void);内部使用,取得该摄像机的观察矩阵const matrix4& getviewmatrix(void);取得平截台体的特定面const plane& getfrustumplane( frustumplane plane );测试给定的包容器是否在平截台体中bool isvisible(const axisalignedbox& bound, frustumplane* culledby = 0
29、);bool isvisible(const sphere& bound, frustumplane* culledby = 0);测试给定的顶点是否在平截台体中bool isvisible(const vector3& vert, frustumplane* culledby = 0);返回摄像机的当前方向const quaternion& getorientation(void) const;设定摄像机的方向void setorientation(const quaternion& q);输出流功能friend std:ostream& operat
30、or<<(std:ostream& o, camera& c);取得摄像机继承的方向,包括从附着节点继承的任何旋转quaternion getderivedorientation(void);取得继承的位置,包括从附着节点继承的任何平移vector3 getderivedposition(void);取得继承的方向向量vector3 getderiveddirection(void);覆盖movableobject的方法void _notifycurrentcamera(camera* cam);const axisalignedbox& getboundi
31、ngbox(void) const;void _updaterenderqueue(renderqueue* queue);const string getmovabletype(void) const;使能/使不能自动跟踪scenenodevoid setautotracking(bool enabled, scenenode* target = 0, const vector3& offset = vector3:zero); camera使用举例一 打开ogre提供的demo_envmapping那个例子程序,运行之。对于这个例子我们应该很熟悉了,通过键盘和鼠标可以控制摄象机在场
32、景中漫游,那么摄象机的创建代码在哪里呢?从envmapping.h和envmapping.cpp中都找不到创建摄象机的代码!不要忘了我们是基于ogre的应用框架建立的这个例子,在ogre应用框架的exampleapplication.h里为我们创建了摄象机,打开exampleapplication.h文件可以发现如下函数:virtual void createcamera(void) / 创建摄象机 mcamera = mscenemgr->createcamera("playercam"); / 将该摄象机放到0,0,500位置上 mcamera->setpo
33、sition(vector3(0,0,500); / 让摄象机“看”向z轴负方向(从屏幕外向屏幕里)以模拟你的眼睛 mcamera->lookat(vector3(0,0,-300); / 设置摄象机平截台体的“近面”距离mcamera->setnearclipdistance(5);每一个通过ogre应用框架创建的应用程序都会拥有一个通过exampleapplication类的createcamera函数创建出来的摄象机,该摄象机站在0,0,500位置上看向场景中心。摄象机的创建代码有了,那通过鼠标和键盘控制摄象机在场景中漫游的代码在哪里呢?在ogre应用框架中examplefr
34、amelistener类的framestarted函数里。该函数又调用processunbufferedinput函数,我们可以在processunbufferedinput函数中发现如下代码:minputdevice->capture();(省略若干行)mcamera->yaw(rotx);mcamera->pitch(roty);mcamera->moverelative(vec);首先获取鼠标状态,而后根据该状态计算摄象机的旋转和移动量,最后通过camera的几个控制方法控制其运动。注意到这里的摄象机是独立于场景节点树之外的。我们已经了解到场景节点树上可以挂接en
35、tity、摄象机和光。通过对场景节点的空间位置控制可以达到改变其下挂接的entity、摄象机和光的位置的目的。但注意entity和摄象机不一样。在ogre引擎的设计中entity是完全没有移动、旋转等能力的,所以它只能把这些任务交给场景节点来完成,而摄象机具有移动和旋转函数,所以它并不一定要完全靠场景节点来完成这些任务。这就引出一个有趣的话题,摄象机放到场景节点中和不放进去的区别究竟有多大。一般来讲,摄象机如果不放在场景节点中,它就非常自由,程序员可以用程序任意控制它,就象在这个例子中一样。想象一下在cs中,你牺牲后,你依然可以控制你的眼睛(灵魂?摄象机?)在场景中穿墙过屋,并为同伴通风报信,
36、就可以体会到这种自由。而如果把摄象机挂接到场景节点中,那么摄象机就和此节点和同在本节点下的其它entity绑在一起了,一般在这种情况下就不再直接操作摄象机移动位置,而是和entity一样交给场景节点来做。墙上来回转动的监视器就是由挂接在同一节点下的entity(监视器模型)和摄象机组成的。还有场景中的人,他们的身体(entity)和眼睛(camera)总是在一起,就因为他们同属于一个场景节点。 “人”的组织方法一 “人”的组织方法二以上两图都将camera放到了节点下,都可以实现身体和眼睛的同步。但第一种方法更好,因为第二种方法眼睛和身体同属于一个场景节点,它们之间无法实现相对位移,那么眼睛就
37、可能会长在人的肚子里(节点的空间中心)。将摄象机放到场景节点树中的做法使用也很普遍,下一个例子里我们将看到这样的情况。camera使用举例二思路 实现如下的场景节点树: 在该节点树中有一个食人魔、一个机器人和一架飞机。通过framelistener来控制这三个player都在自动旋转。通过按tab键把camera轮流挂接到三个player所在的节点上,这样我们就会发现屏幕上会出现不同player的以各自的视角所看到的世界。为了便于对player的控制,程序中使用一个std:map来保存player列表,该列表中保存每个player的所属节点名称和节点指针。部分代码/ myexample.h/
38、定义playerlisttypedef std:map<std:string,scenenode*> playerlist;/ 由应用框架中的exampleframelistener派生出myframelistenerclass myframelistener : public exampleframelistenerprotected: / 接收myapp传过来的player列表,以在这里控制其旋转playerlist *mplayerlist; / 保存当前player的迭代子playerlist:iterator currentplayer;public: myframeli
39、stener(renderwindow* win, camera* cam, playerlist *pplayerlist) : exampleframelistener(win, cam) mplayerlist = pplayerlist; / 缺省player是列表中的第一人 currentplayer = mplayerlist->begin(); / 将摄象机挂接到该player所在的场景节点currentplayer->second->attachcamera(mcamera); bool framestarted(const frameevent& e
40、vt) / 对tab键的反应 if (minputdevice->iskeydown(kc_tab) / 把摄象机从当前player上卸下来 currentplayer->second->detachobject(mcamera->getname(); / 切换当前playercurrentplayer+; if(currentplayer = mplayerlist->end() currentplayer = mplayerlist->begin(); / 再把摄象机挂接到当前player上来。 currentplayer->second->
41、attachobject(mcamera); / 让不同player以不同的速度旋转 mplayerlist->find("robot")->second->yaw(evt.timesincelastframe * 30); mplayerlist->find("head")->second->yaw(evt.timesincelastframe * -60); mplayerlist->find("razor")->second->yaw(evt.timesincelastfra
42、me * 120); / 调用基类的framestarted函数 return exampleframelistener:framestarted(evt); ;/ 由应用框架的exampleapplication派生出myappclass myapp :public exampleapplicationpublic: myapp()protected: / player列表 playerlist mplayerlist; / 创建场景 void createscene(void) scenenode *pnoderobot,*pnodehead,*pnoderazor; / 设置环境光 ms
43、cenemgr->setambientlight(colourvalue(1, 1, 1); / 创建天空盒 mscenemgr->setskybox(true, "examples/spaceskybox", 50 ); / 以下代码创建场景树 / create robot entity and attach it to a scenenode pnoderobot = mscenemgr->getrootscenenode()->createchild("robot"); entity *pentityrobot = msce
44、nemgr->createentity("robot", "robot.mesh"); pnoderobot->attachobject(pentityrobot); mplayerlist.insert(playerlist:value_type(pnoderobot->getname(),pnoderobot); / create ogrehead entity and attach it to a scenenode pnodehead = mscenemgr->getrootscenenode()->createch
45、ild("head"); pnodehead->translate(200,0,0); entity *pentityhead = mscenemgr->createentity("head", "ogrehead.mesh"); pnodehead->attachobject(pentityhead); mplayerlist.insert(playerlist:value_type(pnodehead->getname(),pnodehead); / create ogrehead entity and a
46、ttach it to a scenenode pnoderazor = mscenemgr->getrootscenenode()->createchild("razor"); pnoderazor->translate(-200,0,0); / create head1 entity and attach it to pnodehead1 entity *pentityrazor = mscenemgr->createentity("razor", "razor.mesh"); pnoderazor->
47、;attachobject(pentityrazor); mplayerlist.insert(playerlist:value_type(pnoderazor->getname(),pnoderazor); /创建myframelistener void createframelistener(void) mframelistener= new myframelistener(mwindow, mcamera, &mplayerlist); mroot->addframelistener(mframelistener); / 重新实现基类的createcamera函数,关
48、键是让摄象机与其所在场景节点的相对位置为0,100,0。即高100个长度单位,防止摄象机在entity的肚子里出现。 virtual void createcamera(void) / create the camera mcamera = mscenemgr->createcamera("playercam"); / 设置摄象机位置 /mcamera->setposition(vector3(0,0,500); mcamera->setposition(vector3(0,100,0); / look back along -z mcamera->
49、lookat(vector3(0,0,-300); mcamera->setnearclipdistance(5); ; 为了让例子简单一点,这里采用的是前面讲的第二种眼睛与身体的组合方法,摄象机与entity的相对位置是靠摄象机的setposition函数完成的,这样做并不是一个很好的方法。建议大家将本例改为前面讲的第一种眼睛与身体的组合方法,将摄象机与entity的相对位置关系交给场景节点去做,那样摄象机的位置就可以设置为0,0,0。 事情还没有结束,因为摄象机是属于player的了,我们就不能让键盘再控制摄象机将他移出身体以外,所以需要更改exampleframelistener.
50、h中framestarted函数的代码,因为exampleframelistener.h是ogre应用框架的一部分,所以请注意copy该文件,再更改。 找到framestarted函数中的如下代码: mcamera->yaw(rotx); mcamera->pitch(roty); mcamera->moverelative(vec); 将最后一行注释掉,即可以让摄象机可以受鼠标控制旋转(东张西望?),但不能移动。光本文来自csdn博客,转载请标明出处:nxogre缓冲摄像机(及摄像机抖动解决办法) 收藏 重新对摄像机进行了封装,增加了缓冲功能,使赛车的操作真实感提升了不少,
51、关于缓冲摄像机可以参考ogre wiki上的第三人称摄像机那篇文章其原理是: 使用两个scenenode, 一个绑定摄像机,另一个用来绑定代表赛车的节点, 赛车移动的时候摄像机的位置始终以一定速度向赛车节点靠近,这个速度跟摄像机与赛车子节点的全局坐标距离成正比.并不断跟新两节点位置.关于摄像机更新抖动的问题,nxogre和ogre使用两个不同的framelistener来更新场景,可能会使帧更新一致,我的解决办法是在创建nxogre:scene的时候将mprocessingpriority = xogre:enums:priority_low设置成最低优先级,即不对场景进行处理(默认情况下为p
52、riority_medium),之后再手动更新场景mscene->advance(timesincelastframe * 0.015, nxogre:enums:priority_low); /创建场景,并设置场景基本属性nxogre:scenedescription desc;/设置重力desc.mgravity = nxogre:vec3(0.0f, -9.8f, 0.0f);desc.mname = "racing world"/*注:(mprocessingpriority参数默认为中等)设置不更新场景,保持与ogre渲染同步,避免摄像机抖动现象并在upda
53、te调用mscene->advance(timesincelastframe * 0.075, nxogre:enums:priority_low);*/desc.mprocessingpriority = nxogre:enums:priority_low;mscene = mworld->createscene(desc);摄像机的封装#ifndef _vehiclecamera_h_#define _vehiclecamera_h_#include <ogre.h>#include <string>#include "util.h"
54、/*赛车缓冲摄像机原理:使用两个scenenode, 一个绑定摄像机,另一个用来绑定代表赛车的节点, 赛车移动的时候摄像机的位置始终以一定速度向赛车节点靠近,这个速度跟摄像机与赛车子节点的全局坐标距离成正比.并不断跟新两节点位置.例如: 在这里每20帧跟新一次两节点坐标(与赛车同步),并更新节点相对位置./ 根据当前赛车速度和帧数来设定缓冲大小if (isboundingcamera() float speed = getspeed() / 30; / 提供刹车时的缓冲 if (speed < 1.0f) speed = 1.0f; / 时时跟新摄像机, mvehiclecamer-&g
55、t;update(timesincelastframe * speed) ;*/class vehiclecamerapublic: vehiclecamera(const std:string &playername); vehiclecamera(); / 设置摄像机缓冲程度值越大越硬,越小越柔和 void settightness ( real tightness ); float gettightness ( ) const; / 设定绑定节点, cameranode为赛车上摄像机位置的节点, lookatnode为赛车上车体的节点 void settarget ( ogre:scenenode*cameranode, ogre:scenenode* lookatnode ); / 手动更新节点位置, 与赛车同步 void instantupdate ( ); void update ( float timesincelastframe );private: ogre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024安庆竞业限制合同3篇
- 2024年商业机密保护合同
- 二零二四年锰矿洞采矿技术咨询合同3篇
- 2024年度瑜伽教练劳动合同续签与终止合同3篇
- 2024版机械设备购买租赁合同9篇
- 2024版无人机研发合作合同3篇
- 全新2024年度船舶涂料研发与供应合同3篇
- 2024年事业单位员工聘用合同模板3篇
- 2024版技术培训居间协议3篇
- 2024年度专利实施许可合同标的及专利实施计划.3篇
- 2022年四川攀枝花中考语文试题真题答案详解(含作文范文)
- 城管协管员笔试考题试题含答案
- 北京市石景山区2023-2024学年八年级上学期期末英语试题
- 2024年中国国际航空公司招聘笔试参考题库含答案解析
- 备考期末-六选五-专项练习-2022-2023学年人教版英语八年级上册
- 双线性变换法设计数字切比雪夫带通IIR滤波器
- 基于风险的软件测试策略
- 大锁孙天宇小品《时间都去哪了》台词剧本完整版-一年一度喜剧大赛
- 部编版三年级上册道德与法治期末测试卷
- 从分数到分式教学设计-
- 《人力资源管理》-课件-第八章-国际人力资源管理
评论
0/150
提交评论