版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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 介紹 這個(gè)教程意在解釋如何用ogre version 1.0.0和newton game dynamics physics sdk version 1.31建立一個(gè)簡(jiǎn)單的程序。 要求: 1. 需要安裝ogre 1.1.x (dagon),可正常編譯和運(yùn)行。如果你是安裝的.0.x of ogre,這個(gè)
2、教程也可以適用,但是需要做少量修改。2. 需要安裝newton。如果沒有,去 網(wǎng)站下載一個(gè)sdk即可,該軟件是免費(fèi)的。3. 最后還需要安裝我編寫的 "ogrenewt" 庫(kù)來連接ogre和newton。ogrenewt 在ogre cvs 的ogre插件部分可以找到,也可以在我的網(wǎng)站下載。. 本教程我將解釋一些newton的基礎(chǔ)以及ogrenewt如何實(shí)現(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庫(kù) (只在 demo08用到, ogrenewt自身不需要用)如果你的目錄不同,在工程里修改為你自己的目錄就可以了。okay, 打開 vc+, 加載 "ogrenewt" solution. 你將可以看到9個(gè)工程: 1. ogrenewt_main 這是ogrenewt的庫(kù),在這個(gè)文件中定義了所
4、有的類。2. demo01_thebasics 一個(gè)非常簡(jiǎn)單的demo,你可以用一個(gè)物體扔令一個(gè)物體,看到碰撞效果。3. demo02_joints 令一個(gè)簡(jiǎn)單demo,可以看到treecollison效果和簡(jiǎn)單的連接。 4. demo03_collisioncallbacks 高級(jí)碰撞。通過callbacks來模擬傳送帶上的物體行為。5. demo04_raycasting 對(duì)固體使用raycasting。 6. demo05_simplevehicle 如何使用newton的汽車系統(tǒng)7. demo06_simplebuoyancy 如何使用 newton 的浮力系統(tǒng) 8. demo07_c
5、ustomjoints 一個(gè)簡(jiǎn)單的教你如何用ogrenewt創(chuàng)建自己的關(guān)節(jié)的例子。 9. demo08_ragdollexample 使用ragdoll。如果你的目錄結(jié)構(gòu)如上所示,那么編譯應(yīng)該沒有問題。demo08需要tinyxml才可以編譯。 可執(zhí)行文件在 "ogrenewt/bin/debug" 或者 "ogrenewt/bin/release" 目錄中。拷貝ogre的.dll文件和newton的.dll文件到該文件夾,試下執(zhí)行吧! demo 的控制: 1. mouse:攝像機(jī) 2. arrow keys:運(yùn)動(dòng) 3. space bar:扔物體 4.
6、 esc:退出. okay. 實(shí)現(xiàn)讓我們來創(chuàng)建我們的application類。創(chuàng)建一個(gè)新工程并且添加一個(gè)頭文件,命名為"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庫(kù)目錄:ogrenew/
8、ogremain/lib/debug <or release>ogreaddons/ogrenewt_main/lib/debug <or release>newtonsdk/dll/現(xiàn)在我們需要添加一些newton需要的內(nèi)容。 #include <ogrenewt.h>簡(jiǎn)單吧?現(xiàn)在在private成員里加入下面代碼: ogrenewt:world* mworld;如果你成功安裝,你將會(huì)在輸入ogrenewt:之后看到一大串類名?,F(xiàn)在讓我們用一些時(shí)間來說以下newton sdk和它是如何工作的。 newton sdk 這部分簡(jiǎn)要介紹下newton sdk,無(wú)
9、意代替sdk自帶的文檔。我的ogrenewt幾乎是sdk類名的翻版,所以多數(shù)函數(shù)都在sdk文檔里描述了。 newton有一些基本元素描述了物理世界它們是: world (ogrenewt:world) 這是一個(gè)包含物體的空間。所有的物體都需要一個(gè)world來創(chuàng)建,并且包含在這個(gè)world里。大多數(shù)情況,你只需要?jiǎng)?chuàng)建一個(gè)world然后包含所有物體,但是需要的話系統(tǒng)也允許多個(gè)world共存。在本教程中只用到一個(gè)world。 rigid body (ogrenewt:body) 這是物理世界里的一個(gè)基本的類。它代表一個(gè)固體,該固體可以和場(chǎng)景中的其他body互動(dòng)。body可以有
10、重量,大小和和形狀?;旧夏阆氡涣λ绊懙奈矬w都需要?jiǎng)?chuàng)建body。 collision (ogrenewt:collision) 這個(gè)類代表某個(gè)形狀。上面的rigid body需要一個(gè)collision來定義它的形狀。你可以重復(fù)使用collision。比如你需要100個(gè)不同的箱子,你需要?jiǎng)?chuàng)建100個(gè)不同的body,但是只需要?jiǎng)?chuàng)建一個(gè)collision。newton支持以下幾種方法來描述collision: · primitive shapes :包括: boxes, ellipsoids, cylinders, capsules, cones, and cham
11、fer cylinders。 · convex hulls : convex hulls 用空間的一系列點(diǎn)來創(chuàng)建一個(gè)最小的凸型。大多數(shù)情況,你可以用模型的頂點(diǎn)來創(chuàng)建,用這個(gè)方法將建立一個(gè)和你的3d模型差不多的collsion· tree collisions : 從名字不太容易看出來這個(gè)類是干什么的,不過treecollision" 就是多邊形collision.比如如果你有一個(gè)由多邊型構(gòu)成的城市模型,你可以由該模型來建立collsion。注意collsion是不可以用在活動(dòng)物體上。所有由treecollsion建立的模型都被自動(dòng)賦予無(wú)限大的質(zhì)
12、量,所以是完全不能運(yùn)動(dòng)的。它們最好被用作那些不需要運(yùn)動(dòng)的背景模型。對(duì)于運(yùn)動(dòng)物體,你必須使用convex hull或者general primitives。 · 注意:你是不能把這3種方法組合的來創(chuàng)建一個(gè)“組合collision”的。joint (ogrenewt:joint) joints 是在兩個(gè)body之間的連接,它將會(huì)影響到它們之間的互動(dòng)。比如你將兩個(gè)物體用hinge joint連接起來就可以創(chuàng)建一個(gè)門。 material (ogrenewt:materialid && ogrenewt:materialpair) materials 是
13、newton可以讓你調(diào)整兩個(gè)body相互運(yùn)動(dòng)的方式。簡(jiǎn)單的講比如調(diào)整摩擦力,但是也有更復(fù)雜的用途。首先你要?jiǎng)?chuàng)建一個(gè)materialid來代表你系統(tǒng)里可能需要的material。一些普遍的例子比如: wood_mat, metal_mat, plastic_mat, or player_mat, 等.然后你創(chuàng)建一個(gè)叫materialpair的東西。它描述了兩個(gè)material碰到一起會(huì)發(fā)生的行為。比如,你可以為collision創(chuàng)建一個(gè)包括鐵和鋼的materialpair。然后你可以為它創(chuàng)建火花,和聲效。當(dāng)兩個(gè)這樣的東西碰到一起的時(shí)候就會(huì)發(fā)生你所定義的事情。 okay, 這就是newton里最重
14、要和基本的部分了。注意newton里還有其它部分幫助創(chuàng)建ragdolls和汽車。如果需要請(qǐng)看newton的開發(fā)文檔吧。目前,ogrenewt還沒有實(shí)現(xiàn)這些功能的部分。 the newton world 好了,讓我們回到我們的ogrenewtapplication類。正如你可以看到的,我們?yōu)橐粋€(gè)ogrenewt:world加了一個(gè)指針,這就是我們將要放物體的world?,F(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)建了一個(gè)ogrenewt:world 的實(shí)例。在創(chuàng)建其它實(shí)例前你需要先創(chuàng)建它,其它實(shí)例會(huì)要求你傳遞一個(gè)ogrenewt:world的指
16、針,在析構(gòu)函數(shù)里添加: delete mworld;現(xiàn)在我們還需要為application類添加一個(gè)部分:frame listener。在大多數(shù)的demo中,都有一個(gè)類繼承exampleframelistener。這里也一樣,不同的是我們要?jiǎng)?chuàng)建令一個(gè)framelistener專門來更新newton world。首先創(chuàng)建標(biāo)的exampleframelistener 類: /ogrenewtapplication.cpp void ogrenewtapplication:createframelistener()mframelistener = new exampleframelistener(
17、mwindow, mcamera );mroot->addframelistener( mframelistener );現(xiàn)在我們來添加一個(gè)frame listener來更新物理世界,并且提供了debug的一些功能。我在ogrenewt庫(kù)里已經(jīng)假加入了類似的frame listener,叫basicframelistener 。為application類添加一個(gè)成員變量: ogrenewt:basicframelistener* mogrenewtlistener;然后在 createframelistener() 中添加: mogrenewtlistener = new ogrenew
18、t:basicframelistener( mwindow, mcamera, mscenemgr, mworld, 120 );mroot->addframelistener( mogrenewtlistener );ogrenewt:basicframelistener 是一個(gè)簡(jiǎn)單frame listener,用來每楨更新newton world,用了time-slicing的方法,這意味著你可以控制物理更新的速度。最后一個(gè)參數(shù)你希望的更新fps。okay, 現(xiàn)在所有東西都創(chuàng)建好了?,F(xiàn)在讓我們來建立一個(gè)簡(jiǎn)單的場(chǎng)景。對(duì)于demo來說,我們將創(chuàng)建一個(gè)非常簡(jiǎn)單的場(chǎng)景,幾個(gè)掉落的盒子。讓我們
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)在建立一個(gè)rigid body來代表這個(gè)物體。實(shí)際
20、上是非常簡(jiǎn)單的:首先建立一個(gè)collision來代表形狀: ogrenewt:collision* col = new ogrenewt:collisionprimitives:box( mworld, size );然后,從這個(gè)collision來創(chuàng)建一個(gè)rigid body。 ogrenewt:body* floorbody = new ogrenewt:body( mworld, col );現(xiàn)在我們的body創(chuàng)建好了,最后我們需要把它連到在scenenode上的3d物體上。什么意思呢?newton有一個(gè)很有意思的callback系統(tǒng),這以為著如果你已經(jīng)創(chuàng)建好了場(chǎng)景,newton會(huì)自動(dòng)為
21、一更新物體的位置和旋轉(zhuǎn)角度。比如在場(chǎng)景中你有50個(gè)不同的物體,當(dāng)你要求newton更新物理系統(tǒng)的時(shí)候,它會(huì)通過物理定律計(jì)算場(chǎng)景中所有物體的位置和角度。而其它的引擎,可能需要你創(chuàng)建一個(gè)循環(huán)讀取場(chǎng)景中所有的物體,獲取它們的坐標(biāo),賦予它們的模型。但是newton有一個(gè)內(nèi)置的callback系統(tǒng)可以為你作這些。這個(gè)非???!而且效率也很高,因?yàn)閚ewton只對(duì)移動(dòng)的物體作處理。該功能可以通過ogrenewt:body類里的attachtonode()來實(shí)現(xiàn)。floorbody->attachtonode( node );最后,我們來初始化地面的位置,讓我們把它放在世界中心,距離y軸向下5個(gè)單位:
22、floorbody->setpositionorientation( ogre:vector3(0,-5,0), ogre:quaternion:identity );delete col;你注意到我們刪除了collison的實(shí)例,因?yàn)槲覀儾辉傩枰恕,F(xiàn)在地面完成了。接著,讓我們創(chuàng)建幾個(gè)幾何體落在地面上。首先創(chuàng)建一個(gè)柱形。 / 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;好了,目前這些看起來都象我們?cè)趧?chuàng)建地面時(shí)候做的。不過我們要添加一些代碼讓這個(gè)物體動(dòng)起來,比如下降,和撞擊其它物體。為此,我們需要為這個(gè)rigid body創(chuàng)建一些其它特性,比如質(zhì)量和慣性。質(zhì)量很簡(jiǎn)單,我推薦用單位用“千克”。慣性就不那么直觀了,它代表著物體抵抗旋轉(zhuǎn)的能力。很多因素都可以影響到這個(gè)值,得到準(zhǔn)確的值就不是我能作到的了。但是,網(wǎng)上有一些現(xiàn)成的公式來計(jì)算
25、某一時(shí)刻的慣性。為了方便,我已經(jīng)把一些公式包含在ogrenewt里了。碰巧有一個(gè)通過質(zhì)量和大小計(jì)算柱體慣性的公式。代碼如下: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)行程序的話(你也可以試試看?。?,這個(gè)物體并不會(huì)落到地上。這是因?yàn)槲覀優(yōu)檫@個(gè)物體施加外力。在物理模擬中,最通常的外力是重力。我們?nèi)绾斡胣ewt
26、on來施加重力呢?類似于newton可以返回你物體的位置和方向。newton還為物體提供了一個(gè)callback,你可以通過它來調(diào)整力的大小。我還沒有完全把它移植到了ogrenewt里,如果要移植的話看看newton文檔也不是太難。但是我在ogrenewt:body中包括了一個(gè)basicforcetorquecallback(),它向物體施加一個(gè)不變的-y方向的力,大小為9.8units/sec2。要調(diào)用,只需要如下代碼:bod->setstandardforcecallback();完成!你的物體現(xiàn)在有重力了?,F(xiàn)在讓我們?cè)偌右恍┪矬w吧。 / 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. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年牛津譯林版七年級(jí)生物下冊(cè)月考試卷含答案
- 2025年蘇人新版必修3語(yǔ)文上冊(cè)階段測(cè)試試卷含答案
- 2025年新科版必修三歷史下冊(cè)月考試卷
- 2025年粵教新版九年級(jí)地理上冊(cè)月考試卷
- 2025年北師大新版九年級(jí)生物下冊(cè)月考試卷含答案
- 二零二五版體育產(chǎn)業(yè)派遣員工賽事運(yùn)營(yíng)合同4篇
- 二零二五年度綠色環(huán)保材料研發(fā)與應(yīng)用合作協(xié)議3篇
- 二零二五年度養(yǎng)老院內(nèi)墻涂料粉刷及舒適度合同4篇
- 二零二五年度大宗商品倉(cāng)單質(zhì)押融資合同范本3篇
- 2025年特色主題餐館租賃合同范本2篇
- 全冊(cè)(教案)外研版(一起)英語(yǔ)四年級(jí)下冊(cè)
- 【正版授權(quán)】 ISO 12803:1997 EN Representative sampling of plutonium nitrate solutions for determination of plutonium concentration
- 道德經(jīng)全文及注釋
- 2024中考考前地理沖刺卷及答案(含答題卡)
- 多子女贍養(yǎng)老人協(xié)議書范文
- 安踏運(yùn)動(dòng)品牌營(yíng)銷策略研究
- 彩票市場(chǎng)銷售計(jì)劃書
- 骨科抗菌藥物應(yīng)用分析報(bào)告
- 支付行業(yè)反洗錢與反恐怖融資
- 基礎(chǔ)設(shè)施綠色施工技術(shù)研究
- 寶鋼BQB 481-2023全工藝?yán)滠堉蓄l無(wú)取向電工鋼帶文件
評(píng)論
0/150
提交評(píng)論