天天看點

Havok Physics 翻譯資料Chapter 1.介紹Chapter 2. Havok 代碼編輯

http://blog.csdn.net/miao420906189/article/details/4644547

Chapter 1.介紹

1. Introduction

1. Introduction

2. What is Havok?

3. 它是如何工作的

3.1. 設定模拟的islands

3.2. 使用動作

3.3. 設定系統

3.4. Solve

3.5. 整合

3.6. 碰撞檢測

3.7. 連續模拟

4. 關于這個文檔

5. 關于Demos

5.1. 示例架構

5.2. 示例類型

5.3. 使用示例架構時運作visual debugger

3.5.    整合

整合器根據解決器提供的資訊來計算在模拟中的每一個物體的新運動狀态(初始和最終的位置、方向、速度、加速度等等)。新的位置和旋轉(狀态)就可以傳遞到你的渲染系統中,讓你來更新遊戲中的角色。一個物體的運動狀态存儲着兩個和它在模拟中的始末位置、方向有關的變換。這樣一來,計算兩個模拟幀中物體的位置。當運作慢動作的顯像和在許多顯像幀中用一個模拟步(simulation step)時,這非常有利。

注意這一系列的操作“使用動作、設定系統規定參數、處理、整合”有時候可以簡單的歸結為“融合”,比方說:hkpWorld::integrate()這個函數進行的就事這一系列的操作。

3.6.    碰撞檢測

模拟器需要确定在你場景中的任何物體是否正在發生碰撞或者重疊。在Havok Physics中,碰撞檢測被分成3個階段——廣碰撞檢測階段(是說快速的粗略計算出可能發生碰撞的幾對物體),中碰撞檢測階段(計算出可能發生的碰撞的更加詳細估算值),最後呢,是窄碰撞檢測階段(确定這個碰撞哪些會真的發生)。如果一些物體正在發生碰撞,那麼從窄檢測中得到的交叉資訊就用來建立碰撞代理和碰撞接觸點。這些碰撞代理和碰撞接觸點在下一個模拟幀就被模拟處理器使用了。

在模拟中每一個自然界的物體都有一個hkpCollidable,都有一個hkpShape來定義物體的形狀,以友善碰撞檢測。這些shape可以是簡單的圓,方盒子,也可以是更加複雜的形狀和網格(meshes)。hkpCollidable 也有轉移資訊,并且在動力學子系統中都有一個相應的實體轉移資訊與之相對應。你可以在“碰撞檢測”一章找到個多關于使用Havok碰撞檢測的資訊,包括建立形狀,碰撞過濾。

3.7.    連續模拟

這部分解決了所有的在碰撞檢測部分産生的”碰撞瞬間”事件。每一個碰撞瞬間事件又會産生新的碰撞瞬間事件,是以這是一個重複的部分,不可計算。模拟的這部分在世界模拟類型是分離的時候是并不被調用的。你可以在“連續Physics”這一章找到更多關于連續模拟的資訊。

4.關于這個文檔

這個手冊的每一部分都提供給你關于如何使用前面描述的SDK元件的詳細資訊。我們解釋了有用的概念,代碼例子(通常是從Havok 的Demo裡找的)很多地方都已經給出來了,包含有幫助的提示等。

這個幫助檔案同樣包括Havok Physics SDK的參考手冊。這個手冊提供給你了完整的SDK API文檔。包括類和包的描述,詳細的類成員描述,和繼承類圖。他在類圖和描述中有完整的超連結,索引,搜尋工具,是你查找資訊更加簡單。在使用手冊與例子以及在你的遊戲中使用SDK的時候,你可以用這個手冊作為一個指南。

5.關于Demos

你的安裝目錄裡的demos檔案夾,包括了很多有用的例子,你可以用來學習Havok。這些例子是以一定的邏輯方法設計的,主要是考慮到這個文檔的設計。每一個例子的源代碼都已經給了出來,你可以快速找到如何執行重要的工作,提供的代碼你也可以剪切粘貼到你自己的應用程式中。在每個例子和任務中都有對你有幫助的注釋。和這個文檔一起,我們希望例子能幫助你是你自己熟悉SDK,并且在你的遊戲中使用Havok Physics。

5.1.示例架構

我們所有的例子都使用同樣的架構,抽象了Havok支援的不同硬體平台的差別,也将顯示(圖形方面)和模拟方面區分開來。這種抽象将實體學部分的代碼放在一個地方使得代碼很容易閱讀和了解,而不會對控制句柄(controller handler)和具體的顯示資訊感到迷惑。架構包括了一個基本的示例類——hkDefaultDemo——和一個GUI應用程式,你可以在例子之間來回浏覽和使用例子。

你可以在相關平台的文檔中弄清如何建立以及如何在你選擇的平台下與例子發生互動。

5.2.例子類型

例子被分成兩個廣義的種類——api和examples。每個api的例子都說明了一個在使用Havok實體引擎時非常明确的方面,例如在兩個剛體之間設定單一限制。這些例子會幫助你增加對SDK一系列特征,與這些特征相關的概念以及與單獨的特征有關的關鍵類的熟悉程度。相比之下,examples的示例将兩個或者更多的特征整合在了一起來說明它們是用在一起的,比如在角色扮演和駕駛遊戲中。我們已經使這些例子盡可能的簡單了,以至于孤立了關鍵概念,說明了如何和另外的概念相關。

5.3.使用示例架構時運作Visual  debugger.

使用Visual Debugger運作一個示例架構時要用一個“-d”的指令行參數。

更多關于使用Visual Debugger的資訊(以及在不同的控制台使用時的資訊)可以在Visual Debugger部分可以找到。

Chapter 2. Havok 代碼編輯

目錄清單

1. 介紹

2. The Havok World

2.1. Creating an hkpWorld

2.2. Adding simulation elements

2.3. Entities

3. Rigid Bodies

3.1. Creating a Rigid Body

3.2. Adding a Rigid Body to the World

3.3. Removing a Rigid Body from the World

3.4. Changing the motion state

3.5. Rigid body collisions

3.6. Deactivation

3.7. Keyframed objects

4. Stepping the simulation forward

4.1. Synchronous stepping

4.2. "Half" stepping

4.3. Asynchronous stepping

4.4. Multithreaded stepping

5. Phantoms

5.1. hkpAabbPhantom

5.2. hkpShapePhantom

5.3. hkpPhantomCallbackShape

5.4. User hkpPhantom types

5.5. Using hkpPhantoms

6. Scale

7. Constraints

7.1. About constraints

7.2. Constraint types

7.3. Tuning and tweaking constraints

8. Constraint Chains

8.1. Introduction

8.2. How to use chains

8.3. Interface to the chains

8.4. Limitations of the Technology

8.5. What demos to look at

8.6. Performance Issues

8.7. Powered Chain Mapper

9. Actions

9.1. About Actions

9.2. Example actions

9.3. Creating a custom action

9.4. Important points when using actions

10. Listeners

10.1. Callbacks and events

10.2. Listener types

11. Postponing of Operations

12. Simluation Determinism

13. Memory Issues

13.1. Memory Capping

13.2. Memory Watchdogs

14. Saving Contact Points

14.1. Methods and parameters for saving

14.2. Methods and parameters for loading

14.3. Serialization

14.4. Limitations

1.介紹

Havok代碼編輯子產品,hkpDynamics是Havok系統最重要的子產品。它允許你建立一個模拟的實體世界,并與相關的模拟物體關聯,及時的進行模拟,以及與模拟進行互動。

這一章将會介紹如何:

l  建立和使用Havok 世界

l  建立和使用剛體,包括關鍵幀物體

l  建立和使用仿真物體

同時介紹三種其他類型的模拟元素——constraints,actions,listeners——在它們自己的章節會有更加詳細的介紹。

2.Havok世界

每一個Havok模拟都會有一個或多個Havok世界——類hkpWorld的執行個體。hkpWorld在你的模拟中扮演着實體物體容器的角色,也用來及時的模拟。

HkpWorld被分成幾個不同的組,叫做“島”(island)hkpSimulationIsland,可以因為不同的目的分别進行模拟(這是被系統動态設定的)。

2.1.建立hkpWorld

hkpWorldCinfo包含了建立hkpWorld對象的全部所需資訊,你可以用它來建立Havok世界。你可以為hkpWorld指定下面的詳細資訊,或者你可以用預設的:

l  重力:一個hkpWorld的重力被應用到它所有的模拟對象。這個參數的預設值反映了“真實世界”的重力(在Y方向上值為-9.8,Havok預設的正方向是向上的)。在你的遊戲世界中也可以用不同的重力設定(一會兒呢,你将會在所有軸的方向上定義重力為0),用你自己的重力軸(你的引擎可能會用Z軸作為向上的方向)。重力需要用一個hkVector4來指定。在遊戲中使用始終不變的重力是很常見的,它已經被放到主要的引擎中了,而不是作為一種動作(action)來設定的。更多複雜的重力模型可以作為一個Action來使用、貫徹。

l  Broadphase。m_broadphaseWorldAabb.m_min和m_broadphaseWorldAabb.m_max允許你來設定為你的hkpWorld的廣檢測的碰撞檢測。預設的Broadphase設定時一個長為1000.0的盒子(如果你用推薦的比例尺的話,就相當于是一個1000米的立方體),m_broadPhaseQuerySize允許你設定廣檢測的重疊部分的本地數組的大小。你可以在碰撞檢測這章弄清更多關于廣檢測和改變大小所帶來影響的資訊。

l  Solver(解決者、處理)。Havok模拟使用一個Solver來計算必要的改變來減少所有系統預設參數的錯誤。hkpWorldCinfo有一些方法來讓你設定這個Sovler的類型。每種Solver為模拟提供不同的速度或者準确度。Solver的行為取決于Solver在每一步計算變化、tau值、阻尼值時進行多少次演算。(原句是:The solver behavior depends on how many iterations the solver goes through in each step when calculating the changes, and the tau and damping values used by the solver.)。你可以在Solver介紹中讀到更多在模拟中關于Solver的資訊。一般來說,檢測次數越多,準确性越好。如果你覺得這太危險,你可以直接設定solver的參數,否則你可以看hkpWorldCinfo裡完整的Solver類型清單。

l  碰撞偏差。這允許你指定hkpWorld的碰撞偏差的值——預設是0.1(或者如果你使用推薦的米計量機關,就是10cm了)。你可以在碰撞檢測這一章找到關于這個值和它的影響的資訊。

l  鈍化。在一般的場景中許多物體是不會動的,是以他們不需要和那些可移動物體一樣來更新。許多資料在模拟步中都是保持不變的。世界可以通過時間程序監視它們的相對運動來判斷出哪些是應該被弄失效的物體。它是根據兩個頻率監視移動來減少相同頻率擺動的物體發生鈍化。有一個标志m_enableDeactivation來控制監視的開關。為了節省一些CPU,我們并不是每幀都對所有對象進行檢查,而是每個第四幀檢查(這是高頻率檢測),還有一個每個第16幀檢查的輔助檢測(低頻檢測)。如果一個組裡的所有對象的标志都是鈍化,那麼這個組就被鈍化了。一般的,這個組就是一個島(island),然而因為執行的原因,引擎可能會将獨立的組合并成一個“稀疏”島。

l  線性抛出。線性抛出是使用凸邊形搜尋世界找碰撞點的技術(能力)。這對角色和運動的精确接近檢測很有幫助。這種抛出是一種疊代算法,是以疊代的最大次數受執行的限制,精确性的改進受容許殘留值m_iteraiveLinearCastEarlyOutDistance的影響。如果你改變了碰撞殘留值,那麼這個變量亦應該改變,通常是碰撞殘留值的十分之一。

l  混雜的碰撞參數。當通過動态連結庫(as opposed to by itself for just collision detection)使用hkpCollide時,你可能需要扭曲碰撞偏差。這在hkpWorldCinfo中可能會被袒露出來,除了先前提到的主要的碰撞偏差。其他的一些參數在碰撞檢測章節會有更多的資訊,在hkpWorldCinfo的參考手冊中也有說明。

l  連續模拟參數。連續模拟和碰撞檢測使用一組内部安全的最優的參數。它們大多來自hkpWorldCinfo中暴露出來的參數。

表 2.1. 連續模拟初始化參數

Parameter Purpose, Values
m_simulationType 選擇模拟類型. 類型有SIMULATION_TYPE_DISCRETE, SIMULATION_TYPE_CONTINUOUS, SIMULATION_TYPE_MULTITHREADED
m_expectedMaxLinearVelocity 假定物體的最大線速度.這并不是在對象中設定線速度.如果以後, 鋼鐵如果明顯的快于這個速度, it might tunnel through other objects even if its qualityType is set to critical. 預設是200 meter/second
m_expectedMinPsiDeltaTime Minimum expected physical simulation delta time. Defaults to 30 Hertz
m_contactPointGeneration 允許接觸點設定在負的距離, 者可以加速模拟, 但是對于小物體來說并不是很好. See Collision Detection chapter for details. It defaults to CONTACT_POINT_REJECT_MANY. See the Reference Manual for details.

下面的例子顯示了如何建立一個hkpWorld。正如你所看到的,你簡單的建立一個kpWorldCinfo,設定你想要設定的值,然後将它傳給hkpWorld的構造函數就可以了。

hkpWorldCinfo info;

info.m_simulationType = hkpWorldCinfo::SIMULATION_TYPE_DISCRETE;

info.m_gravity.set( 0,-9.8f,0);

info.m_collisionTolerance = 0.1f;

info.setBroadPhaseWorldSize( 150.0f );

info.setupSolverInfo( hkpWorldCinfo::SOLVER_TYPE_4ITERS_MEDIUM );

m_world = new hkpWorld( info );

一旦你建立了hkpWorld,你可以使用hkpWorld的函數來得到或者設定所有hkWorldCinfo的值。

注意:

當你是将Havok融入到你的遊戲中,而不是使用我們的示例架構時,你就需要確定在建立和使用hkpWorld之前hkBaseSystem::init()被調用來初始化Havok記憶體系統和其他系統服務。

在示例架構中者被相關的圖形系統接口動态調用了。你可以在Havok基礎庫章節的BaseSystem部分找到更多關于這個函數的資訊。

2.2添加模拟元素

模拟元素比如剛體、模型、系統規定系數、動作和監聽器,需要添加到hkpWorld裡來參與模拟。hkpWorld提供了許多函數來添加和移除不同種類的模拟元素——比如,你添加一個限制就用addConstraint()。你可以在本章之後的部分找到更多關于如何使用這些函數的資訊。

注意:

hkpWorld::add(hkSerializable*)被串行化架構在内部使用。你也可以用它來添加任何可串行化的物體到hkpWorld。但是它所做的一切隻是檢查串行類型和相應的添加方法。

2.3.實體

添加到hkpWorld中的被模拟的實體物體叫做實體。實體的基類是hkpEntity,該類提供了許多函數和資料成員。目前在Havok中隻有一種實體類型,就是hkpRigidBody。

3.剛體

任何真實世界的物體并不改變他的形狀——從汽車架構到一個滾下山的卵石都是這樣的——可以在Havok中作為剛體來進行模拟。

剛體是Havok動力系統的中心,如果你用

繼續閱讀