我所遭遇過的游戲中間件--Havok
Havok是我接觸的第一款游戲中間件,那是在五,六年前,我剛剛畢業,對游戲開發還是個菜鳥.我記得先是對游戲場景中的地形和其他靜態物體生成剛體,然后做角色的Ragdoll就是模擬人死之后順着地形躺下,然后又做車輛模擬,后來還做過破碎.下面先一一枚舉下我做的事情:
(1)地形剛體是每次場景加載時實時生成的.
(2)場景中的所有靜態物體生成一個巨大的組合剛體,每一個靜態物體都是剛體的一個Shape,然后將該剛體保存到文件中.
(3)創建出一堵剛體所組成的牆.然后可以用物體砸它.
(4)Ragdoll搞的很辛苦,因為當時我還不太了解骨骼動畫,還沒吃透游戲引擎中的動作模塊.然后Havok又有一套Animation模塊,如果要做Ragdoll則需要用到Animation.
(5)穿刺處理.當搞出Ragdoll之后,發現如果角色死在牆邊時,手部有可能插入到牆內,那么這時變成Ragdoll后,手部剛體就會在牆內.這種情況下死相有些難看,需要做動態剛體穿刺處理.
(6)車輛模擬,當時搞出來后,在場景編輯器中,隨意生成地形,創建場景,自己玩的很起勁.后來我比較了PhysX和Bullet后發現Havok提供了車輛功能最為完善,操作感最好.
(7)破碎處理.DEMO中有敲玻璃的例子,我就仿着它寫,記得當時是有個坦克的車輛,用它發射子彈剛體敲擊玻璃.而玻璃破碎的過程是刪除舊剛體,生成多個新剛體.
(8)可分解的剛體,就是做一個小木屋,當有其他剛體碰到時,會坍塌.但坍塌后的剛體有時會嵌入到地面上,左右搖擺不定,這讓我很是無奈.
(9)想做剛體模擬布料效果,當時生成一圈的剛體,圍在一個角色腿部.每個剛體與周圍四個剛體有約束連接.但效果不行,動作劇烈時或刷幀率低時,膝蓋會穿出剛體.
(10)角色的控制.純粹就是將Havok的CharacterControl移植到引擎中.引擎中本來就是角色控制的邏輯,沒必要用Havok的.
我在Havok上做的一切沒有應用於任何一款游戲,最初覺得有點可惜,但是現在再看看當時寫的代碼,想想也不可惜,那代碼寫得太挫了.
Havok不僅僅是物理開發包,正如DirectX不僅僅是3D圖形開發包一樣.Havok包括一系列圖形游戲相關的開發,如AI,Animation,布料,腳本,甚至包括一套圖形渲染引擎.但大部分的使用都是在物理方面,就如同大部分對DirectX的使用僅僅是D3D.DirectX的其他模塊如Sound,Music還有人在用,而Input,Play之類使用者了了無幾.與Havok競爭的一款物理引擎PhysX,感覺它們兩個的關系很像DirectX和openGl.DirectX的裝包有500多M,openGl的安裝包大約有幾十M.Havok大而全,提供了很多與物理相關的功能,它的安裝包也很大,總共要幾個G,安裝過程也挺麻煩的.PhysX的安裝包則只有100M不到.Havok提供了起碼幾百個的DEMO,而PhysX的官方DEMO也就二十幾個.Havok大氣滂沱,PhysX簡潔精悍.
Havok的所有DEMO都堆集在一個工程中,這個工程十分龐大,這是我至今為止見過的代碼量最大的單個工程,感覺相當霸氣.DEMO涉及到Havok的方方面面,除了物理和碰撞方面的,還有內存管理,多線程管理,文件讀寫.如果能再集成幾個物理小游戲就好了.
Havok有一套Animation模塊,也是免費的,這個因為不太用,所以我研究地不深.記得當時有個DEMO是實現動作混合的,不知道這個模塊現在發展成什么樣了.現在游戲中有角色間交互的需求,比如角色受到攻擊時,攻擊點不同,攻擊力度不同應該有不同的反映,希望能有解決方案.這需要物理,Animation,IK三種技術.
Havok的布料模塊,這個模塊很奇怪,它與物理模塊沒有關系,或者說它有自己的物理模塊.如果你要實現一個角色穿着布料的情況,你需要為布料再創建出一套碰撞體來.但角色身體上可能已經給他創建出剛體了.而布料的最大問題是有很大的不確定性,當角色播放劇烈的動作時,布料會穿出碰撞體.比如你的角色穿着一條裙子,當一套動作做完后,大腿穿出了裙子,整個裙子跑到屁股后面了.后來Nvdina提供了一套基於PhysX的中間件Apex,實現了物理布料與骨骼動畫的融合處理,使布料在受物理影響時,也受到骨骼動作的影響,解決了這一難題.從而我便從Havok轉到了PhysX.
Havok AI這個不免費,我沒接觸過.Havok物理中有個DEMO是角色在場景中自由漫游且相互避讓.其實尋路,碰撞,物理,IK總有些耦合性.
Havok的相關工具還是挺不錯的,Havok的Max導出插件在導出模型時,可以自由地設置其矩陣變換;而PhysX導出插件則不能.MAX中的建模坐標系為Z軸右手坐標系,而通常游戲中為Y軸向上的左手坐標系.那么對模型的坐標系變換就很是需要.Havok的VisualDebugger工具要比PhysX的更好用.我記得可以很輕松地設置VisualDebugger的視角與游戲視角一致,而PhysX的PVD中,我始終沒有實現這一功能.不過VisualDebugger我不太常用,相對於重開一個進程對物理進行調試數據的顯示,我更喜歡直接將物理對象繪制在游戲中,這樣做更為直觀方便.