delta3d與ode物理引擎的結合。

2022-02-23 13:59:06 字數 2970 閱讀 7073

使用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)方法中

1

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 }

3、在上一步中主要是呼叫odecontroller中的step函式進行碰撞處理。

如下:

1

void dtcore::odecontroller::step(double stepsize)2 7

81012顯然,就是先判斷下是否存在傳送者,存在的話就傳送乙個message_physics_step(這個訊息忘了在那進行處理了,見諒)的訊息,就是起到調整物理時間步的。然後就呼叫sapce中的碰撞檢測函式。

4、也就是如下**:

1void dtcore::odespacewrap::collide()2 7

else

8

11 }

5、如果自己設定了碰撞函式,就呼叫自己的(scene中留有介面,可以直接設定碰撞檢測函式),沒有的話,就呼叫預設碰撞函式。

最終的碰撞檢測函式如下:

view code

1

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 }

6、上面說的是如何處理收到的資料,現在看一下如何把碰撞的資料發出去的,在odecontroller的建構函式中,呼叫了乙個函式

即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...