如何用Ogre和Newtonphysics建立一個簡單的游戲_第1頁
如何用Ogre和Newtonphysics建立一個簡單的游戲_第2頁
如何用Ogre和Newtonphysics建立一個簡單的游戲_第3頁
如何用Ogre和Newtonphysics建立一個簡單的游戲_第4頁
如何用Ogre和Newtonphysics建立一個簡單的游戲_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、from ogre wikiusing ogre with the newton game dynamics physics sdk by walaber 內(nèi)容· 1 介紹 · 2 開始 · 3 newton sdk · 4 the newton world 介紹 這個教程意在解釋如何用ogre version 1.0.0和newton game dynamics physics sdk version 1.31建立一個簡單的程序。 要求: 1. 需要安裝ogre 1.1.x (dagon),可正常編譯和運(yùn)行。如果你是安裝的.0.x of ogre,這個

2、教程也可以適用,但是需要做少量修改。2. 需要安裝newton。如果沒有,去 網(wǎng)站下載一個sdk即可,該軟件是免費(fèi)的。3. 最后還需要安裝我編寫的 "ogrenewt" 庫來連接ogre和newton。ogrenewt 在ogre cvs 的ogre插件部分可以找到,也可以在我的網(wǎng)站下載。. 本教程我將解釋一些newton的基礎(chǔ)以及ogrenewt如何實現(xiàn)。 譯注:一些ogrenewt demo的截圖開始 首先我們要作的是編譯ogrenewt,令它運(yùn)行。假設(shè)你的目錄如下: <some_dir>/ogre/ogrenew <- ogre 安裝目錄<so

3、me_dir>/ogre/ogreaddons/ogrenewt/ <- ogrenewt 安裝目錄<some_dir>/newtonsdk <- newton sdk 安裝目錄<some_dir>/tinyxml <- tinyxml庫 (只在 demo08用到, ogrenewt自身不需要用)如果你的目錄不同,在工程里修改為你自己的目錄就可以了。okay, 打開 vc+, 加載 "ogrenewt" solution. 你將可以看到9個工程: 1. ogrenewt_main 這是ogrenewt的庫,在這個文件中定義了所

4、有的類。2. demo01_thebasics 一個非常簡單的demo,你可以用一個物體扔令一個物體,看到碰撞效果。3. demo02_joints 令一個簡單demo,可以看到treecollison效果和簡單的連接。 4. demo03_collisioncallbacks 高級碰撞。通過callbacks來模擬傳送帶上的物體行為。5. demo04_raycasting 對固體使用raycasting。 6. demo05_simplevehicle 如何使用newton的汽車系統(tǒng)7. demo06_simplebuoyancy 如何使用 newton 的浮力系統(tǒng) 8. demo07_c

5、ustomjoints 一個簡單的教你如何用ogrenewt創(chuàng)建自己的關(guān)節(jié)的例子。 9. demo08_ragdollexample 使用ragdoll。如果你的目錄結(jié)構(gòu)如上所示,那么編譯應(yīng)該沒有問題。demo08需要tinyxml才可以編譯。 可執(zhí)行文件在 "ogrenewt/bin/debug" 或者 "ogrenewt/bin/release" 目錄中??截恛gre的.dll文件和newton的.dll文件到該文件夾,試下執(zhí)行吧! demo 的控制: 1. mouse:攝像機(jī) 2. arrow keys:運(yùn)動 3. space bar:扔物體 4.

6、 esc:退出. okay. 實現(xiàn)讓我們來創(chuàng)建我們的application類。創(chuàng)建一個新工程并且添加一個頭文件,命名為"ogrenewtapplication.h"。添加如下代碼。 /ogrenewtapplication.h #ifndef _ogrenewtapplication_#define _ogrenewtapplication_#include "exampleapplication.h"class ogrenewtapplication :public exampleapplicationpublic:ogrenewtappli

7、cation(void);ogrenewtapplication(void);void createscene();void createframelistener(void);看起來眼熟吧,這只是繼承了ogre的exampleapplication類。首先在工程中包含下面的目錄:include目錄:ogrenew/ogremain/includeogrenew/samples/common/includeogreaddons/ogrenewt/ogrenewt_main/incogreaddons/ogrenewt/demos/includenewtonsdk/sdk庫目錄:ogrenew/

8、ogremain/lib/debug <or release>ogreaddons/ogrenewt_main/lib/debug <or release>newtonsdk/dll/現(xiàn)在我們需要添加一些newton需要的內(nèi)容。 #include <ogrenewt.h>簡單吧?現(xiàn)在在private成員里加入下面代碼: ogrenewt:world* mworld;如果你成功安裝,你將會在輸入ogrenewt:之后看到一大串類名?,F(xiàn)在讓我們用一些時間來說以下newton sdk和它是如何工作的。 newton sdk 這部分簡要介紹下newton sdk,無

9、意代替sdk自帶的文檔。我的ogrenewt幾乎是sdk類名的翻版,所以多數(shù)函數(shù)都在sdk文檔里描述了。 newton有一些基本元素描述了物理世界它們是: world (ogrenewt:world)  這是一個包含物體的空間。所有的物體都需要一個world來創(chuàng)建,并且包含在這個world里。大多數(shù)情況,你只需要創(chuàng)建一個world然后包含所有物體,但是需要的話系統(tǒng)也允許多個world共存。在本教程中只用到一個world。 rigid body (ogrenewt:body)  這是物理世界里的一個基本的類。它代表一個固體,該固體可以和場景中的其他body互動。body可以有

10、重量,大小和和形狀?;旧夏阆氡涣λ绊懙奈矬w都需要創(chuàng)建body。 collision (ogrenewt:collision)  這個類代表某個形狀。上面的rigid body需要一個collision來定義它的形狀。你可以重復(fù)使用collision。比如你需要100個不同的箱子,你需要創(chuàng)建100個不同的body,但是只需要創(chuàng)建一個collision。newton支持以下幾種方法來描述collision: · primitive shapes :包括: boxes, ellipsoids, cylinders, capsules, cones, and cham

11、fer cylinders。 · convex hulls : convex hulls 用空間的一系列點來創(chuàng)建一個最小的凸型。大多數(shù)情況,你可以用模型的頂點來創(chuàng)建,用這個方法將建立一個和你的3d模型差不多的collsion· tree collisions : 從名字不太容易看出來這個類是干什么的,不過treecollision" 就是多邊形collision.比如如果你有一個由多邊型構(gòu)成的城市模型,你可以由該模型來建立collsion。注意collsion是不可以用在活動物體上。所有由treecollsion建立的模型都被自動賦予無限大的質(zhì)

12、量,所以是完全不能運(yùn)動的。它們最好被用作那些不需要運(yùn)動的背景模型。對于運(yùn)動物體,你必須使用convex hull或者general primitives。 · 注意:你是不能把這3種方法組合的來創(chuàng)建一個“組合collision”的。joint (ogrenewt:joint)  joints 是在兩個body之間的連接,它將會影響到它們之間的互動。比如你將兩個物體用hinge joint連接起來就可以創(chuàng)建一個門。 material (ogrenewt:materialid && ogrenewt:materialpair)  materials 是

13、newton可以讓你調(diào)整兩個body相互運(yùn)動的方式。簡單的講比如調(diào)整摩擦力,但是也有更復(fù)雜的用途。首先你要創(chuàng)建一個materialid來代表你系統(tǒng)里可能需要的material。一些普遍的例子比如: wood_mat, metal_mat, plastic_mat, or player_mat, 等.然后你創(chuàng)建一個叫materialpair的東西。它描述了兩個material碰到一起會發(fā)生的行為。比如,你可以為collision創(chuàng)建一個包括鐵和鋼的materialpair。然后你可以為它創(chuàng)建火花,和聲效。當(dāng)兩個這樣的東西碰到一起的時候就會發(fā)生你所定義的事情。 okay, 這就是newton里最重

14、要和基本的部分了。注意newton里還有其它部分幫助創(chuàng)建ragdolls和汽車。如果需要請看newton的開發(fā)文檔吧。目前,ogrenewt還沒有實現(xiàn)這些功能的部分。 the newton world 好了,讓我們回到我們的ogrenewtapplication類。正如你可以看到的,我們?yōu)橐粋€ogrenewt:world加了一個指針,這就是我們將要放物體的world。現(xiàn)在為ogrenewtapplication.cpp添加內(nèi)容。最后的效果看起來如下: /ogrenewtapplication.cpp #include ".ogrenewtapplication.h"ogre

15、newtapplication:ogrenewtapplication(void)ogrenewtapplication:ogrenewtapplication(void)void ogrenewtapplication:createscene()void ogrenewtapplication:createframelistener()現(xiàn)在,在構(gòu)造函數(shù)里創(chuàng)建newton world,加入: mworld = new ogrenewt:world();這行代碼創(chuàng)建了一個ogrenewt:world 的實例。在創(chuàng)建其它實例前你需要先創(chuàng)建它,其它實例會要求你傳遞一個ogrenewt:world的指

16、針,在析構(gòu)函數(shù)里添加: delete mworld;現(xiàn)在我們還需要為application類添加一個部分:frame listener。在大多數(shù)的demo中,都有一個類繼承exampleframelistener。這里也一樣,不同的是我們要創(chuàng)建令一個framelistener專門來更新newton world。首先創(chuàng)建標(biāo)的exampleframelistener 類: /ogrenewtapplication.cpp void ogrenewtapplication:createframelistener()mframelistener = new exampleframelistener(

17、mwindow, mcamera );mroot->addframelistener( mframelistener );現(xiàn)在我們來添加一個frame listener來更新物理世界,并且提供了debug的一些功能。我在ogrenewt庫里已經(jīng)假加入了類似的frame listener,叫basicframelistener 。為application類添加一個成員變量: ogrenewt:basicframelistener* mogrenewtlistener;然后在 createframelistener() 中添加: mogrenewtlistener = new ogrenew

18、t:basicframelistener( mwindow, mcamera, mscenemgr, mworld, 120 );mroot->addframelistener( mogrenewtlistener );ogrenewt:basicframelistener 是一個簡單frame listener,用來每楨更新newton world,用了time-slicing的方法,這意味著你可以控制物理更新的速度。最后一個參數(shù)你希望的更新fps。okay, 現(xiàn)在所有東西都創(chuàng)建好了?,F(xiàn)在讓我們來建立一個簡單的場景。對于demo來說,我們將創(chuàng)建一個非常簡單的場景,幾個掉落的盒子。讓我們

19、開始吧,首先創(chuàng)建地面:ogre:vector3 size(10.0,1.0,10.0);ogre:scenenode* node = mscenemgr->getrootscenenode()->createchildscenenode();ogre:entity* ent = mscenemgr->createentity( "floorobj", "box.mesh" );node->attachobject( ent );node->setscale( size );現(xiàn)在建立一個rigid body來代表這個物體。實際

20、上是非常簡單的:首先建立一個collision來代表形狀: ogrenewt:collision* col = new ogrenewt:collisionprimitives:box( mworld, size );然后,從這個collision來創(chuàng)建一個rigid body。 ogrenewt:body* floorbody = new ogrenewt:body( mworld, col );現(xiàn)在我們的body創(chuàng)建好了,最后我們需要把它連到在scenenode上的3d物體上。什么意思呢?newton有一個很有意思的callback系統(tǒng),這以為著如果你已經(jīng)創(chuàng)建好了場景,newton會自動為

21、一更新物體的位置和旋轉(zhuǎn)角度。比如在場景中你有50個不同的物體,當(dāng)你要求newton更新物理系統(tǒng)的時候,它會通過物理定律計算場景中所有物體的位置和角度。而其它的引擎,可能需要你創(chuàng)建一個循環(huán)讀取場景中所有的物體,獲取它們的坐標(biāo),賦予它們的模型。但是newton有一個內(nèi)置的callback系統(tǒng)可以為你作這些。這個非??幔《倚室埠芨?,因為newton只對移動的物體作處理。該功能可以通過ogrenewt:body類里的attachtonode()來實現(xiàn)。floorbody->attachtonode( node );最后,我們來初始化地面的位置,讓我們把它放在世界中心,距離y軸向下5個單位:

22、floorbody->setpositionorientation( ogre:vector3(0,-5,0), ogre:quaternion:identity );delete col;你注意到我們刪除了collison的實例,因為我們不再需要它了?,F(xiàn)在地面完成了。接著,讓我們創(chuàng)建幾個幾何體落在地面上。首先創(chuàng)建一個柱形。 / cylinder body/ 半徑0.5, 高度 1.3size = ogre:vector3( 1.3, 0.5, 0.5 );node = mscenemgr->getrootscenenode()->createchildscenenode()

23、;ent = mscenemgr->createentity("cylinder_body", "cylinder.mesh" );node->attachobject( ent );node->setscale( size );/ rigid body.col = new ogrenewt:collisionprimitives:cylinder( mworld, 0.5, 1.3 );ogrenewt:body* bod = new ogrenewt:body( mworld, col );bod->attachtonode(

24、 node );/ initial positionbod->setpositionorientation( ogre:vector3(-2,3,2), ogre:quaternion:identity );delete col;好了,目前這些看起來都象我們在創(chuàng)建地面時候做的。不過我們要添加一些代碼讓這個物體動起來,比如下降,和撞擊其它物體。為此,我們需要為這個rigid body創(chuàng)建一些其它特性,比如質(zhì)量和慣性。質(zhì)量很簡單,我推薦用單位用“千克”。慣性就不那么直觀了,它代表著物體抵抗旋轉(zhuǎn)的能力。很多因素都可以影響到這個值,得到準(zhǔn)確的值就不是我能作到的了。但是,網(wǎng)上有一些現(xiàn)成的公式來計算

25、某一時刻的慣性。為了方便,我已經(jīng)把一些公式包含在ogrenewt里了。碰巧有一個通過質(zhì)量和大小計算柱體慣性的公式。代碼如下:ogre:real mass = 10.0;ogre:vector3 inertia = ogrenewt:momentofinertia:calccylindersolid( mass, 0.5, 1.3 );bod->setmassmatrix( mass, inertia );好了,現(xiàn)在物體有了質(zhì)量!但是如果現(xiàn)在你要編譯運(yùn)行程序的話(你也可以試試看?。?,這個物體并不會落到地上。這是因為我們?yōu)檫@個物體施加外力。在物理模擬中,最通常的外力是重力。我們?nèi)绾斡胣ewt

26、on來施加重力呢?類似于newton可以返回你物體的位置和方向。newton還為物體提供了一個callback,你可以通過它來調(diào)整力的大小。我還沒有完全把它移植到了ogrenewt里,如果要移植的話看看newton文檔也不是太難。但是我在ogrenewt:body中包括了一個basicforcetorquecallback(),它向物體施加一個不變的-y方向的力,大小為9.8units/sec2。要調(diào)用,只需要如下代碼:bod->setstandardforcecallback();完成!你的物體現(xiàn)在有重力了。現(xiàn)在讓我們再加一些物體吧。 / cone body/ cone with a

27、radius of 0.8, height of 1.0size = ogre:vector3( 1.0, 0.8, 0.8 );node = mscenemgr->getrootscenenode()->createchildscenenode();ent = mscenemgr->createentity("cone_body", "cone.mesh" );node->attachobject( ent );node->setscale( size ); / rigid body.col = new ogrenewt:collisionprimitives:cone( mworld, 0.8, 1.0 );bod = new ogrenewt:body( mworld, col );bod->attachtonode( node ); / initial positionbod->setpositionorientation( ogre:vector3(2,3,2), ogre:quaternion:identity );delete col;mass = 10.0;inertia = ogrenewt:moment

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論