ogre中摄像机函数汇总_第1页
ogre中摄像机函数汇总_第2页
ogre中摄像机函数汇总_第3页
ogre中摄像机函数汇总_第4页
ogre中摄像机函数汇总_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

1、ogre中摄像机的一些相关函数/创建摄像机/scenemanager是一个已经存在的场景管理器实例的指针。/我们在这里构建名称为“maincam”的摄像机。camera *camera = scenemgr-createcamera(“maincam”);/并不需要计算什么,可以直接从视口中得到这个尺寸 这里现实视口比例是4:3camera-setaspectratio(1.333333f);/30度角可以让我们看到一个长而远的视野 camera-setfovy(30.0f); /图上w是这里的角度camera-setnearclipdistance(5.0f); /摄像机到平面xy的距离ca

2、mera-setfarclipdistance(1000.0f);/摄像机到平面xy的距离/设置渲染模式 下面分别对应点线 点 实体渲染camera-setpolygonmode(pm_wireframe);camera-setpolygonmode(pm_points);camera-setpolygonmode(pm_solod);polygonmode mode = camera-getpolygonmode(); /这个不用讲了/摄像机的位置变换/确认我们已经有一个指向“camera”类型实例的指针camera。camera-setposition(200, 10, 200);/也可以

3、用一个三维向量来设置摄像机坐标,在我们得到场景坐标时候这么做会方便一些/camera-setposition(vector3(200, 10, 200);/假设摄像机还在我们之前设置的200, 10, 200空间位置上。camera-move(10, 0, 0); /摄像机移动到210, 10, 200camera-moverelative(0, 0, 10); /摄像机移动到210, 10, 210/move ,moverelative与 setposition的区别 /setposition设置摄像机的绝对坐标 move和moverelative是把摄像机移动到当前位置的相对位置上/mov

4、erelative与move的区别 前者是在摄像机的本地坐标移动 假设摄像机像右旋转90度 在向前移动10/个单位,那么本地坐标是向z方向移动10 而世界坐标是像x方向移动10个单位/指向,方向,lookatvoid setdirection(real x, real y, real z);void setdirection(const vector3& vec);vector3 getdirection(void) const; vector3 getup(void) const;vector3 getright(void) const;void lookat( const vector3&

5、 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 yaw(real degrees)yaw (angle ( degrees ) );void pitch(const radian& angle); /倾斜绕x轴void pitch(real degrees)yaw (ang

6、le ( degrees ) );void rotate(const vector3& axis, const radian& angle);void rotate(const vector3& axis, real degrees)rotate(axis, angle(degrees);void setfixedyawaxis (bool usefixed, const vector3 &fixedaxis=vector3:unit_y) /设置y轴自由度 不能绕y轴旋转 const quaternion & getorientation (void) const void setorien

7、tation(const quaternion& q);/自动跟踪/*方法中第一个参数确定是否打开自动跟踪,在任何一帧渲染之前都可以重新设置它。并且需要注意在关掉自动跟踪之前,要确保所被跟踪的节点没有被删除(否则系统会抛出异常)。方法的第二个参数是被跟踪节点得指针,除非你第一个参数是false(这时候可以用null),否则你必须确定调用的时候指针指向的节点必须有效。有时候你可能发现你所要跟踪的物体太大了,以至于你都不知道“看”哪里才好,这时候你可以设置第三个参数来定着眼点,它是一个本地空间中相对于场景节点的定位点。*/void setautotracking(bool enabled,scen

8、enode *target=0,const vector3 &offset=vector3:zero);/得到摄像机相关信息const quaternion& getderivedorientation(void) const;const vector3& getderivedposition(void) const;vector3 getderiveddirection(void) const;vector3 getderivedup(void) const;vector3 getderivedright(void) const;const quaternion& getrealorient

9、ation(void) const;const vector3& getrealposition(void) const;vector3 getrealdirection(void) const;vector3 getrealup(void) const;vector3 getrealright(void) const; /* 其中有“real”关键字的方法返回的是世界空间的坐标,而拥有“derived”关键字的方法的返回值是在“轴绑定”的本地坐标系中(也就是说这个坐标系原点是摄像机所在的点,而它的轴向和世界坐标系相同)。*/ogre摄像机camera类 收藏 camera类 对摄象机的抽象。

10、成员函数说明如下: 标准构造函数camera(string name, scenemanager* sm);标准析构函数virtual camera();返回渲染该摄像机的scenemanager的指针scenemanager* getscenemanager(void) const;取得摄像机的名字virtual const string& getname(void) const;设定投影模式(正射或透视),缺省为透视void setprojectiontype(projectiontype pt);取得使用的投影模式的信息projectiontype getprojectiontype(v

11、oid) 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;移动摄像机void move(const vector3& vec);void mov

12、erelative(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& targetpoint );void lookat(real x, real y, real z);将摄

13、像机绕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 setfixedyawaxis( bool usefixed, const vector3& fixedaxis = vector3:un

14、it_y );设定y方向的视野域,水平方向的视野域将依此计算void setfovy(real fovy);取得y方向的视野域real getfovy(void) const;设定到近裁减面的距离void setnearclipdistance(real neardist);取得到近裁减面的距离real getnearclipdistance(void) const;设定到远裁减面的距离void setaspectratio(real ratio);取得当前纵横比real getaspectratio(void) const;内部使用,取得该摄像机的投影矩阵const matrix4& get

15、projectionmatrix(void);内部使用,取得该摄像机的观察矩阵const matrix4& getviewmatrix(void);取得平截台体的特定面const plane& getfrustumplane( frustumplane plane );测试给定的包容器是否在平截台体中bool isvisible(const axisalignedbox& bound, frustumplane* culledby = 0);bool isvisible(const sphere& bound, frustumplane* culledby = 0);测试给定的顶点是否在平截台

16、体中bool isvisible(const vector3& vert, frustumplane* culledby = 0);返回摄像机的当前方向const quaternion& getorientation(void) const;设定摄像机的方向void setorientation(const quaternion& q);输出流功能friend std:ostream& operator(std:ostream& o, camera& c);取得摄像机继承的方向,包括从附着节点继承的任何旋转quaternion getderivedorientation(void);取得继承的

17、位置,包括从附着节点继承的任何平移vector3 getderivedposition(void);取得继承的方向向量vector3 getderiveddirection(void);覆盖movableobject的方法void _notifycurrentcamera(camera* cam);const axisalignedbox& getboundingbox(void) const;void _updaterenderqueue(renderqueue* queue);const string getmovabletype(void) const; 使能/使不能自动跟踪scenen

18、odevoid setautotracking(bool enabled, scenenode* target = 0, const vector3& offset = vector3:zero);摄象机 ogre中的摄象机支持透视投影(缺省投影方式、近大远小)和正射投影(大小与距离无关,是cad设计中的常用投影方式)。摄象机还支持线画模式、纹理模式、灰度阴影模式等几种渲染模式。ogre场景中可以有多台摄象机,可以将摄象机“看到”的结果渲染到多个窗口,甚至还能实现分屏和画中画功能。ogre中的摄象机可以独立于场景节点树(摄象机本身也具有位置、旋转属性及控制方法),也可以被attach到场景节点

19、上,通过对场景节点的控制来达到对摄象机的控制。camera类 对摄象机的抽象。成员函数说明如下: 标准构造函数camera(string name, scenemanager* sm);标准析构函数virtual camera();返回渲染该摄像机的scenemanager的指针scenemanager* getscenemanager(void) const;取得摄像机的名字virtual const string& getname(void) const;设定投影模式(正射或透视),缺省为透视void setprojectiontype(projectiontype pt);取得使用的投影

20、模式的信息projectiontype 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;移动摄像

21、机void 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& targetpoint )

22、;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 setfixedyawaxis( bool usefixed

23、, 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);取得当前纵横比real getaspectratio(void) c

24、onst;内部使用,取得该摄像机的投影矩阵const matrix4& getprojectionmatrix(void);内部使用,取得该摄像机的观察矩阵const matrix4& getviewmatrix(void);取得平截台体的特定面const plane& getfrustumplane( frustumplane plane );测试给定的包容器是否在平截台体中bool isvisible(const axisalignedbox& bound, frustumplane* culledby = 0);bool isvisible(const sphere& bound, fr

25、ustumplane* culledby = 0);测试给定的顶点是否在平截台体中bool isvisible(const vector3& vert, frustumplane* culledby = 0);返回摄像机的当前方向const quaternion& getorientation(void) const;设定摄像机的方向void setorientation(const quaternion& q);输出流功能friend std:ostream& operatorcreatecamera(playercam); / 将该摄象机放到0,0,500位置上 mcamera-setpo

26、sition(vector3(0,0,500); / 让摄象机“看”向z轴负方向(从屏幕外向屏幕里)以模拟你的眼睛 mcamera-lookat(vector3(0,0,-300); / 设置摄象机平截台体的“近面”距离mcamera-setnearclipdistance(5);每一个通过ogre应用框架创建的应用程序都会拥有一个通过exampleapplication类的createcamera函数创建出来的摄象机,该摄象机站在0,0,500位置上看向场景中心。摄象机的创建代码有了,那通过鼠标和键盘控制摄象机在场景中漫游的代码在哪里呢?在ogre应用框架中exampleframeliste

27、ner类的framestarted函数里。该函数又调用processunbufferedinput函数,我们可以在processunbufferedinput函数中发现如下代码:minputdevice-capture();(省略若干行)mcamera-yaw(rotx);mcamera-pitch(roty);mcamera-moverelative(vec);首先获取鼠标状态,而后根据该状态计算摄象机的旋转和移动量,最后通过camera的几个控制方法控制其运动。注意到这里的摄象机是独立于场景节点树之外的。我们已经了解到场景节点树上可以挂接entity、摄象机和光。通过对场景节点的空间位置控

28、制可以达到改变其下挂接的entity、摄象机和光的位置的目的。但注意entity和摄象机不一样。在ogre引擎的设计中entity是完全没有移动、旋转等能力的,所以它只能把这些任务交给场景节点来完成,而摄象机具有移动和旋转函数,所以它并不一定要完全靠场景节点来完成这些任务。这就引出一个有趣的话题,摄象机放到场景节点中和不放进去的区别究竟有多大。一般来讲,摄象机如果不放在场景节点中,它就非常自由,程序员可以用程序任意控制它,就象在这个例子中一样。想象一下在cs中,你牺牲后,你依然可以控制你的眼睛(灵魂?摄象机?)在场景中穿墙过屋,并为同伴通风报信,就可以体会到这种自由。而如果把摄象机挂接到场景节

29、点中,那么摄象机就和此节点和同在本节点下的其它entity绑在一起了,一般在这种情况下就不再直接操作摄象机移动位置,而是和entity一样交给场景节点来做。墙上来回转动的监视器就是由挂接在同一节点下的entity(监视器模型)和摄象机组成的。还有场景中的人,他们的身体(entity)和眼睛(camera)总是在一起,就因为他们同属于一个场景节点。 “人”的组织方法一 “人”的组织方法二以上两图都将camera放到了节点下,都可以实现身体和眼睛的同步。但第一种方法更好,因为第二种方法眼睛和身体同属于一个场景节点,它们之间无法实现相对位移,那么眼睛就可能会长在人的肚子里(节点的空间中心)。将摄象机

30、放到场景节点树中的做法使用也很普遍,下一个例子里我们将看到这样的情况。camera使用举例二思路 实现如下的场景节点树: 在该节点树中有一个食人魔、一个机器人和一架飞机。通过framelistener来控制这三个player都在自动旋转。通过按tab键把camera轮流挂接到三个player所在的节点上,这样我们就会发现屏幕上会出现不同player的以各自的视角所看到的世界。为了便于对player的控制,程序中使用一个std:map来保存player列表,该列表中保存每个player的所属节点名称和节点指针。部分代码/ myexample.h/ 定义playerlisttypedef std:

31、map playerlist;/ 由应用框架中的exampleframelistener派生出myframelistenerclass myframelistener : public exampleframelistenerprotected: / 接收myapp传过来的player列表,以在这里控制其旋转playerlist *mplayerlist; / 保存当前player的迭代子playerlist:iterator currentplayer;public: myframelistener(renderwindow* win, camera* cam, playerlist *pp

32、layerlist) : exampleframelistener(win, cam) mplayerlist = pplayerlist; / 缺省player是列表中的第一人 currentplayer = mplayerlist-begin(); / 将摄象机挂接到该player所在的场景节点currentplayer-second-attachcamera(mcamera); bool framestarted(const frameevent& evt) / 对tab键的反应 if (minputdevice-iskeydown(kc_tab) / 把摄象机从当前player上卸下来

33、 currentplayer-second-detachobject(mcamera-getname(); / 切换当前playercurrentplayer+; if(currentplayer = mplayerlist-end() currentplayer = mplayerlist-begin(); / 再把摄象机挂接到当前player上来。 currentplayer-second-attachobject(mcamera); / 让不同player以不同的速度旋转 mplayerlist-find(robot)-second-yaw(evt.timesincelastframe

34、* 30); mplayerlist-find(head)-second-yaw(evt.timesincelastframe * -60); mplayerlist-find(razor)-second-yaw(evt.timesincelastframe * 120); / 调用基类的framestarted函数 return exampleframelistener:framestarted(evt); ;/ 由应用框架的exampleapplication派生出myappclass myapp :public exampleapplicationpublic: myapp()prote

35、cted: / player列表 playerlist mplayerlist; / 创建场景 void createscene(void) scenenode *pnoderobot,*pnodehead,*pnoderazor; / 设置环境光 mscenemgr-setambientlight(colourvalue(1, 1, 1); / 创建天空盒 mscenemgr-setskybox(true, examples/spaceskybox, 50 ); / 以下代码创建场景树 / create robot entity and attach it to a scenenode pn

36、oderobot = mscenemgr-getrootscenenode()-createchild(robot); entity *pentityrobot = mscenemgr-createentity(robot, robot.mesh); pnoderobot-attachobject(pentityrobot); mplayerlist.insert(playerlist:value_type(pnoderobot-getname(),pnoderobot); / create ogrehead entity and attach it to a scenenode pnodeh

37、ead = mscenemgr-getrootscenenode()-createchild(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 attach it

38、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-attachobject(pentityrazor); mplayerlist.insert(playerlist:value_

39、type(pnoderazor-getname(),pnoderazor); /创建myframelistener void createframelistener(void) mframelistener= new myframelistener(mwindow, mcamera, &mplayerlist); mroot-addframelistener(mframelistener); / 重新实现基类的createcamera函数,关键是让摄象机与其所在场景节点的相对位置为0,100,0。即高100个长度单位,防止摄象机在entity的肚子里出现。 virtual void creat

40、ecamera(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-lookat(vector3(0,0,-300); mcamera-setnearclipdistance(5); ; 为了让例子简单一点,这里采用的是前面讲的第二种眼睛与身体的组合方法,摄象机与entity的

41、相对位置是靠摄象机的setposition函数完成的,这样做并不是一个很好的方法。建议大家将本例改为前面讲的第一种眼睛与身体的组合方法,将摄象机与entity的相对位置关系交给场景节点去做,那样摄象机的位置就可以设置为0,0,0。 事情还没有结束,因为摄象机是属于player的了,我们就不能让键盘再控制摄象机将他移出身体以外,所以需要更改exampleframelistener.h中framestarted函数的代码,因为exampleframelistener.h是ogre应用框架的一部分,所以请注意copy该文件,再更改。 找到framestarted函数中的如下代码: mcamera-y

42、aw(rotx); mcamera-pitch(roty); mcamera-moverelative(vec); 将最后一行注释掉,即可以让摄象机可以受鼠标控制旋转(东张西望?),但不能移动。光本文来自csdn博客,转载请标明出处:/pizi0475/archive/2010/04/06/5452371.aspxnxogre缓冲摄像机(及摄像机抖动解决办法) 收藏 重新对摄像机进行了封装,增加了缓冲功能,使赛车的操作真实感提升了不少,关于缓冲摄像机可以参考ogre wiki上的第三人称摄像机那篇文章其原理是: 使用两个scenenode, 一个绑定摄像机

43、,另一个用来绑定代表赛车的节点, 赛车移动的时候摄像机的位置始终以一定速度向赛车节点靠近,这个速度跟摄像机与赛车子节点的全局坐标距离成正比.并不断跟新两节点位置.关于摄像机更新抖动的问题,nxogre和ogre使用两个不同的framelistener来更新场景,可能会使帧更新一致,我的解决办法是在创建nxogre:scene的时候将mprocessingpriority = xogre:enums:priority_low设置成最低优先级,即不对场景进行处理(默认情况下为priority_medium),之后再手动更新场景mscene-advance(timesincelastframe *

44、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渲染同步,避免摄像机抖动现象并在update调用mscene-advance(timesincelastframe * 0.075, nxogre:enums:priority_low);*/

45、desc.mprocessingpriority = nxogre:enums:priority_low;mscene = mworld-createscene(desc);摄像机的封装#ifndef _vehiclecamera_h_#define _vehiclecamera_h_#include #include #include util.h/*赛车缓冲摄像机原理:使用两个scenenode, 一个绑定摄像机,另一个用来绑定代表赛车的节点, 赛车移动的时候摄像机的位置始终以一定速度向赛车节点靠近,这个速度跟摄像机与赛车子节点的全局坐标距离成正比.并不断跟新两节点位置.例如: 在这里每2

46、0帧跟新一次两节点坐标(与赛车同步),并更新节点相对位置./ 根据当前赛车速度和帧数来设定缓冲大小if (isboundingcamera() float speed = getspeed() / 30; / 提供刹车时的缓冲 if (speed update(timesincelastframe * speed) ;*/class vehiclecamerapublic: vehiclecamera(const std:string &playername); vehiclecamera(); / 设置摄像机缓冲程度值越大越硬,越小越柔和 void settightness ( real t

47、ightness ); float gettightness ( ) const; / 设定绑定节点, cameranode为赛车上摄像机位置的节点, lookatnode为赛车上车体的节点 void settarget ( ogre:scenenode*cameranode, ogre:scenenode* lookatnode ); / 手动更新节点位置, 与赛车同步 void instantupdate ( ); void update ( float timesincelastframe );private: ogre:scenenode *mbasecamernode; ogre:s

48、cenenode *mbaselookedatnode; ogre:scenenode *mcameralookatnode; ogre:scenenode *mcameranode; ogre:camera *mcamera; / 设置摄像机缓冲程度值越大越硬,越小越柔和 float mtightness;#endif实现:#include vehiclecamera.hvehiclecamera:vehiclecamera(const std:string &playername) : mtightness(2.0), mcameranode(0), mcameralookatnode(0

49、), mbaselookedatnode(0), mbasecamernode(0) ogre:scenemanager* scenemgr = util:getscenemanager(); mcamera = util:getscenemanager()-createcamera( playername + vehiclecamera); mcamera-setnearclipdistance ( 0.1f ); util:removeallviewports(); ogre:viewport*viewport = util:addviewport(mcamera); mcamera-setaspectratio(real(viewport-getactualwidth() / real(viewport-getactualheight(); / 构造绑定摄像机的节点 mcameranode = scenemgr-getrootscenenode()-createchildscenenode(); mcameralookatnode = scenemgr-getrootscenenode()-createchildscenenode(

温馨提示

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

评论

0/150

提交评论