版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、.ogre中攝像機的一些相關函數(shù)/創(chuàng)建攝像機/sceneManager是一個已經存在的場景管理器實例的指針。/我們在這里構建名稱為“MainCam”的攝像機。Camera *camera = sceneMgr->createCamera(“MainCam”);/并不需要計算什么,可以直接從視口中得到這個尺寸 這里現(xiàn)實視口比例是4:3camera->setAspectRatio(1.333333f);/30度角可以讓我們看到一個長而遠的視野 camera->setFOVy(30.0f); /圖上W是這里的角度camera->setNearClipDistance(5.0f
2、); /攝像機到平面xy的距離camera->setFarClipDistance(1000.0f);/攝像機到平面x'y'的距離/設置渲染模式 下面分別對應點線 點 實體渲染camera->setPolygonMode(PM_WIREFRAME);camera->setPolygonMode(PM_POINTS);camera->setPolygonMode(PM_SOLOD);PolygonMode mode = camera->getPolygonMode(); /這個不用講了/攝像機的位置變換/確認我們已經有一個指向“Camera”類型實例
3、的指針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/move ,moveRelative與 setPosition的區(qū)別
4、 /setPosition設置攝像機的絕對坐標 move和moveRelative是把攝像機移動到當前位置的相對位置上/moveRelative與move的區(qū)別 前者是在攝像機的本地坐標移動 假設攝像機像右旋轉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(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); /滾動繞Z軸 右手法則 旋轉 即逆時針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) /設置Y軸自由度 不能繞Y軸旋轉 const Quaternion & getOrientation (void) const void setOrientation(const Quaternion& q);/自動跟蹤/*方法中第一個參數(shù)確定是否打開自動跟蹤,在任何一幀渲染之前都可以重新設置它。并且需要注意在關掉自動跟蹤之前,要確保所被跟蹤的節(jié)點沒有被刪除(否則系統(tǒng)會拋出異常)。方法的第二個參數(shù)是被跟蹤節(jié)點得指針,除非你第一個參數(shù)是false(這時候可以用NULL),否則你必須確定調用的時候指針指向的節(jié)點必須有效。有時候你可能發(fā)現(xiàn)你
8、所要跟蹤的物體太大了,以至于你都不知道“看”哪里才好,這時候你可以設置第三個參數(shù)來定著眼點,它是一個本地空間中相對于場景節(jié)點的定位點。*/void setAutoTracking(bool enabled,SceneNode *target=0,const Vector3 &offset=Vector3:ZERO);/得到攝像機相關信息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”關鍵字的方法返回的是世界空間的坐標,而擁有“Derived”關鍵字的方法的返回值是在“軸綁定”的本地坐標系中(也就是說這個坐標系原點是攝像機所在的點,而它的軸向和世界坐標系相同)。*/Ogre攝像機Camera類 收藏 Camera類 對攝象機的抽象。成員函數(shù)說明如下: 標準構造函數(shù)Camera(String name, SceneManager* sm);標準析構函數(shù)virtual Camera();返回渲染該攝像機的scenemanager的指針SceneManager* getSceneManager(void) const;取得攝像機的
11、名字virtual const String& getName(void) const;設定投影模式(正射或透視),缺省為透視void setProjectionType(ProjectionType pt);取得使用的投影模式的信息ProjectionType getProjectionType(void) const;設定該攝像機需要的渲染細節(jié)級別void setDetailLevel(SceneDetailLevel sd);取得該攝像機的渲染細節(jié)級別SceneDetailLevel getDetailLevel(void) const;設定攝像機的位置void setPosit
12、ion(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 setDirection(const Vector3& vec);取得攝像機
13、的方向Vector3 getDirection(void) const;這是一個輔助方法用來自動計算攝像機的方向向量,在當前位置和所看的點,參數(shù)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 pitch(Real degrees);旋轉任意角度void ro
14、tate(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(void) const;設定到近裁減面的距離void setNea
15、rClipDistance(Real nearDist);取得到近裁減面的距離Real getNearClipDistance(void) const;設定到遠裁減面的距離void setAspectRatio(Real ratio);取得當前縱橫比Real getAspectRatio(void) const;內部使用,取得該攝像機的投影矩陣const Matrix4& getProjectionMatrix(void);內部使用,取得該攝像機的觀察矩陣const Matrix4& getViewMatrix(void);取得平截臺體的特定面const Plane&
16、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* culledBy = 0);返回攝像機的當前方向const Qua
17、ternion& getOrientation(void) const;設定攝像機的方向void setOrientation(const Quaternion& q);輸出流功能friend std:ostream& operator<<(std:ostream& o, Camera& c);取得攝像機繼承的方向,包括從附著節(jié)點繼承的任何旋轉Quaternion getDerivedOrientation(void);取得繼承的位置,包括從附著節(jié)點繼承的任何平移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; 使能/使不能自動跟蹤scenenodevoid setAutoTracking(bool enabled, SceneNode* targ
19、et = 0, const Vector3& offset = Vector3:ZERO);攝象機 OGRE中的攝象機支持透視投影(缺省投影方式、近大遠小)和正射投影(大小與距離無關,是CAD設計中的常用投影方式)。攝象機還支持線畫模式、紋理模式、灰度陰影模式等幾種渲染模式。OGRE場景中可以有多臺攝象機,可以將攝象機“看到”的結果渲染到多個窗口,甚至還能實現(xiàn)分屏和畫中畫功能。OGRE中的攝象機可以獨立于場景節(jié)點樹(攝象機本身也具有位置、旋轉屬性及控制方法),也可以被attach到場景節(jié)點上,通過對場景節(jié)點的控制來達到對攝象機的控制。Camera類 對攝象機的抽象。成員函數(shù)說明如下:
20、標準構造函數(shù)Camera(String name, SceneManager* sm);標準析構函數(shù)virtual Camera();返回渲染該攝像機的scenemanager的指針SceneManager* getSceneManager(void) const;取得攝像機的名字virtual const String& getName(void) const;設定投影模式(正射或透視),缺省為透視void setProjectionType(ProjectionType pt);取得使用的投影模式的信息ProjectionType getProjectionType(void) c
21、onst;設定該攝像機需要的渲染細節(jié)級別void setDetailLevel(SceneDetailLevel sd);取得該攝像機的渲染細節(jié)級別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);vo
22、id moveRelative(const Vector3& vec);設定攝像機的方向向量void setDirection(Real x, Real y, Real z);void setDirection(const Vector3& vec);取得攝像機的方向Vector3 getDirection(void) const;這是一個輔助方法用來自動計算攝像機的方向向量,在當前位置和所看的點,參數(shù)targetPoint是一個向量指明所看的點。void lookAt( const Vector3& targetPoint );void lookAt(Real x,
23、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, const Vecto
24、r3& 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) const;內部使用
25、,取得該攝像機的投影矩陣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&
26、; 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& operator<<(std:ostream& o, Ca
27、mera& c);取得攝像機繼承的方向,包括從附著節(jié)點繼承的任何旋轉Quaternion getDerivedOrientation(void);取得繼承的位置,包括從附著節(jié)點繼承的任何平移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;使能/使不能自動跟蹤scenenodevoid setAutoTracking(bool enabled, SceneNode* target = 0, const Vector3& offset = Vector3:ZERO); Camera使用舉例一 打開OGRE提供的Demo_EnvMapping那個例子程序,運行之。對于這個例子我們應該很熟悉了,通過鍵盤和鼠標可以控制攝象機在場景中漫游,那么攝象機的創(chuàng)建代碼在哪里呢?從EnvMapping.h
29、和EnvMapping.cpp中都找不到創(chuàng)建攝象機的代碼!不要忘了我們是基于OGRE的應用框架建立的這個例子,在OGRE應用框架的ExampleApplication.h里為我們創(chuàng)建了攝象機,打開ExampleApplication.h文件可以發(fā)現(xiàn)如下函數(shù):virtual void createCamera(void) / 創(chuàng)建攝象機 mCamera = mSceneMgr->createCamera("PlayerCam"); / 將該攝象機放到0,0,500位置上 mCamera->setPosition(Vector3(0,0,500); / 讓攝象機“看
30、”向Z軸負方向(從屏幕外向屏幕里)以模擬你的眼睛 mCamera->lookAt(Vector3(0,0,-300); / 設置攝象機平截臺體的“近面”距離mCamera->setNearClipDistance(5);每一個通過OGRE應用框架創(chuàng)建的應用程序都會擁有一個通過ExampleApplication類的createCamera函數(shù)創(chuàng)建出來的攝象機,該攝象機站在0,0,500位置上看向場景中心。攝象機的創(chuàng)建代碼有了,那通過鼠標和鍵盤控制攝象機在場景中漫游的代碼在哪里呢?在OGRE應用框架中ExampleFrameListener類的frameStarted函數(shù)里。該函數(shù)又
31、調用processUnbufferedInput函數(shù),我們可以在processUnbufferedInput函數(shù)中發(fā)現(xiàn)如下代碼:mInputDevice->capture();(省略若干行)mCamera->yaw(rotX);mCamera->pitch(rotY);mCamera->moveRelative(vec);首先獲取鼠標狀態(tài),而后根據(jù)該狀態(tài)計算攝象機的旋轉和移動量,最后通過Camera的幾個控制方法控制其運動。注意到這里的攝象機是獨立于場景節(jié)點樹之外的。我們已經了解到場景節(jié)點樹上可以掛接Entity、攝象機和光。通過對場景節(jié)點的空間位置控制可以達到改變其下
32、掛接的Entity、攝象機和光的位置的目的。但注意Entity和攝象機不一樣。在OGRE引擎的設計中Entity是完全沒有移動、旋轉等能力的,所以它只能把這些任務交給場景節(jié)點來完成,而攝象機具有移動和旋轉函數(shù),所以它并不一定要完全靠場景節(jié)點來完成這些任務。這就引出一個有趣的話題,攝象機放到場景節(jié)點中和不放進去的區(qū)別究竟有多大。一般來講,攝象機如果不放在場景節(jié)點中,它就非常自由,程序員可以用程序任意控制它,就象在這個例子中一樣。想象一下在CS中,你犧牲后,你依然可以控制你的眼睛(靈魂?攝象機?)在場景中穿墻過屋,并為同伴通風報信,就可以體會到這種自由。而如果把攝象機掛接到場景節(jié)點中,那么攝象機就
33、和此節(jié)點和同在本節(jié)點下的其它Entity綁在一起了,一般在這種情況下就不再直接操作攝象機移動位置,而是和Entity一樣交給場景節(jié)點來做。墻上來回轉動的監(jiān)視器就是由掛接在同一節(jié)點下的Entity(監(jiān)視器模型)和攝象機組成的。還有場景中的人,他們的身體(Entity)和眼睛(Camera)總是在一起,就因為他們同屬于一個場景節(jié)點。 “人”的組織方法一 “人”的組織方法二以上兩圖都將Camera放到了節(jié)點下,都可以實現(xiàn)身體和眼睛的同步。但第一種方法更好,因為第二種方法眼睛和身體同屬于一個場景節(jié)點,它們之間無法實現(xiàn)相對位移,那么眼睛就可能會長在人的肚子里(節(jié)點的空間中心)。將攝象機放到場景節(jié)點樹中的
34、做法使用也很普遍,下一個例子里我們將看到這樣的情況。Camera使用舉例二思路 實現(xiàn)如下的場景節(jié)點樹: 在該節(jié)點樹中有一個食人魔、一個機器人和一架飛機。通過FrameListener來控制這三個Player都在自動旋轉。通過按TAB鍵把Camera輪流掛接到三個Player所在的節(jié)點上,這樣我們就會發(fā)現(xiàn)屏幕上會出現(xiàn)不同Player的以各自的視角所看到的世界。為了便于對Player的控制,程序中使用一個std:map來保存Player列表,該列表中保存每個Player的所屬節(jié)點名稱和節(jié)點指針。部分代碼/ myExample.h/ 定義PlayerListtypedef std:map<st
35、d:string,SceneNode*> PlayerList;/ 由應用框架中的ExampleFrameListener派生出myFrameListenerclass myFrameListener : public ExampleFrameListenerprotected: / 接收myapp傳過來的Player列表,以在這里控制其旋轉PlayerList *mPlayerList; / 保存當前Player的迭代子PlayerList:iterator currentPlayer;public: myFrameListener(RenderWindow* win, Camera*
36、 cam, PlayerList *pPlayerList) : ExampleFrameListener(win, cam) mPlayerList = pPlayerList; / 缺省Player是列表中的第一人 currentPlayer = mPlayerList->begin(); / 將攝象機掛接到該Player所在的場景節(jié)點currentPlayer->second->attachCamera(mCamera); bool frameStarted(const FrameEvent& evt) / 對TAB鍵的反應 if (mInputDevice-&
37、gt;isKeyDown(KC_TAB) / 把攝象機從當前Player上卸下來 currentPlayer->second->detachObject(mCamera->getName(); / 切換當前PlayercurrentPlayer+; if(currentPlayer = mPlayerList->end() currentPlayer = mPlayerList->begin(); / 再把攝象機掛接到當前Player上來。 currentPlayer->second->attachObject(mCamera); / 讓不同Playe
38、r以不同的速度旋轉 mPlayerList->find("Robot")->second->yaw(evt.timeSinceLastFrame * 30); mPlayerList->find("Head")->second->yaw(evt.timeSinceLastFrame * -60); mPlayerList->find("Razor")->second->yaw(evt.timeSinceLastFrame * 120); / 調用基類的frameStarted函數(shù)
39、return ExampleFrameListener:frameStarted(evt); ;/ 由應用框架的ExampleApplication派生出myAppclass myApp :public ExampleApplicationpublic: myApp()protected: / Player列表 PlayerList mPlayerList; / 創(chuàng)建場景 void createScene(void) SceneNode *pNodeRobot,*pNodeHead,*pNodeRazor; / 設置環(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); / 重新實現(xiàn)基類的createCamera函數(shù),關鍵是讓攝象機與其所在場景節(jié)點的相對位置為0,100,0。即高100
45、個長度單位,防止攝象機在Entity的肚子里出現(xiàn)。 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->lookAt(Vector3(0,0,-300); mCamera
46、->setNearClipDistance(5); ; 為了讓例子簡單一點,這里采用的是前面講的第二種眼睛與身體的組合方法,攝象機與Entity的相對位置是靠攝象機的setPosition函數(shù)完成的,這樣做并不是一個很好的方法。建議大家將本例改為前面講的第一種眼睛與身體的組合方法,將攝象機與Entity的相對位置關系交給場景節(jié)點去做,那樣攝象機的位置就可以設置為0,0,0。 事情還沒有結束,因為攝象機是屬于Player的了,我們就不能讓鍵盤再控制攝象機將他移出身體以外,所以需要更改ExampleFrameListener.h中frameStarted函數(shù)的代碼,因為ExampleFram
47、eListener.h是OGRE應用框架的一部分,所以請注意copy該文件,再更改。 找到frameStarted函數(shù)中的如下代碼: mCamera->yaw(rotX); mCamera->pitch(rotY); mCamera->moveRelative(vec); 將最后一行注釋掉,即可以讓攝象機可以受鼠標控制旋轉(東張西望?),但不能移動。光本文來自CSDN博客,轉載請標明出處:NxOgre緩沖攝像機(及攝像機抖動解決辦法) 收藏 重新對攝像機進行了封裝,增加了緩沖功能,使賽車的操作真實感提升了不少,關于緩沖攝像機可以參考Ogre wiki上的第三人稱攝像機那篇文章
48、其原理是: 使用兩個SceneNode, 一個綁定攝像機,另一個用來綁定代表賽車的節(jié)點, 賽車移動的時候攝像機的位置始終以一定速度向賽車節(jié)點靠近,這個速度跟攝像機與賽車子節(jié)點的全局坐標距離成正比.并不斷跟新兩節(jié)點位置.關于攝像機更新抖動的問題,NxOgre和Ogre使用兩個不同的FrameListener來更新場景,可能會使幀更新一致,我的解決辦法是在創(chuàng)建NxOgre:Scene的時候將mProcessingPriority = xOgre:Enums:Priority_Low設置成最低優(yōu)先級,即不對場景進行處理(默認情況下為Priority_Medium),之后再手動更新場景mScene-&
49、gt;advance(timeSinceLastFrame * 0.015, NxOgre:Enums:Priority_Low); /創(chuàng)建場景,并設置場景基本屬性NxOgre:SceneDescription desc;/設置重力desc.mGravity = NxOgre:Vec3(0.0f, -9.8f, 0.0f);desc.mName = "Racing World"/*注:(mProcessingPriority參數(shù)默認為中等)設置不更新場景,保持與Ogre渲染同步,避免攝像機抖動現(xiàn)象并在update調用mScene->advance(timeSinceL
50、astFrame * 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"/*賽車緩沖攝像機原理:使用兩個SceneNode, 一個綁定攝像
51、機,另一個用來綁定代表賽車的節(jié)點, 賽車移動的時候攝像機的位置始終以一定速度向賽車節(jié)點靠近,這個速度跟攝像機與賽車子節(jié)點的全局坐標距離成正比.并不斷跟新兩節(jié)點位置.例如: 在這里每20幀跟新一次兩節(jié)點坐標(與賽車同步),并更新節(jié)點相對位置./ 根據(jù)當前賽車速度和幀數(shù)來設定緩沖大小if (isBoundingCamera() float speed = getSpeed() / 30; / 提供剎車時的緩沖 if (speed < 1.0f) speed = 1.0f; / 時時跟新攝像機, mVehicleCamer->update(timeSinceLastFrame * spe
52、ed) ;*/class VehicleCamerapublic: VehicleCamera(const std:string &playerName); VehicleCamera(); / 設置攝像機緩沖程度值越大越硬,越小越柔和 void setTightness ( Real tightness ); float getTightness ( ) const; / 設定綁定節(jié)點, cameraNode為賽車上攝像機位置的節(jié)點, lookAtNode為賽車上車體的節(jié)點 void setTarget ( Ogre:SceneNode*cameraNode, Ogre:SceneN
53、ode* lookAtNode ); / 手動更新節(jié)點位置, 與賽車同步 void instantUpdate ( ); void update ( float timeSinceLastFrame );private: Ogre:SceneNode *mBaseCamerNode; Ogre:SceneNode *mBaseLookedAtNode; Ogre:SceneNode *mCameraLookAtNode; Ogre:SceneNode *mCameraNode; Ogre:Camera *mCamera; / 設置攝像機緩沖程度值越大越硬,越小越柔和 float mTightn
54、ess;#endif實現(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(); / 構造綁定攝像機的節(jié)點 mCameraNode = sceneMgr->getRootSceneNode()->createChil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出國留學銷售代表銷售總結報告
- 二零二五版牙科診所綠色環(huán)保材料使用協(xié)議3篇
- 二零二五年度公租房買賣合同模板及注意事項3篇
- 二零二五年度新能源項目居間合作協(xié)議4篇
- 二零二五年度個人商鋪買賣合同示范4篇
- 2025版贖樓擔保與房地產抵押貸款合同6篇
- 2025版物業(yè)管理公司人力資源外包合作協(xié)議書范本3篇
- 二零二五年度移動支付解決方案個人定制開發(fā)合同4篇
- 二零二五年度高空作業(yè)施工圍板租賃與安裝服務合同2篇
- 二零二五年度紀錄片攝影師制作合同2篇
- 電信網和互聯(lián)網圖像篡改檢測技術要求與測試方法
- 軌道工程-第三章-有砟軌道
- 2025屆江蘇省南京市鹽城市高三一??荚囌Z文試題 課件
- 《水稻生長進程》課件
- 2024版企業(yè)高管職務任命書3篇
- 青少年鑄牢中華民族共同體意識路徑研究
- 泌尿:膀胱腫瘤病人的護理查房王雪-課件
- 學校農業(yè)教育體驗項目方案
- 標點符號的研究報告
- 《城南舊事》惠安館--解讀
- 2022年貴州省貴陽市中考英語試題及參考答案
評論
0/150
提交評論