使用delta3d有些日子了,對物理引擎這塊沒有細看過,最近研究了一下。主要分為兩大部分,第一在dtcore中對ode的封裝,第二通過dtphysics,使用pal(phys abstract layer)對三種物理引擎 bullet、ode、phys的封裝。
這裡先介紹下dtcore中對delta3d中的封裝。總結起來就是如下幾點:
關係大致就是這樣,我就不畫圖表示了。
總之,在delta3d中應用ode的時候,可以使用scene類呼叫odecontroller,通過odecontroller中配置odespacewrap,進行碰撞檢測設定。因為physical類中引用了odebodywrap,所以他的子類可以進行動力學相關設定。
下面就上述的碰撞資訊的資料流在delta3d中的**中走一遍。
1、在scene的scene::onmessage(messagedata* data)方法中
13、在上一步中主要是呼叫odecontroller中的step函式進行碰撞處理。if (data->message == dtcore::system::message_pre_frame)
2
8 }
2、這個方法每幀都在監聽,如果物理控制器有效的時候,就呼叫
9 odecontroller::iterate(double deltaframetime)進行遍歷,如下
10void dtcore::odecontroller::iterate(double deltaframetime)
11 19
20//
calc the number of steps to take
21const
int numsteps = int(deltaframetime/stepsize);
2223 transformablevector::const_iterator it;
2425
for (it = getregisteredcollidables().begin();
26 it != getregisteredcollidables().end();
27 ++it)
28
3132
for (int i=0; i33
3637
const
double leftover = deltaframetime - (numsteps * stepsize);
3839
if (leftover > 0.0)
40
4344
for (it = getregisteredcollidables().begin();
45 it != getregisteredcollidables().end();
46 ++it)
47
50 }
如下:
15、如果自己設定了碰撞函式,就呼叫自己的(scene中留有介面,可以直接設定碰撞檢測函式),沒有的話,就呼叫預設碰撞函式。void dtcore::odecontroller::step(double stepsize)2 7
81012顯然,就是先判斷下是否存在傳送者,存在的話就傳送乙個message_physics_step(這個訊息忘了在那進行處理了,見諒)的訊息,就是起到調整物理時間步的。然後就呼叫sapce中的碰撞檢測函式。
4、也就是如下**:
1void dtcore::odespacewrap::collide()2 7
else
8
11 }
最終的碰撞檢測函式如下:
view code
16、上面說的是如何處理收到的資料,現在看一下如何把碰撞的資料發出去的,在odecontroller的建構函式中,呼叫了乙個函式void dtcore::odespacewrap::defaultnearcallback(void* data, dgeomid o1, dgeomid o2)2 7
8 odespacewrap* spacewrap = static_cast(data);
910 transformable* c1 = static_cast(dgeomgetdata(o1));
11 transformable* c2 = static_cast(dgeomgetdata(o2));
1213 dcontactgeom contactgeoms[8];
1415
int numcontacts = dcollide(o1, o2, 8, contactgeoms, sizeof(dcontactgeom));
1617
if (numcontacts > 0 && c1 != 0 && c2 != 0)
18
3839
if (c1 != 0 || c2 != 0)
40
74 }
75 }
76 }
77 }
78 }
即ctor(),這個函式的功能:如果發生碰撞,就是把碰撞時產生的資料發出去。
如下
1就是通過這樣訊息迴圈,把如何處理碰撞資料,如何在碰撞時新增相應的操作 聯絡起來。void dtcore::odecontroller::ctor()
2 11 然後呼叫相應的**函式:
12void dtcore::odecontroller::defaultcbfunc(const dtcore::odespacewrap::collisiondata& data)
13 28 }
以上就是dtcore對ode的封裝。
關於dtphysics,等待研究明白,再補上。
Delta3D 原始碼 之 dtCore Base
dtcore base解析 table of contents 1 dtcore base類 1.1 概述 dtcore base主要作用 1.設定訊息結構messagedata 2.作為收發訊息的基類,乙個類要想在onmessage中接收別類發來的訊息,就要繼承base base class to...
Delta3d中的AI技術分析。
首先。先介紹下delta3d的ai大體狀態機制。其主要分為三種基類iconditional,operator,istatevariable。iconditional作為條件,通過從維護全域性狀態的worldstate中獲得狀態資訊來判斷條件是否成立,operator則是具體行為,同樣他需要通過wor...
U3D 物理引擎
input 類 人機互動 鍵盤 可通過input實現外部裝置控制場景內遊戲物體實現相關功能 getkey 按住鍵盤上某乙個鍵時返回bool值 true getkeydown 按下某乙個按鍵後的第一幀返回bool值 true getkeyup 按鍵按下後鬆開時返回bool值 true input.ge...