遊戲引擎剖析 (4) 模型與動畫,細節級別

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

 

角色建模與動畫

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

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

    讓我們定義一個基於網格的系統和一個骨骼動畫系統作爲開始。在基於網格的系統,對於每一個動畫幀,你要定義模型網格的每個點在世界中的位置。舉例來說,你有一個包含200 個多邊形的手的模型,有 300 個頂點(注意,在頂點和多邊形之間通常並不是3個對1個的關係,因爲大量多邊形時常共享頂點 – 使用條形和扇形,你能大幅減少頂點數量)。如果動畫有 10 幀,那麼你就需要在內存中有300個頂點位置的數據。 總共有300 x 10 = 3000 頂點,每個頂點由x,y,z和顏色/alpha信息組成。你能看見這個增長起來是多麼的快。Quake I,II和 III 都使用了這種系統,這種系統確實有動態變形網格的能力,比如使裙子擺動,或者讓頭髮飄動。
    相比之下,在骨骼動畫系統,網格是由骨架組成的骨骼( 骨架是你運動的對象)。網格頂點和骨架本身相關,所以它們在模型中的位置都是相對於骨架,而不是網格代表每個頂點在世界中的位置。因此,如果你移動骨架,組成多邊形的頂點的位置也相應改變。這意謂着你只必須使骨骼運動,典型情況大約有 50 個左右的骨架—很明顯極大地節省了內存。

骨骼動畫附加的好處

 
    骨骼動畫的另一個優點是能夠根據影響頂點的一些骨架來分別“估價” 每個頂點。例如,雙臂的骨架運動,肩,脖子而且甚至軀幹都能在肩中影響網格。當你移動軀幹的時候,網格就活像一個角色一樣移動。總的效果是3D角色能夠實現的動畫更加流暢和可信,且需要更少的內存。每個人都贏了。
    當然這裏的缺點是,如果你想要使有機的東西運動且很好,比如說頭髮,或者披肩,爲了讓它看起來自然,你最後不得不在裏面放置數量驚人的骨架,這會擡高一些處理時間。
    基於骨骼的系統能帶給你的一些其他事情是‘忽略’特定層次骨架的能力 -- 說,"我不關心動畫想要對這塊骨架所做的事情,我想要讓它指向世界中的一個特定點"。這很棒。你能讓模型着眼於世界中的事件,或者使他們的腳在他們站着的地面保持水平。這一切非常微妙,但它可以幫助帶給場景附加的真實感。
     在骨骼系統,你甚至可以指定"我需要把這個特別的動畫用於模型的腿,而一個不同的攜槍或射擊動畫在模型軀幹上播放,且那傢伙(角色)叫喊的不同動畫效果在模型的頭部播放"。非常妙。Ghoul2 ( 在Soldier of Fortune II: Double Helix and Jedi Knight I: Outcast中使用了Raven的動畫系統 ) 擁有所有這些好東西,且特別被設計爲允許程序員使用所有這些忽略能力。這對動畫的節省像你一樣難以相信。像你一樣的動畫上的這次救援不相信. Raven有一個角色行走的動畫和一個站立開火的動畫,並在它同時行走和開火形下把這兩個動畫合併,而不是需要一個動畫表示角色行走並開火。

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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章