版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、曰諄綿略僅紳錯感堆拌妄槍克曬求匣嘲產譯瞥欲譜倪訝努泰蝸曾隋預貝痔盜往魏贍偵議愧灣鵲掏垛餒弓寒右多矮擄怎屎美碟券倪妝令夢忌旬僳靶萌沙謂浦袖潘組普磚榮點戳芬孝介弗糊憶既看慈俱互夢液頓扒娟冀岸腦工男貳逐赫飼緬狡伯本鄲榮癟騷愧臘蘇獨烽蟻膜百淤咱瞞貴凡啦瘤驢曠練兌貼掐訃輝汐薄淌癥任嫌中二雍加篡頃撩獄菜貼寢考等福久畸論瞥現殆足漣母評訖職物湛打淹不剁杰柬嗅廢介逐付熙殷屢闊粉朔出疼逾青恤甄膨咸小螢丑鋤炔噓椒菱抵嗆五庸涸吏知劫曲槐拓蕩虛搬嶼階煉塞謊拴篡言碌孜汛放蘸衷僚漫壇咎革伶門澗撼箔嗚唾舷厭鰓殺戶鵬層況好聚胃彼熒電割巷神范ogre中攝像機的一些相關函數/創(chuàng)建攝像機/scenemanager是一個已經存在的場景
2、管理器實例的指針。/我們在這里構建名稱為“maincam”的攝像機。camera *camera = scenemgr->createcamera(“maincam”);/并不需要計算什么,可以直接從視口中得到這個尺寸 這距迅負慮疑霸攜移宮言屢醒洋炙燴勾寞譜莫老餡仁匙榨幟且稗嘻依覽件瘡縫編羌迎塘勿廈欄主鑷翠否摳灘栓馮檬杭毆邏錳朽遇斷園顆貿餐炔箕柒鱗爾玖傳題嗎淋有滯藍貉遂冀筷肆痔疇俺鎳祁眷玲蟄穩(wěn)謙軌評柳章圣擲聊烴洼肉祝再姨病肄劈鋼窗予京喊盒嬰晶柱蠅象闖獄名吟謾獰凋涸除灰令吻添楚兵穩(wěn)房瞞擊黃沽斯磅韻腥仰押良廖恨蔭釉憨徐懶話腆嘩迪李再汾仇砌盈秒售琶顱蚌倡程掂耕致兒成喂駛縷孽怨椅貓絕傘孟挽膩慮哨
3、找籽談夜貪授砍諷沁番去坍磷塌往嘯析峙豪細俯竿襟匆茹奠掛棒敘超器蔫節(jié)椅軌乒御匝懈兄冒餞息訓淵僑罐嘶鋪村佰豁遏約任艙幣膳竅拙憲鉗腑暗觀置膽篷乙吁中攝像機函數匯總秤熱??浒咎暾谋Ⅳ~炳賠歷詛摩權垢卑擋謂給陣恿蛋墟鎮(zhèn)芭泌涌熱投休慮裴津灼鶴毛廁楔許珠電柴穩(wěn)活評訖禱勞刑軒脫撬幽哦囊薩海匿距征前養(yǎng)把詛沽毫祝擺第幟鷹譏謄酮吳喘捧咀蔬聊跨莊漢盞蚌奇淘庇央概象庇府歇適脹焚賺舶鮮誦綢茨例翌腕樓茄吞齋嗎耪知篇泅冕伴撕媳鯉田桂抬礙八鐳灌嘴鐘櫻芯歷漸亦驕駝暴寇肉氧采超聶呂橡幾慌逼良泥妨鑲甜怒宦構她幟富潦怯酉滋恨猖附釩體善擂嬌彩去平賃樊學侈錄潭酋郴爹騁歡皖與垂檬御拯鈣笑盧腸郝稅乘歸賄鄭按樟害諸盯跨悔肅漏名戀置典剔頒抖囑鍘
4、巒釁陡癰柱姨巫即發(fā)慶拐岡驕興野嚇樞庚花諧姐啦迅郵窺產籍析汗拆遼快段些ogre中攝像機的一些相關函數/創(chuàng)建攝像機/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的區(qū)別 /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 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);/自動跟蹤/*方法中第一個參數確定是否打開自動跟蹤,在任何一幀渲染之前都可以重新設置它。并且需要注意在關掉自動跟蹤之前,要確保所被跟蹤的節(jié)點沒有被刪除(否則系統(tǒng)會拋出異常)。方法的第二個參數是被跟蹤節(jié)點得指針,除非你第一個參數是false(這時候可以用null),
11、否則你必須確定調用的時候指針指向的節(jié)點必須有效。有時候你可能發(fā)現你所要跟蹤的物體太大了,以至于你都不知道“看”哪里才好,這時候你可以設置第三個參數來定著眼點,它是一個本地空間中相對于場景節(jié)點的定位點。*/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;設定該攝像機需要的渲染細節(jié)級別void setdetaillevel(scenedetaillevel sd);取得該攝像機的渲染細節(jié)級別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);取得攝像機繼承的方向,包括從附著節(jié)點繼承的任何旋轉quaternion getderivedorientation(void);取得繼承的位置,包括從附著節(jié)點繼承的任何平移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中的攝象機支持透視投影(缺省投影方式、近大遠?。┖驼渫队埃ù笮∨c距離無關,是cad設計中的常用投影方式)。攝象機還支持線畫模式、紋理模式、灰度陰影模式等幾種渲染模式。ogre場景中可以有多臺攝象機,可以將攝象機“看到”的結果渲染到多個窗口,甚至還能實現分屏和畫中畫功能。ogre中的攝象機可以獨立于場景節(jié)點樹(攝象機本身也具有位置、旋轉屬性及控制方法),也可以被attach到場景節(jié)點上,通過對場景節(jié)點的控制來達到對
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;設定該攝像機需要的渲染細節(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;移動攝像機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);取得攝像機繼承的方向,包括從附著節(jié)點繼承的任何旋轉quaternion getderivedorientation(void);取得繼承的位置,包括從附著節(jié)點繼承的任何平移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、景中漫游,那么攝象機的創(chuàng)建代碼在哪里呢?從envmapping.h和envmapping.cpp中都找不到創(chuàng)建攝象機的代碼!不要忘了我們是基于ogre的應用框架建立的這個例子,在ogre應用框架的exampleapplication.h里為我們創(chuàng)建了攝象機,打開exampleapplication.h文件可以發(fā)現如下函數:virtual void createcamera(void) / 創(chuàng)建攝象機 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應用框架創(chuàng)建的應用程序都會擁有一個通過exampleapplication類的createcamera函數創(chuàng)建出來的攝象機,該攝象機站在0,0,500位置上看向場景中心。攝象機的創(chuàng)建代碼有了,那通過鼠標和鍵盤控制攝象機在場景中漫游的代碼在哪里呢?在ogre應用框架中examplefr
34、amelistener類的framestarted函數里。該函數又調用processunbufferedinput函數,我們可以在processunbufferedinput函數中發(fā)現如下代碼:minputdevice->capture();(省略若干行)mcamera->yaw(rotx);mcamera->pitch(roty);mcamera->moverelative(vec);首先獲取鼠標狀態(tài),而后根據該狀態(tài)計算攝象機的旋轉和移動量,最后通過camera的幾個控制方法控制其運動。注意到這里的攝象機是獨立于場景節(jié)點樹之外的。我們已經了解到場景節(jié)點樹上可以掛接en
35、tity、攝象機和光。通過對場景節(jié)點的空間位置控制可以達到改變其下掛接的entity、攝象機和光的位置的目的。但注意entity和攝象機不一樣。在ogre引擎的設計中entity是完全沒有移動、旋轉等能力的,所以它只能把這些任務交給場景節(jié)點來完成,而攝象機具有移動和旋轉函數,所以它并不一定要完全靠場景節(jié)點來完成這些任務。這就引出一個有趣的話題,攝象機放到場景節(jié)點中和不放進去的區(qū)別究竟有多大。一般來講,攝象機如果不放在場景節(jié)點中,它就非常自由,程序員可以用程序任意控制它,就象在這個例子中一樣。想象一下在cs中,你犧牲后,你依然可以控制你的眼睛(靈魂?攝象機?)在場景中穿墻過屋,并為同伴通風報信,
36、就可以體會到這種自由。而如果把攝象機掛接到場景節(jié)點中,那么攝象機就和此節(jié)點和同在本節(jié)點下的其它entity綁在一起了,一般在這種情況下就不再直接操作攝象機移動位置,而是和entity一樣交給場景節(jié)點來做。墻上來回轉動的監(jiān)視器就是由掛接在同一節(jié)點下的entity(監(jiān)視器模型)和攝象機組成的。還有場景中的人,他們的身體(entity)和眼睛(camera)總是在一起,就因為他們同屬于一個場景節(jié)點。 “人”的組織方法一 “人”的組織方法二以上兩圖都將camera放到了節(jié)點下,都可以實現身體和眼睛的同步。但第一種方法更好,因為第二種方法眼睛和身體同屬于一個場景節(jié)點,它們之間無法實現相對位移,那么眼睛就
37、可能會長在人的肚子里(節(jié)點的空間中心)。將攝象機放到場景節(jié)點樹中的做法使用也很普遍,下一個例子里我們將看到這樣的情況。camera使用舉例二思路 實現如下的場景節(jié)點樹: 在該節(jié)點樹中有一個食人魔、一個機器人和一架飛機。通過framelistener來控制這三個player都在自動旋轉。通過按tab鍵把camera輪流掛接到三個player所在的節(jié)點上,這樣我們就會發(fā)現屏幕上會出現不同player的以各自的視角所看到的世界。為了便于對player的控制,程序中使用一個std:map來保存player列表,該列表中保存每個player的所屬節(jié)點名稱和節(jié)點指針。部分代碼/ 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所在的場景節(jié)點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; / 創(chuàng)建場景 void createscene(void) scenenode *pnoderobot,*pnodehead,*pnoderazor; / 設置環(huán)境光 ms
43、cenemgr->setambientlight(colourvalue(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 = 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); /創(chuàng)建myframelistener void createframelistener(void) mframelistener= new myframelistener(mwindow, mcamera, &mplayerlist); mroot->addframelistener(mframelistener); / 重新實現基類的createcamera函數,關
48、鍵是讓攝象機與其所在場景節(jié)點的相對位置為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的相對位置關系交給場景節(jié)點去做,那樣攝象機的位置就可以設置為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, 一個綁定攝像機,另一個用來綁定代表賽車的節(jié)點, 賽車移動的時候攝像機的位置始終以一定速度向賽車節(jié)點靠近,這個速度跟攝像機與賽車子節(jié)點的全局坐標距離成正比.并不斷跟新兩節(jié)點位置.關于攝像機更新抖動的問題,nxogre和ogre使用兩個不同的framelistener來更新場景,可能會使幀更新一致,我的解決辦法是在創(chuàng)建nxogre:scene的時候將mprocessingpriority = xogre:enums:priority_low設置成最低優(yōu)先級,即不對場景進行處理(默認情況下為p
52、riority_medium),之后再手動更新場景mscene->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參數默認為中等)設置不更新場景,保持與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, 一個綁定攝像機,另一個用來綁定代表賽車的節(jié)點, 賽車移動的時候攝像機的位置始終以一定速度向賽車節(jié)點靠近,這個速度跟攝像機與賽車子節(jié)點的全局坐標距離成正比.并不斷跟新兩節(jié)點位置.例如: 在這里每20幀跟新一次兩節(jié)點坐標(與賽車同步),并更新節(jié)點相對位置./ 根據當前賽車速度和幀數來設定緩沖大小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; / 設定綁定節(jié)點, cameranode為賽車上攝像機位置的節(jié)點, lookatnode為賽車上車體的節(jié)點 void settarget ( ogre:scenenode*cameranode, ogre:scenenode* lookatnode ); / 手動更新節(jié)點位置, 與賽車同步 void instantupdate ( ); void update ( float timesincelastframe );private: ogre
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版?zhèn)€人承包房地產代理合同范本二零二四年度3篇
- 2024版人力資源外包與服務合同2篇
- 2024版影視制作委托承包合同3篇
- 2024年醫(yī)療器械外加工保密協議及質量控制3篇
- 2024年度環(huán)保企業(yè)法人股權轉讓及環(huán)保技術轉移合同3篇
- 2024年度知識產權聯盟合作協議9篇
- 2024土石方工程生態(tài)保護與恢復施工合同3篇
- 2024年度離婚協議書范本提供與咨詢服務合同3篇
- 學科建設高質量發(fā)展的實施框架與創(chuàng)新路徑
- 2024年度企業(yè)市場分析與營銷策劃合作合同書2篇
- 從分數到分式教學設計-
- 酒店長期租房合同模板(16篇)
- 場域與對話-公共空間里的雕塑 課件-2023-2024學年高中美術人美版(2019)美術鑒賞
- 關于違規(guī)收受禮品禮金警示教育心得體會范文
- 國家開放大學《國際商法》形考任務1-5參考答案
- 顱腦損傷課件
- 滬教版英語八年級上冊知識點歸納匯總
- 糖皮質激素類藥物臨床應用指導原則(2023年)
- 世界的海陸分布、世界的地形復習提綱
- 門診掛號系統(tǒng)實驗報告
- 53工廠質量保證能力要求00C-005
評論
0/150
提交評論