遊戲引擎全剖析 4

2021-04-14 14:16:09 字數 2840 閱讀 5092

第4部份: 模型與動畫,細節級別

角色建模與動畫

你的角色模型在螢幕上看起來怎麼樣,怎樣容易建立它們,紋理,以及動畫對於現代遊戲試圖完成的`消除不可信`因素來說至關重要。角色模型系統逐漸變得複雜起來, 包括較高的多邊形數量模型, 和讓模型在螢幕上移動的更好方式。

如今你需要乙個骨骼模型系統,有骨架和網格細節層次,單個頂點骨架的評估,骨架動畫忽略,以及比賽中停留的角度忽略。而這些甚至還沒有開始涉及一些你能做的很好的事情,像動畫混合,骨架反向運動學(ik),和單個骨架限制,以及相片真實感的紋理。這個清單還能夠繼續列下去。但是真的,在用專業行話說了所有這些以後,我們在這裡真正談論的是什麼呢?讓我們看看。 

讓我們定義乙個基於網格的系統和乙個骨骼動畫系統作為開始。在基於網格的系統,對於每乙個動畫幀,你要定義模型網格的每個點在世界中的位置。舉例來說,你有乙個包含200 個多邊形的手的模型,有 300 個頂點(注意,在頂點和多邊形之間通常並不是3個對1個的關係,因為大量多邊形時常共享頂點 – 使用條形和扇形,你能大幅減少頂點數量)。如果動畫有 10 幀,那麼你就需要在記憶體中有300個頂點位置的資料。 總共有300 x 10 = 3000 頂點,每個頂點由x,y,z和顏色/alpha資訊組成。你能看見這個增長起來是多麼的快。quake i,ii和 iii 都使用了這種系統,這種系統確實有動態變形網格的能力,比如使裙子擺動,或者讓頭髮飄動。

相比之下,在骨骼動畫系統,網格是由骨架組成的骨骼( 骨架是你運動的物件)。 網格頂點和骨架本身相關,所以它們在模型中的位置都是相對於骨架,而不是網格代表每個頂點在世界中的位置。因此,如果你移動骨架,組成多邊形的頂點的位置也相應改變。這意謂著你只必須使骨骼運動,典型情況大約有 50 個左右的骨架—很明顯極大地節省了記憶體。

骨骼動畫附加的好處

骨骼動畫的另乙個優點是能夠根據影響頂點的一些骨架來分別「估價」 每個頂點。例如,雙臂的骨架運動,肩,脖子而且甚至軀幹都能在肩中影響網格。當你移動軀幹的時候,網格就活像乙個角色一樣移動。總的效果是3d角色能夠實現的動畫更加流暢和可信,且需要更少的記憶體。每個人都贏了。 

當然這裡的缺點是,如果你想要使有機的東西運動且很好,比如說頭髮,或者披肩,為了讓它看起來自然,你最後不得不在裡面放置數量驚人的骨架,這會抬高一些處理時間。 

基於骨骼的系統能帶給你的一些其他事情是『忽略』特定層次骨架的能力 -- 說,"我不關心動畫想要對這塊骨架所做的事情,我想要讓它指向世界中的乙個特定點"。這很棒。你能讓模型著眼於世界中的事件,或者使他們的腳在他們站著的地面保持水平。這一切非常微妙,但它可以幫助帶給場景附加的真實感。

more skeletons in the closet

先前描述的效果可以通過具有層次的骨骼系統來完成。這是什麼意思呢?意思是每塊骨架實際上的位置相對於它的父親,而不是每個骨架直接位於空間中的地方。這意謂著如果你移動父親骨架,那麼它所有的子孫骨架也跟著移動,在**上不需要任何額外的努力。這是讓你能夠在任何骨架層次改變動畫,而且通過骨骼其餘部分向下傳遞的東西。 

建立乙個沒有層次的骨骼系統是可能的 -- 但那時你不能忽略乙個骨架並且預期它工作。你所看到的只是身體上的乙個骨架開始了新動畫,除非你實現了某種『向下傳遞資訊』的系統,否則在該骨架下面的其它骨架保持原來的動畫。首先由乙個層次系統開始,你就自動地獲得這些效果。 

反向運動學

反向運動學 (ik) 是被許多人們丟棄的乙個專業術語,對它的真實含義沒有多少概念。ik 是如今遊戲裡面乙個相對比較新的系統。使用 ik ,程式設計師能夠移動乙隻手,或一條腿, 模型的其餘關節自動重新定位,因此模型被正確定向。而且有模型的關節新位置的其餘者他們自己,因此模型正確的被定向。比如,你將會說,"好,手 , 去拾起桌子上的那個杯子"並指出杯子在世界中的位置。手就會移動到那裡,且它後面的身體會調節其自身以便雙臂移動,身體適當彎曲,等等。

也有和ik相反的事情,叫做前向運動學,本質上與 ik 工作的次序相反。想像乙隻手,手附著在手臂上,手臂附著在身體上。現在想像你重重地擊中了身體。通常手臂像連迦般抽動,且手臂末梢的手隨之振動。 ik 能夠移動身體,並讓其餘的四肢自己以真實的方式移動。基本上它需要動畫師設定每種工作的大量資訊 -- 像關節所能通過的運動範圍,如果一塊骨架前面的骨架移動,那麼這塊骨架將移動多少百分比,等等。

和它現在一樣,儘管很好,它是乙個很大的處理問題,不用它你可以有不同的動畫組合而脫身。值得注意的是,真正的 ik 解決辦法需要乙個層次骨骼系統而不是乙個模型空間系統 -- 否則它們都耗時太多以致無法恰當地計算每個骨架。

lod幾何系統

最後,我們應當快速討論一下與縮放模型幾何複雜度相關的細節級別(lod)系統(與討論mip對映時使用的lod相對照)。假定如今絕大多數pc遊戲支援的處理器速度的巨大範圍,以及你可能渲染的任何給定可視場景的動態性質(在螢幕上有乙個角色還是12個?), 你通常需要一些系統來處理這樣的情況,比如,當系統接近極限試圖同時在螢幕上繪製出12個角色,每個角色有3,000個多邊形,並維持現實的幀速率。 lod 被設計來協助這樣的情景中。最基本的情況,它是在任何給定時間動態地改變你在螢幕上繪製的角色的多邊形數量的能力。面對現實吧,當乙個角色走遠,也許只有十個螢幕畫素高度,你真的不需要3000個多邊形來渲染這個角色 -- 或許300個就夠了,而且你很難分辨出差別。 

一些 lod 系統將會需要你建立模型的多個版本,而且他們將會依靠模型離觀察者的接近程度來改變螢幕上的lod級別, 以及多少個多邊形正被同時顯示。更加複雜的系統實際上將會動態地減少螢幕上的多邊形數量,在任何給定時間,任何給定的角色,動態地 -- messiah和sacrifice包括了這種風格的技術,儘管在cpu方面並不便宜。你必須確信,與首先簡單地渲染整個事物相比,你的 lod 系統沒有花較多的時間計算出要渲染那些多邊形(或不渲染)。 任一方式都將會工作,由於如今我們試圖要在螢幕上繪製的多邊形數量,這是件非常必要的事情。注意, dx9 將會支援硬體執行的自適應幾何縮放(tessellation)。

我希望這些帶給你對模型和動畫問題的洞察力。在第五部份中,我們將會更加深入3d世界的建造,討論一些物理,運動和效果系統的東西。

遊戲引擎剖析(二)

第2部份 3d環境的光照和紋理 世界的燈光 在變換過程中,通常是在稱為觀察空間的座標空間中,我們遇到了最重要的運算之一 光照計算。它是一種這樣的事情,當它工作時,你不關注它,但當它不工作時,你就非常關注它了。有很多不同的光照方法,從簡單的計算多邊形對於燈光的朝向,並根據燈光到多邊形的方向和距離加上燈...

遊戲引擎剖析(六)

第6部分 聲音系統,音訊apis 聲音系統 現在有一些很少有處理的聲音空間化問題。我說的是把聲音放在乙個真實的3d世界中。有四個揚聲器在你周圍是乙個很棒的開始,但這仍然只是在二維方向。在你的上方和下方沒有揚聲器,你沒有真正獲得3d聲音。有一些聲音調製過濾器試 決這個問題,但實際上沒有真實東西的代替物...

遊戲引擎剖析(四)

第4部份 模型與動畫,細節級別 角色建模與動畫 你的角色模型在螢幕上看起來怎麼樣,怎樣容易建立它們,紋理,以及動畫對於現代遊戲試圖完成的 消除不可信 因素來說至關重要。角色模型系統逐漸變得複雜起來,包括較高的多邊形數量模型,和讓模型在螢幕上移動的更好方式。如今你需要乙個骨骼模型系統,有骨架和網格細節...