![中攝像機(jī)函數(shù)匯總_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/b94980eb-f349-4712-83ff-615ee6a3533f/b94980eb-f349-4712-83ff-615ee6a3533f1.gif)
![中攝像機(jī)函數(shù)匯總_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/b94980eb-f349-4712-83ff-615ee6a3533f/b94980eb-f349-4712-83ff-615ee6a3533f2.gif)
![中攝像機(jī)函數(shù)匯總_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/b94980eb-f349-4712-83ff-615ee6a3533f/b94980eb-f349-4712-83ff-615ee6a3533f3.gif)
![中攝像機(jī)函數(shù)匯總_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/b94980eb-f349-4712-83ff-615ee6a3533f/b94980eb-f349-4712-83ff-615ee6a3533f4.gif)
![中攝像機(jī)函數(shù)匯總_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/b94980eb-f349-4712-83ff-615ee6a3533f/b94980eb-f349-4712-83ff-615ee6a3533f5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.ogre中攝像機(jī)的一些相關(guān)函數(shù)/創(chuàng)建攝像機(jī)/sceneManager是一個(gè)已經(jīng)存在的場景管理器實(shí)例的指針。/我們?cè)谶@里構(gòu)建名稱為“MainCam”的攝像機(jī)。Camera *camera = sceneMgr->createCamera(“MainCam”);/并不需要計(jì)算什么,可以直接從視口中得到這個(gè)尺寸 這里現(xiàn)實(shí)視口比例是4:3camera->setAspectRatio(1.333333f);/30度角可以讓我們看到一個(gè)長而遠(yuǎn)的視野 camera->setFOVy(30.0f); /圖上W是這里的角度camera->setNearClipDistance(5.0f
2、); /攝像機(jī)到平面xy的距離camera->setFarClipDistance(1000.0f);/攝像機(jī)到平面x'y'的距離/設(shè)置渲染模式 下面分別對(duì)應(yīng)點(diǎn)線 點(diǎn) 實(shí)體渲染camera->setPolygonMode(PM_WIREFRAME);camera->setPolygonMode(PM_POINTS);camera->setPolygonMode(PM_SOLOD);PolygonMode mode = camera->getPolygonMode(); /這個(gè)不用講了/攝像機(jī)的位置變換/確認(rèn)我們已經(jīng)有一個(gè)指向“Camera”類型實(shí)例
3、的指針camera。camera->setPosition(200, 10, 200);/也可以用一個(gè)三維向量來設(shè)置攝像機(jī)坐標(biāo),在我們得到場景坐標(biāo)時(shí)候這么做會(huì)方便一些/camera->setPosition(Vector3(200, 10, 200);/假設(shè)攝像機(jī)還在我們之前設(shè)置的200, 10, 200空間位置上。camera->move(10, 0, 0); /攝像機(jī)移動(dòng)到210, 10, 200camera->moveRelative(0, 0, 10); /攝像機(jī)移動(dòng)到210, 10, 210/move ,moveRelative與 setPosition的區(qū)別
4、 /setPosition設(shè)置攝像機(jī)的絕對(duì)坐標(biāo) move和moveRelative是把攝像機(jī)移動(dòng)到當(dāng)前位置的相對(duì)位置上/moveRelative與move的區(qū)別 前者是在攝像機(jī)的本地坐標(biāo)移動(dòng) 假設(shè)攝像機(jī)像右旋轉(zhuǎn)90度 在向前移動(dòng)10/個(gè)單位,那么本地坐標(biāo)是向Z方向移動(dòng)10 而世界坐標(biāo)是像X方向移動(dòng)10個(gè)單位/指向,方向,LookAtvoid setDirection(Real x, Real y, Real z);void setDirection(const Vector3& vec);Vector3 getDirection(void) const; Vector3 getUp(v
5、oid) const;Vector3 getRight(void) const;void lookAt( const Vector3& angle);void lookAt(Real x, Real y, Real z);void roll(const Radian& angle); /滾動(dòng)繞Z軸 右手法則 旋轉(zhuǎn) 即逆時(shí)針void roll (Real degrees)roll (Angle ( degrees ) );void yaw(const Radian& angle); /偏航繞Y軸void yaw(Real degrees)yaw (Angle ( degr
6、ees ) );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 useFixed, const Vector3 &fixe
7、dAxis=Vector3:UNIT_Y) /設(shè)置Y軸自由度 不能繞Y軸旋轉(zhuǎn) const Quaternion & getOrientation (void) const void setOrientation(const Quaternion& q);/自動(dòng)跟蹤/*方法中第一個(gè)參數(shù)確定是否打開自動(dòng)跟蹤,在任何一幀渲染之前都可以重新設(shè)置它。并且需要注意在關(guān)掉自動(dòng)跟蹤之前,要確保所被跟蹤的節(jié)點(diǎn)沒有被刪除(否則系統(tǒng)會(huì)拋出異常)。方法的第二個(gè)參數(shù)是被跟蹤節(jié)點(diǎn)得指針,除非你第一個(gè)參數(shù)是false(這時(shí)候可以用NULL),否則你必須確定調(diào)用的時(shí)候指針指向的節(jié)點(diǎn)必須有效。有時(shí)候你可能發(fā)現(xiàn)你
8、所要跟蹤的物體太大了,以至于你都不知道“看”哪里才好,這時(shí)候你可以設(shè)置第三個(gè)參數(shù)來定著眼點(diǎn),它是一個(gè)本地空間中相對(duì)于場景節(jié)點(diǎn)的定位點(diǎn)。*/void setAutoTracking(bool enabled,SceneNode *target=0,const Vector3 &offset=Vector3:ZERO);/得到攝像機(jī)相關(guān)信息const Quaternion& getDerivedOrientation(void) const;const Vector3& getDerivedPosition(void) const;Vector3 getDerivedDir
9、ection(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 getRealRight(void) const;
10、 /* 其中有“Real”關(guān)鍵字的方法返回的是世界空間的坐標(biāo),而擁有“Derived”關(guān)鍵字的方法的返回值是在“軸綁定”的本地坐標(biāo)系中(也就是說這個(gè)坐標(biāo)系原點(diǎn)是攝像機(jī)所在的點(diǎn),而它的軸向和世界坐標(biāo)系相同)。*/Ogre攝像機(jī)Camera類 收藏 Camera類 對(duì)攝象機(jī)的抽象。成員函數(shù)說明如下: 標(biāo)準(zhǔn)構(gòu)造函數(shù)Camera(String name, SceneManager* sm);標(biāo)準(zhǔn)析構(gòu)函數(shù)virtual Camera();返回渲染該攝像機(jī)的scenemanager的指針SceneManager* getSceneManager(void) const;取得攝像機(jī)的
11、名字virtual const String& getName(void) const;設(shè)定投影模式(正射或透視),缺省為透視void setProjectionType(ProjectionType pt);取得使用的投影模式的信息ProjectionType getProjectionType(void) const;設(shè)定該攝像機(jī)需要的渲染細(xì)節(jié)級(jí)別void setDetailLevel(SceneDetailLevel sd);取得該攝像機(jī)的渲染細(xì)節(jié)級(jí)別SceneDetailLevel getDetailLevel(void) const;設(shè)定攝像機(jī)的位置void setPosit
12、ion(Real x, Real y, Real z);void setPosition(const Vector3& vec);取得攝像機(jī)的位置const Vector3& getPosition(void) const;移動(dòng)攝像機(jī)void move(const Vector3& vec);void moveRelative(const Vector3& vec);設(shè)定攝像機(jī)的方向向量void setDirection(Real x, Real y, Real z);void setDirection(const Vector3& vec);取得攝像機(jī)
13、的方向Vector3 getDirection(void) const;這是一個(gè)輔助方法用來自動(dòng)計(jì)算攝像機(jī)的方向向量,在當(dāng)前位置和所看的點(diǎn),參數(shù)targetPoint是一個(gè)向量指明所看的點(diǎn)。void lookAt( const Vector3& targetPoint );void lookAt(Real x, Real y, Real z);將攝像機(jī)繞z軸逆時(shí)針旋轉(zhuǎn)指定角度void roll(Real degrees);繞y軸逆時(shí)針旋轉(zhuǎn)指定角度void yaw(Real degrees);繞x軸上下逆時(shí)針旋轉(zhuǎn)void pitch(Real degrees);旋轉(zhuǎn)任意角度void ro
14、tate(const Vector3& axis, Real degrees);使用四元組繞任意軸旋轉(zhuǎn)void rotate(const Quaternion& q);指定攝像機(jī)是繞本地y軸還是指定的固定軸旋轉(zhuǎn)void setFixedYawAxis( bool useFixed, const Vector3& fixedAxis = Vector3:UNIT_Y );設(shè)定y方向的視野域,水平方向的視野域?qū)⒁来擞?jì)算void setFOVy(Real fovy);取得y方向的視野域Real getFOVy(void) const;設(shè)定到近裁減面的距離void setNea
15、rClipDistance(Real nearDist);取得到近裁減面的距離Real getNearClipDistance(void) const;設(shè)定到遠(yuǎn)裁減面的距離void setAspectRatio(Real ratio);取得當(dāng)前縱橫比Real getAspectRatio(void) const;內(nèi)部使用,取得該攝像機(jī)的投影矩陣const Matrix4& getProjectionMatrix(void);內(nèi)部使用,取得該攝像機(jī)的觀察矩陣const Matrix4& getViewMatrix(void);取得平截臺(tái)體的特定面const Plane&
16、getFrustumPlane( FrustumPlane plane );測試給定的包容器是否在平截臺(tái)體中bool isVisible(const AxisAlignedBox& bound, FrustumPlane* culledBy = 0);bool isVisible(const Sphere& bound, FrustumPlane* culledBy = 0);測試給定的頂點(diǎn)是否在平截臺(tái)體中bool isVisible(const Vector3& vert, FrustumPlane* culledBy = 0);返回?cái)z像機(jī)的當(dāng)前方向const Qua
17、ternion& getOrientation(void) const;設(shè)定攝像機(jī)的方向void setOrientation(const Quaternion& q);輸出流功能friend std:ostream& operator<<(std:ostream& o, Camera& c);取得攝像機(jī)繼承的方向,包括從附著節(jié)點(diǎn)繼承的任何旋轉(zhuǎn)Quaternion getDerivedOrientation(void);取得繼承的位置,包括從附著節(jié)點(diǎn)繼承的任何平移Vector3 getDerivedPosition(void);取得繼承的方向
18、向量Vector3 getDerivedDirection(void);覆蓋MovableObject的方法void _notifyCurrentCamera(Camera* cam);const AxisAlignedBox& getBoundingBox(void) const;void _updateRenderQueue(RenderQueue* queue);const String getMovableType(void) const; 使能/使不能自動(dòng)跟蹤scenenodevoid setAutoTracking(bool enabled, SceneNode* targ
19、et = 0, const Vector3& offset = Vector3:ZERO);攝象機(jī) OGRE中的攝象機(jī)支持透視投影(缺省投影方式、近大遠(yuǎn)?。┖驼渫队埃ù笮∨c距離無關(guān),是CAD設(shè)計(jì)中的常用投影方式)。攝象機(jī)還支持線畫模式、紋理模式、灰度陰影模式等幾種渲染模式。OGRE場景中可以有多臺(tái)攝象機(jī),可以將攝象機(jī)“看到”的結(jié)果渲染到多個(gè)窗口,甚至還能實(shí)現(xiàn)分屏和畫中畫功能。OGRE中的攝象機(jī)可以獨(dú)立于場景節(jié)點(diǎn)樹(攝象機(jī)本身也具有位置、旋轉(zhuǎn)屬性及控制方法),也可以被attach到場景節(jié)點(diǎn)上,通過對(duì)場景節(jié)點(diǎn)的控制來達(dá)到對(duì)攝象機(jī)的控制。Camera類 對(duì)攝象機(jī)的抽象。成員函數(shù)說明如下:
20、標(biāo)準(zhǔn)構(gòu)造函數(shù)Camera(String name, SceneManager* sm);標(biāo)準(zhǔn)析構(gòu)函數(shù)virtual Camera();返回渲染該攝像機(jī)的scenemanager的指針SceneManager* getSceneManager(void) const;取得攝像機(jī)的名字virtual const String& getName(void) const;設(shè)定投影模式(正射或透視),缺省為透視void setProjectionType(ProjectionType pt);取得使用的投影模式的信息ProjectionType getProjectionType(void) c
21、onst;設(shè)定該攝像機(jī)需要的渲染細(xì)節(jié)級(jí)別void setDetailLevel(SceneDetailLevel sd);取得該攝像機(jī)的渲染細(xì)節(jié)級(jí)別SceneDetailLevel getDetailLevel(void) const;設(shè)定攝像機(jī)的位置void setPosition(Real x, Real y, Real z);void setPosition(const Vector3& vec);取得攝像機(jī)的位置const Vector3& getPosition(void) const;移動(dòng)攝像機(jī)void move(const Vector3& vec);vo
22、id moveRelative(const Vector3& vec);設(shè)定攝像機(jī)的方向向量void setDirection(Real x, Real y, Real z);void setDirection(const Vector3& vec);取得攝像機(jī)的方向Vector3 getDirection(void) const;這是一個(gè)輔助方法用來自動(dòng)計(jì)算攝像機(jī)的方向向量,在當(dāng)前位置和所看的點(diǎn),參數(shù)targetPoint是一個(gè)向量指明所看的點(diǎn)。void lookAt( const Vector3& targetPoint );void lookAt(Real x,
23、Real y, Real z);將攝像機(jī)繞z軸逆時(shí)針旋轉(zhuǎn)指定角度void roll(Real degrees);繞y軸逆時(shí)針旋轉(zhuǎn)指定角度void yaw(Real degrees);繞x軸上下逆時(shí)針旋轉(zhuǎn)void pitch(Real degrees);旋轉(zhuǎn)任意角度void rotate(const Vector3& axis, Real degrees);使用四元組繞任意軸旋轉(zhuǎn)void rotate(const Quaternion& q);指定攝像機(jī)是繞本地y軸還是指定的固定軸旋轉(zhuǎn)void setFixedYawAxis( bool useFixed, const Vecto
24、r3& fixedAxis = Vector3:UNIT_Y );設(shè)定y方向的視野域,水平方向的視野域?qū)⒁来擞?jì)算void setFOVy(Real fovy);取得y方向的視野域Real getFOVy(void) const;設(shè)定到近裁減面的距離void setNearClipDistance(Real nearDist);取得到近裁減面的距離Real getNearClipDistance(void) const;設(shè)定到遠(yuǎn)裁減面的距離void setAspectRatio(Real ratio);取得當(dāng)前縱橫比Real getAspectRatio(void) const;內(nèi)部使用
25、,取得該攝像機(jī)的投影矩陣const Matrix4& getProjectionMatrix(void);內(nèi)部使用,取得該攝像機(jī)的觀察矩陣const Matrix4& getViewMatrix(void);取得平截臺(tái)體的特定面const Plane& getFrustumPlane( FrustumPlane plane );測試給定的包容器是否在平截臺(tái)體中bool isVisible(const AxisAlignedBox& bound, FrustumPlane* culledBy = 0);bool isVisible(const Sphere&
26、; bound, FrustumPlane* culledBy = 0);測試給定的頂點(diǎn)是否在平截臺(tái)體中bool isVisible(const Vector3& vert, FrustumPlane* culledBy = 0);返回?cái)z像機(jī)的當(dāng)前方向const Quaternion& getOrientation(void) const;設(shè)定攝像機(jī)的方向void setOrientation(const Quaternion& q);輸出流功能friend std:ostream& operator<<(std:ostream& o, Ca
27、mera& c);取得攝像機(jī)繼承的方向,包括從附著節(jié)點(diǎn)繼承的任何旋轉(zhuǎn)Quaternion getDerivedOrientation(void);取得繼承的位置,包括從附著節(jié)點(diǎn)繼承的任何平移Vector3 getDerivedPosition(void);取得繼承的方向向量Vector3 getDerivedDirection(void);覆蓋MovableObject的方法void _notifyCurrentCamera(Camera* cam);const AxisAlignedBox& getBoundingBox(void) const;void _updateRen
28、derQueue(RenderQueue* queue);const String getMovableType(void) const;使能/使不能自動(dòng)跟蹤scenenodevoid setAutoTracking(bool enabled, SceneNode* target = 0, const Vector3& offset = Vector3:ZERO); Camera使用舉例一 打開OGRE提供的Demo_EnvMapping那個(gè)例子程序,運(yùn)行之。對(duì)于這個(gè)例子我們應(yīng)該很熟悉了,通過鍵盤和鼠標(biāo)可以控制攝象機(jī)在場景中漫游,那么攝象機(jī)的創(chuàng)建代碼在哪里呢?從EnvMapping.h
29、和EnvMapping.cpp中都找不到創(chuàng)建攝象機(jī)的代碼!不要忘了我們是基于OGRE的應(yīng)用框架建立的這個(gè)例子,在OGRE應(yīng)用框架的ExampleApplication.h里為我們創(chuàng)建了攝象機(jī),打開ExampleApplication.h文件可以發(fā)現(xiàn)如下函數(shù):virtual void createCamera(void) / 創(chuàng)建攝象機(jī) mCamera = mSceneMgr->createCamera("PlayerCam"); / 將該攝象機(jī)放到0,0,500位置上 mCamera->setPosition(Vector3(0,0,500); / 讓攝象機(jī)“看
30、”向Z軸負(fù)方向(從屏幕外向屏幕里)以模擬你的眼睛 mCamera->lookAt(Vector3(0,0,-300); / 設(shè)置攝象機(jī)平截臺(tái)體的“近面”距離mCamera->setNearClipDistance(5);每一個(gè)通過OGRE應(yīng)用框架創(chuàng)建的應(yīng)用程序都會(huì)擁有一個(gè)通過ExampleApplication類的createCamera函數(shù)創(chuàng)建出來的攝象機(jī),該攝象機(jī)站在0,0,500位置上看向場景中心。攝象機(jī)的創(chuàng)建代碼有了,那通過鼠標(biāo)和鍵盤控制攝象機(jī)在場景中漫游的代碼在哪里呢?在OGRE應(yīng)用框架中ExampleFrameListener類的frameStarted函數(shù)里。該函數(shù)又
31、調(diào)用processUnbufferedInput函數(shù),我們可以在processUnbufferedInput函數(shù)中發(fā)現(xiàn)如下代碼:mInputDevice->capture();(省略若干行)mCamera->yaw(rotX);mCamera->pitch(rotY);mCamera->moveRelative(vec);首先獲取鼠標(biāo)狀態(tài),而后根據(jù)該狀態(tài)計(jì)算攝象機(jī)的旋轉(zhuǎn)和移動(dòng)量,最后通過Camera的幾個(gè)控制方法控制其運(yùn)動(dòng)。注意到這里的攝象機(jī)是獨(dú)立于場景節(jié)點(diǎn)樹之外的。我們已經(jīng)了解到場景節(jié)點(diǎn)樹上可以掛接Entity、攝象機(jī)和光。通過對(duì)場景節(jié)點(diǎn)的空間位置控制可以達(dá)到改變其下
32、掛接的Entity、攝象機(jī)和光的位置的目的。但注意Entity和攝象機(jī)不一樣。在OGRE引擎的設(shè)計(jì)中Entity是完全沒有移動(dòng)、旋轉(zhuǎn)等能力的,所以它只能把這些任務(wù)交給場景節(jié)點(diǎn)來完成,而攝象機(jī)具有移動(dòng)和旋轉(zhuǎn)函數(shù),所以它并不一定要完全靠場景節(jié)點(diǎn)來完成這些任務(wù)。這就引出一個(gè)有趣的話題,攝象機(jī)放到場景節(jié)點(diǎn)中和不放進(jìn)去的區(qū)別究竟有多大。一般來講,攝象機(jī)如果不放在場景節(jié)點(diǎn)中,它就非常自由,程序員可以用程序任意控制它,就象在這個(gè)例子中一樣。想象一下在CS中,你犧牲后,你依然可以控制你的眼睛(靈魂?攝象機(jī)?)在場景中穿墻過屋,并為同伴通風(fēng)報(bào)信,就可以體會(huì)到這種自由。而如果把攝象機(jī)掛接到場景節(jié)點(diǎn)中,那么攝象機(jī)就
33、和此節(jié)點(diǎn)和同在本節(jié)點(diǎn)下的其它Entity綁在一起了,一般在這種情況下就不再直接操作攝象機(jī)移動(dòng)位置,而是和Entity一樣交給場景節(jié)點(diǎn)來做。墻上來回轉(zhuǎn)動(dòng)的監(jiān)視器就是由掛接在同一節(jié)點(diǎn)下的Entity(監(jiān)視器模型)和攝象機(jī)組成的。還有場景中的人,他們的身體(Entity)和眼睛(Camera)總是在一起,就因?yàn)樗麄兺瑢儆谝粋€(gè)場景節(jié)點(diǎn)。 “人”的組織方法一 “人”的組織方法二以上兩圖都將Camera放到了節(jié)點(diǎn)下,都可以實(shí)現(xiàn)身體和眼睛的同步。但第一種方法更好,因?yàn)榈诙N方法眼睛和身體同屬于一個(gè)場景節(jié)點(diǎn),它們之間無法實(shí)現(xiàn)相對(duì)位移,那么眼睛就可能會(huì)長在人的肚子里(節(jié)點(diǎn)的空間中心)。將攝象機(jī)放到場景節(jié)點(diǎn)樹中的
34、做法使用也很普遍,下一個(gè)例子里我們將看到這樣的情況。Camera使用舉例二思路 實(shí)現(xiàn)如下的場景節(jié)點(diǎn)樹: 在該節(jié)點(diǎn)樹中有一個(gè)食人魔、一個(gè)機(jī)器人和一架飛機(jī)。通過FrameListener來控制這三個(gè)Player都在自動(dòng)旋轉(zhuǎn)。通過按TAB鍵把Camera輪流掛接到三個(gè)Player所在的節(jié)點(diǎn)上,這樣我們就會(huì)發(fā)現(xiàn)屏幕上會(huì)出現(xiàn)不同Player的以各自的視角所看到的世界。為了便于對(duì)Player的控制,程序中使用一個(gè)std:map來保存Player列表,該列表中保存每個(gè)Player的所屬節(jié)點(diǎn)名稱和節(jié)點(diǎn)指針。部分代碼/ myExample.h/ 定義PlayerListtypedef std:map<st
35、d:string,SceneNode*> PlayerList;/ 由應(yīng)用框架中的ExampleFrameListener派生出myFrameListenerclass myFrameListener : public ExampleFrameListenerprotected: / 接收myapp傳過來的Player列表,以在這里控制其旋轉(zhuǎn)PlayerList *mPlayerList; / 保存當(dāng)前Player的迭代子PlayerList:iterator currentPlayer;public: myFrameListener(RenderWindow* win, Camera*
36、 cam, PlayerList *pPlayerList) : ExampleFrameListener(win, cam) mPlayerList = pPlayerList; / 缺省Player是列表中的第一人 currentPlayer = mPlayerList->begin(); / 將攝象機(jī)掛接到該P(yáng)layer所在的場景節(jié)點(diǎn)currentPlayer->second->attachCamera(mCamera); bool frameStarted(const FrameEvent& evt) / 對(duì)TAB鍵的反應(yīng) if (mInputDevice-&
37、gt;isKeyDown(KC_TAB) / 把攝象機(jī)從當(dāng)前Player上卸下來 currentPlayer->second->detachObject(mCamera->getName(); / 切換當(dāng)前PlayercurrentPlayer+; if(currentPlayer = mPlayerList->end() currentPlayer = mPlayerList->begin(); / 再把攝象機(jī)掛接到當(dāng)前Player上來。 currentPlayer->second->attachObject(mCamera); / 讓不同Playe
38、r以不同的速度旋轉(zhuǎn) mPlayerList->find("Robot")->second->yaw(evt.timeSinceLastFrame * 30); mPlayerList->find("Head")->second->yaw(evt.timeSinceLastFrame * -60); mPlayerList->find("Razor")->second->yaw(evt.timeSinceLastFrame * 120); / 調(diào)用基類的frameStarted函數(shù)
39、return ExampleFrameListener:frameStarted(evt); ;/ 由應(yīng)用框架的ExampleApplication派生出myAppclass myApp :public ExampleApplicationpublic: myApp()protected: / Player列表 PlayerList mPlayerList; / 創(chuàng)建場景 void createScene(void) SceneNode *pNodeRobot,*pNodeHead,*pNodeRazor; / 設(shè)置環(huán)境光 mSceneMgr->setAmbientLight(Colou
40、rValue(1, 1, 1); / 創(chuàng)建天空盒 mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox", 50 ); / 以下代碼創(chuàng)建場景樹 / Create Robot Entity and attach it to a SceneNode pNodeRobot = mSceneMgr->getRootSceneNode()->createChild("Robot"); Entity *pEntityRobot = mSceneMgr->createEntity("Robo
41、t", "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()->createChild("Head"); pNodeHead-
42、>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 to a SceneNode pNodeRazo
43、r = 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); mPla
44、yerList.insert(PlayerList:value_type(pNodeRazor->getName(),pNodeRazor); /創(chuàng)建myFrameListener void createFrameListener(void) mFrameListener= new myFrameListener(mWindow, mCamera, &mPlayerList); mRoot->addFrameListener(mFrameListener); / 重新實(shí)現(xiàn)基類的createCamera函數(shù),關(guān)鍵是讓攝象機(jī)與其所在場景節(jié)點(diǎn)的相對(duì)位置為0,100,0。即高100
45、個(gè)長度單位,防止攝象機(jī)在Entity的肚子里出現(xiàn)。 virtual void createCamera(void) / Create the camera mCamera = mSceneMgr->createCamera("PlayerCam"); / 設(shè)置攝象機(jī)位置 /mCamera->setPosition(Vector3(0,0,500); mCamera->setPosition(Vector3(0,100,0); / Look back along -Z mCamera->lookAt(Vector3(0,0,-300); mCamera
46、->setNearClipDistance(5); ; 為了讓例子簡單一點(diǎn),這里采用的是前面講的第二種眼睛與身體的組合方法,攝象機(jī)與Entity的相對(duì)位置是靠攝象機(jī)的setPosition函數(shù)完成的,這樣做并不是一個(gè)很好的方法。建議大家將本例改為前面講的第一種眼睛與身體的組合方法,將攝象機(jī)與Entity的相對(duì)位置關(guān)系交給場景節(jié)點(diǎn)去做,那樣攝象機(jī)的位置就可以設(shè)置為0,0,0。 事情還沒有結(jié)束,因?yàn)閿z象機(jī)是屬于Player的了,我們就不能讓鍵盤再控制攝象機(jī)將他移出身體以外,所以需要更改ExampleFrameListener.h中frameStarted函數(shù)的代碼,因?yàn)镋xampleFram
47、eListener.h是OGRE應(yīng)用框架的一部分,所以請(qǐng)注意copy該文件,再更改。 找到frameStarted函數(shù)中的如下代碼: mCamera->yaw(rotX); mCamera->pitch(rotY); mCamera->moveRelative(vec); 將最后一行注釋掉,即可以讓攝象機(jī)可以受鼠標(biāo)控制旋轉(zhuǎn)(東張西望?),但不能移動(dòng)。光本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:NxOgre緩沖攝像機(jī)(及攝像機(jī)抖動(dòng)解決辦法) 收藏 重新對(duì)攝像機(jī)進(jìn)行了封裝,增加了緩沖功能,使賽車的操作真實(shí)感提升了不少,關(guān)于緩沖攝像機(jī)可以參考Ogre wiki上的第三人稱攝像機(jī)那篇文章
48、其原理是: 使用兩個(gè)SceneNode, 一個(gè)綁定攝像機(jī),另一個(gè)用來綁定代表賽車的節(jié)點(diǎn), 賽車移動(dòng)的時(shí)候攝像機(jī)的位置始終以一定速度向賽車節(jié)點(diǎn)靠近,這個(gè)速度跟攝像機(jī)與賽車子節(jié)點(diǎn)的全局坐標(biāo)距離成正比.并不斷跟新兩節(jié)點(diǎn)位置.關(guān)于攝像機(jī)更新抖動(dòng)的問題,NxOgre和Ogre使用兩個(gè)不同的FrameListener來更新場景,可能會(huì)使幀更新一致,我的解決辦法是在創(chuàng)建NxOgre:Scene的時(shí)候?qū)ProcessingPriority = xOgre:Enums:Priority_Low設(shè)置成最低優(yōu)先級(jí),即不對(duì)場景進(jìn)行處理(默認(rèn)情況下為Priority_Medium),之后再手動(dòng)更新場景mScene-&
49、gt;advance(timeSinceLastFrame * 0.015, NxOgre:Enums:Priority_Low); /創(chuàng)建場景,并設(shè)置場景基本屬性NxOgre:SceneDescription desc;/設(shè)置重力desc.mGravity = NxOgre:Vec3(0.0f, -9.8f, 0.0f);desc.mName = "Racing World"/*注:(mProcessingPriority參數(shù)默認(rèn)為中等)設(shè)置不更新場景,保持與Ogre渲染同步,避免攝像機(jī)抖動(dòng)現(xiàn)象并在update調(diào)用mScene->advance(timeSinceL
50、astFrame * 0.075, NxOgre:Enums:Priority_Low);*/desc.mProcessingPriority = NxOgre:Enums:Priority_Low;mScene = mWorld->createScene(desc);攝像機(jī)的封裝#ifndef _VEHICLECAMERA_H_#define _VEHICLECAMERA_H_#include <Ogre.h>#include <string>#include "Util.h"/*賽車緩沖攝像機(jī)原理:使用兩個(gè)SceneNode, 一個(gè)綁定攝像
51、機(jī),另一個(gè)用來綁定代表賽車的節(jié)點(diǎn), 賽車移動(dòng)的時(shí)候攝像機(jī)的位置始終以一定速度向賽車節(jié)點(diǎn)靠近,這個(gè)速度跟攝像機(jī)與賽車子節(jié)點(diǎn)的全局坐標(biāo)距離成正比.并不斷跟新兩節(jié)點(diǎn)位置.例如: 在這里每20幀跟新一次兩節(jié)點(diǎn)坐標(biāo)(與賽車同步),并更新節(jié)點(diǎn)相對(duì)位置./ 根據(jù)當(dāng)前賽車速度和幀數(shù)來設(shè)定緩沖大小if (isBoundingCamera() float speed = getSpeed() / 30; / 提供剎車時(shí)的緩沖 if (speed < 1.0f) speed = 1.0f; / 時(shí)時(shí)跟新攝像機(jī), mVehicleCamer->update(timeSinceLastFrame * spe
52、ed) ;*/class VehicleCamerapublic: VehicleCamera(const std:string &playerName); VehicleCamera(); / 設(shè)置攝像機(jī)緩沖程度值越大越硬,越小越柔和 void setTightness ( Real tightness ); float getTightness ( ) const; / 設(shè)定綁定節(jié)點(diǎn), cameraNode為賽車上攝像機(jī)位置的節(jié)點(diǎn), lookAtNode為賽車上車體的節(jié)點(diǎn) void setTarget ( Ogre:SceneNode*cameraNode, Ogre:SceneN
53、ode* lookAtNode ); / 手動(dòng)更新節(jié)點(diǎn)位置, 與賽車同步 void instantUpdate ( ); void update ( float timeSinceLastFrame );private: Ogre:SceneNode *mBaseCamerNode; Ogre:SceneNode *mBaseLookedAtNode; Ogre:SceneNode *mCameraLookAtNode; Ogre:SceneNode *mCameraNode; Ogre:Camera *mCamera; / 設(shè)置攝像機(jī)緩沖程度值越大越硬,越小越柔和 float mTightn
54、ess;#endif實(shí)現(xiàn):#include "VehicleCamera.h"VehicleCamera:VehicleCamera(const std:string &playerName) : mTightness(2.0), mCameraNode(0), mCameraLookAtNode(0), mBaseLookedAtNode(0), mBaseCamerNode(0) Ogre:SceneManager* sceneMgr = Util:getSceneManager(); mCamera = Util:getSceneManager()->c
55、reateCamera( playerName + "VehicleCamera"); mCamera->setNearClipDistance ( 0.1f ); Util:removeAllViewports(); Ogre:Viewport*viewport = Util:addViewport(mCamera); mCamera->setAspectRatio(Real(viewport->getActualWidth() / Real(viewport->getActualHeight(); / 構(gòu)造綁定攝像機(jī)的節(jié)點(diǎn) mCameraNode = sceneMgr->getRootSceneNode()->createChil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年四年級(jí)英語下冊(cè) Unit 3 What can you see第2課時(shí)說課稿 湘少版
- 7《美麗的化學(xué)變化》說課稿-2023-2024學(xué)年科學(xué)六年級(jí)下冊(cè)教科版
- 2025計(jì)算機(jī)購銷合同樣書
- 2025勞動(dòng)合同法課程學(xué)習(xí)指南
- 2024年高中化學(xué) 專題3 常見的烴 第一單元 第1課時(shí) 脂肪烴的類別、烷烴說課稿 蘇教版選修5001
- 2憲法是根本法 第一課時(shí) 感受憲法日(說課稿)-部編版道德與法治六年級(jí)上冊(cè)
- 醫(yī)療試劑合同范例
- 包工項(xiàng)目合同范本
- 化妝店加盟合同范例
- 2024-2025學(xué)年高中地理 第二章 區(qū)域可持續(xù)發(fā)展 2.4 農(nóng)業(yè)的可持續(xù)發(fā)展-以美國為例說課稿 湘教版必修3
- 唐山動(dòng)物園景觀規(guī)劃設(shè)計(jì)方案
- 中國版梅尼埃病診斷指南解讀
- 創(chuàng)業(yè)投資管理知到章節(jié)答案智慧樹2023年武漢科技大學(xué)
- 暨南大學(xué)《經(jīng)濟(jì)學(xué)》考博歷年真題詳解(宏觀經(jīng)濟(jì)學(xué)部分)
- GB/T 8014.1-2005鋁及鋁合金陽極氧化氧化膜厚度的測量方法第1部分:測量原則
- eNSP簡介及操作課件
- 公文與公文寫作課件
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第七章運(yùn)動(dòng)技能的協(xié)調(diào)控制
- 節(jié)后復(fù)工吊籃驗(yàn)收表格
- 醫(yī)療器械分類目錄2002版
- 氣管套管滑脫急救知識(shí)分享
評(píng)論
0/150
提交評(píng)論