

DOI:10.19850/j.cnki.2096-4706.2021.08.034
摘? 要:在Director開發平臺下首先對Havok引擎進行初始化,其次設置場景中的重力、模型質量、剛體等各方面的屬性,通過Havok引擎模擬真實的物理碰撞。最后對剛體與剛體、剛體與非剛體的碰撞檢測進行分析研究,得出結論:基于Havok引擎的物理碰撞與檢測技術在Director開發平臺下適合游戲開發、模擬復雜的物理現象等虛擬現實的制作。
關鍵詞:剛體;Havok引擎;碰撞檢測
中圖分類號:TP391.9? ? ? 文獻標識碼:A 文章編號:2096-4706(2021)08-0122-03
Research and Implementation of Physical Collision and Detection Technology?Based on Havok Engine
LIN Hai
(Zhanjiang Preschool Education College,Zhanjiang? 524084,China)
Abstract:Under the Director development platform,the Havok engine is initialized firstly,and then the gravity,model quality,rigid body and other attributes in the scene are set. The Havok engine simulates real physical collisions. Finally,the collision detection between rigid body and rigid body,rigid body and non-rigid body is analyzed and researched,and it is concluded that the physical collision and detection technology based on Havok engine is suitable for virtual reality production such as game development and simulation of complex physical phenomena under the Director development platform.
Keywords:rigid body;Havok engine;collision detection
0? 引? 言
近年來,碰撞與檢測技術[1,2]已經越來越成為三維虛擬現實、機器人、動畫仿真等領域研究的熱點,在目前成功的商業3D虛擬現實項目中,普遍采用的碰撞檢測是BSP樹與包裝盒相結合的方式。
基于BSP樹[3]的碰撞檢測主要應用于復雜形態模型的精確的碰撞檢測,但它需要很長的預處理時間,因此不適合加載時運算,BSP劃分經常會產生比原多邊形數多三到四倍的多邊形,即使不用保存顏色、法線、uv等物體信息也要增加將近一倍的內存容量。
基于包裝盒的碰撞檢測[4],主要應用于簡單形態或者可以視其為簡單形態的模型碰撞檢測。采用一個正方體或者球型體包裹住3D物體對象整體來代表物體,用于描述區域,之后根據描述區域的位置與距離等信息來檢測是否發生碰撞。
碰撞檢測技術[5]已成為計算幾何、計算機動畫、仿真機器人、CAD/CAM、3D游戲開發、物理仿真等領域中的一個熱點問題,而日趨復雜的虛擬環境的真實感和實時性對碰撞檢測提出了更高的要求,比如,虛擬人物在場景中可以自由移動,當遇到一定高度內的障礙物能夠走上去,而過高的障礙物則不能行走,遇到較小的斜坡可以走上去,陡坡過大則把人擋住,無法繼續行走。在各種前進方向被擋住的情況下,都要盡可能地讓人物沿合理的方向行走而不是直接卡住。滿足這些要求的同時,還要注意防止人物在某種檢測不到的情況下穿墻或掉出場景以外的區域。
本文以Director為開發平臺,實現Havok物理引擎的加載,并采用BSP樹及包裝盒方式的碰撞檢測技術,對場景建構以及對象的碰撞與檢測進行研究。
1? Havok Physics物理引擎簡介
Havok物理引擎全稱為Havok Game Dynamics,SDK,中文名為Havok游戲動力開發包。它將物理運動定律引入到虛擬場景中,增加了項目的交互性和互動性,內置了物理碰撞檢測函數,方便了游戲的開發。目前應用廣泛的物理引擎有Havok的Havok Physics物理引擎和NVIDIA的PhysX引擎,其中Havok Physics物理引擎是物理模擬計算引擎界的領軍者。
2? Director軟件簡介
Director是由美國Adobe公司開發的一款用于多媒體項目開發的功能全面的軟件。廣泛應用于CAI教學課件、網絡交互式等多媒體查詢系統、企業多媒體形象展示。Director有豐富的第三方工具集,比如數據庫插件,可以制作數據庫管理軟件等。其強大的Shockwave 3D引擎[6],能開發出生動形象的3D游戲。
3? 構建基于Havok引擎的真實的物理碰撞場景
Havok Physics開發中,首先需要定義各種不同的角色(actor),并對每個角色的形狀(shape)屬性和剛體(body)屬性進行設置;最后,把這些角色都加入到場景(scene)空間中,這樣就能構造出一個完整的虛擬實現世界。剛體可分為固定剛體、活動剛體兩類,固定剛體受到碰撞后不可動,活動剛體受到碰撞后將產生相應的運動。
本文以公路作為Havok物理引擎測試場景,設定2部汽車為活動剛體,公路和基圍欄為固定剛體研究Havok物理引擎各種的碰撞檢測和檢測機制。
3.1? 導入3DMAX場景模型
在3D MAX中制作出基礎場景模型后,導出為Shockwave 3D場景,生成擴展名為W3D的文件,在Director直接導入該文件,生成一個Shockwave 3D角色,如圖1所示。
在圖1中,小轎車為用戶可控制的車輛,名稱為“car”;出租車為靜止的車輛,名稱為“car2”;畫面右上角的紅色半透明面為路標檢測,用于判斷車輛是否通過該面,名稱為“pla”。
3.2? 設置虛擬場景的Havok屬性
3.2.1? 設置Havok初始參數
在Havok整合初步計算階段,進行物理對象的一些初始物理狀態的初始化,包括重力、場景模型等各項信息,為后面的運算做準備。主要語句為:
pMember = member(1)? --3D場景角色編號
pHavok = member(2)? -- pHavok場景角色編號
pHavok.initialize(pMember,1,1)–havok環境與Shockwave 3D環境通過初始化而建立連接,從而使在havok環境中的模擬運算可以影響Shockwave 3D模型。
phavok.gravity = vector( 0, 0, -386 )
--pHavok為場景的矢量重力大小,-386為向下的重力,值越大,剛體下落速度越快;值越小,剛體下落速度越慢。
3.2.2? 設置各模型的剛體屬性
剛體與常規表面不同,在模擬過程中,剛體會發生碰撞而不是彼此穿插。
小轎車模型的剛體屬性設置語句為:
pCar=pHavok.makeMovableRigidBody(“car”,1000)
說明:設置小轎車為活動剛體,質量為1000Kg,模擬了真實小轎車的重量,碰撞檢測方式為BSP樹。
出租車模型的剛體屬性設置語句為:
pHavok.makeMovableRigidBody(“car”,1000, true, #box)
說明:設置出租車為活動剛體,設置為活動剛體,1000Kg,碰撞檢測方式為包裝盒。
公路和路基的剛體屬性設置為固體剛體設置語句為:pHavok.makeFixedRigidBody(“Highway”,false)。
路標檢測的平面由于允許剛體穿越,所以不設置為剛體
3.2.3? 虛擬場景的真實模擬
加入幀腳本事件,開始虛擬場景的真實模擬。語句為:
on exitframe me
pHavok.step()--開始模擬
end
3.2.4? 控制小轎車的行駛
Havok為Director用戶提供了方便的角色控制行為庫,可以通過簡單的Drive model行為實現小轎車的模擬駕駛。圖2為Drive model行為的設置。
設置好行為后,小轎車可通過→、←、↑、↓四個方向鍵來控制汽車的行駛。
經過以上的幾步設置,小轎車已經具備剛體屬性已經可以在虛擬場景的公路中自由行駛,可以和其它剛體產生真實的碰撞效果而不會彼此穿越了。
4? Havok引擎物理碰撞檢測技術的應用
4.1? 剛體與剛體的碰撞檢測
剛體與剛體的碰撞檢測應用范圍廣泛,如:交通事故模擬、虛擬裝配、虛擬場景漫游等。剛體的碰撞檢測主要通過registerInterest函數實現。RegisterInterest將事件與模型綁定,當模型發生碰撞時呼叫它。
registerStepCallback是一個注冊碰撞檢測的處理程序,將在每一個物理模擬的副步(sub step)被呼叫一次。它通過精靈腳本事件進行注冊。本實例中主要檢測黃色小轎車的碰撞,注冊處理語句為:
pHavok.registerInterest( pCar.name, #all, 0, 0, #collisionHandler, me )
說明:pCar為小轎車剛體對象。檢測所有的剛體碰撞對象。
pHavok.registerStepCallback( #controlCharacter, me )
說明:將碰撞檢測的結果發回controlCharacter子程序中,將返回一個名稱為details的數組列表,再通過if語句來判斷在碰撞對象中是否有黃色小轎車“car2”的存在,語句為:
if chars(details[2],1,3)="car2" then
put details[2]
end if
4.2? 剛體與非剛體的碰撞檢測
剛體與非剛體產生碰撞后可以穿透非剛體對象,常用于一些路標檢測等監測剛體是否到達指區域而又不影響剛體運動的情況,如賽車游戲中,對賽車通過路段的檢測。
首先要制作一個剛體的子對象,該子對象一直跟隨主剛體,但不設置為剛體屬性,只用于非剛體的碰撞檢測。該子象的設置語句為:
member("aaa").model("car2dl").parent=member("aaa").model("car2")
其次,開啟子對象”car2dl”的碰撞檢測,語句為:member("aaa").model(rwd).collision.enabled = true
最后,注冊碰撞檢測處理程序,語句為:
member("aaa").model("car2dl").collision.setCollisionCallback ( #mCollide, me )
說明:將碰撞檢測的結果發回mCollide子程序中,將返回一個名稱為collisionData的對象,再通過collisionData.modelB來判斷是否與子對象“car2dl”產生碰撞,語句為:
tWaypoint=collisionData.modelB
tName=tWaypoint.name
put tName
5? 結? 論
在Director開發平臺下首先通過pHavok.initialize語句實現Havok引擎的初始化,再設置場景中的重力,模型質量、剛體等各方面的屬性,最后通過pHavok.step()語句開始模擬真實的物理碰撞。在碰撞發生后通過pHavok.registerInterest語句實現剛體與剛體的碰撞檢測,通過collision.setCollisionCallback語句實現剛體與非剛體的碰撞檢測。基于Havok引擎的物理碰撞與檢測技術在Director開發平臺下的應用具有開發步驟簡便,效率高的特點,適合游戲開發、模擬復雜的物理現象等虛擬現實的制作。
參考文獻:
[1] 李政峰,王青霞,肖昱鋒.Unity3D碰撞檢測技術在電力設備虛擬裝配中的應用 [J].科學技術創新,2020(30):104-105.
[2] 張森森,金國棟,王五桂,等.船舶操縱模擬器三維視景場景構建及碰撞檢測 [J].船電技術,2020,40(S1):24–27.
[3] 孫巍,劉金義.基于物體級BSP樹的大規模室外場景渲染 [J].微處理機,2010,31(6):67–70+74.
[4] 陳華.確定任意形狀物體最小包圍盒的一種方法 [J].工程圖學學報,2010,31(2):49–53.
[5] 曲慧雁.復雜虛擬環境下的快速碰撞檢測技術研究 [D].長春:吉林大學,2020.
[6] 羅立宏,譚夏梅.基于ShockWave3D的Web虛擬現實技術研究 [J].科技資訊,2007(4):101–102.
作者簡介:林海(1976.10—),男,漢族,廣東湛江人,講師,本科,研究方向:虛擬現實技術,人工智能。
收稿日期:2021-03-05
課題項目:湛江幼兒師范專科學校校級課題(2019ZYCQ33)