1. 程式人生 > >Unity3D模型、繫結、動畫

Unity3D模型、繫結、動畫

模型(Mesh)

在Unity3D中使用三維模型,主要依靠Mesh Filter元件載入多邊形表面物體(polygon mesh),然後依靠Mesh Renderer元件將Mesh正確渲染出來。

內建基本3D模型

Unity3D內建有一些基本幾何體,通過Hierarchy面板上的Create按鈕或者選單選擇GameObject > 3D Object來建立:

Name Model
Cube 方塊:1×1的正方體
Sphere 球體
Capsule
藥丸
Cylinder 圓柱
Plane 平面:10×10的平面
Quad 單面:1×1的單面

這些內建的基本幾何體其實就是引擎自帶的mesh。等同於我們在外部建立一個Cube或Plane模型然後匯入Unity使用。這與我們的在Maya中使用預設幾何體有本質不同。Unity3D的基本幾何體不具備任何調整引數選項。

普通3D模型匯入Unity3D

由於基本幾何體都非常簡單,Unity3D本身也不提供多邊形編輯工具給我們使用(但可以使用
ProBuilder Advance

外掛來進行一些多邊形編輯工作),所以很多情況下我們需要其他3D軟體來製作模型,然後再匯入到Unity3D中。

雖然U3D現在支援直接匯入Maya的.ma檔案,但建議大家還是先將模型清理好後匯出成.fbx格式,然後再匯入到U3D中,這樣比較便於管理。

並不是所有的Maya節點都能夠被正確匯入到Unity3D中,實際上,Unity3D僅支援Polygon Mesh、Joints、空節點、蒙皮資訊、攝影機、關鍵幀動畫的匯入,而Maya中常用的NURBS表面、Curve曲線、變形器、IK、Constraints等內容都不支援。

並且,我還建議大家在匯出.fbx之前對Maya檔案進行一下“清理”工作,檢查好模型的發現方向,烘焙好關鍵幀動畫,刪除掉多餘無用的節點,刪除無用的構造歷史,同時將模型放在座標原點中心位置,凍結Transform屬性(歸零)。

Unity3D可以識別單個模型檔案中的多個mesh,且Mesh Filter元件僅支援載入單個mesh,所以我們可以用一個檔案匯出所有遊戲所需要用到的mesh,然後在U3D中一一呼叫。

因此,為Unity3D製作模型素材的時候,在三維軟體中就搭建好全部模型並不是一個好選擇。因為三維軟體中重複出現的模型,匯入U3D中以後會被識別成不同的mesh,直接載入整個場景會浪費掉很多系統資源。更有效的製作流程是在三維軟體中製作好不同的“小物件”,然後在Unity3D中完成具體場景的搭建工作。

PS:地形、植被等模型可能更適合於利用Unity3D自帶的功能模組來建立呢!

模型匯入的設定引數

選擇相應的模型Asset,其匯入引數會顯示在Inspector面板中。

Model一欄是關於模型的匯入引數,Rig一欄是關於繫結設定的匯入引數,Animations一欄是關於動畫資料的匯入引數。

unity_model_import_02.png

這個模型素材來自: "Unity-chan"Model 1.1

  • Scale Factor:匯入尺寸縮放(按照實際長度計算)
  • Use File Scale是否保留模型本身的縮放屬性
  • Mesh Compression:網格資料壓縮程度,會一定程度上減少mesh的多邊形面數
  • Read/Write Enabled:是否支援直接修改本檔案
  • Optimize Mesh:是否精簡mesh的面數
  • Import BlendShapes:是否匯入BlendShapes
  • Generate Colliders:是否自動建立碰撞體
  • Keep Quads:是否保持所有的四邊面(而不自動轉換為三角面)
  • Weld Vertices:是否自動融合重合的頂點
  • Swap UVs:交換UV組(通常模型有多套UV組,且匯入後發現貼圖不正確時勾選)
  • Generate Lightmap UVs:是否自動建立用於光照烘焙的UV組
  • Normals:如何處理法線方向(Import代表匯入模型原來的法線資料、Calculate代表用下面的Smoothing Angle引數來進行自動光滑計算、None代表完全無光滑發現設定)
  • Smoothing Angle:夾角在多少度以上的邊會被自動計算成光滑邊界
  • Tangents:切線計算設定
  • Import Materials:是否匯入模型材質球
  • Material Naming:使用什麼名稱來命名材質球
  • Material Search:材質球搜尋規則

設定完畢千萬不要忘記點選 Apply 按鈕確認哦!!!

關於比例

在Unity3D中尺寸比例非常重要,因為很多Unity3D操作都依賴於physics物理解算,而物理解算會因為物體的尺寸比例不同而呈現出差異極大的結果。一個100米高的大石頭和一個1釐米高的小石塊從空中落到地面的行為顯然是很不一樣的。

Unity3D中預設 1單位距離 = 1米。

由於Maya中預設設定為 1單位距離 = 1釐米,所以Maya模型匯出成.fbx以後再匯入Unity3D,要設定scale為0.01,否則就會變得超級大。

總結一下匯入模型的技術要求:

  • 法線要正確:Unity3D中不可以修改多邊形法線方向,所以如果錯了就必須返回Maya進行修改再重新匯入;
  • 比例要正確:如果按照Maya預設1單位=1釐米,那麼1米高的物體在Maya中就應該高100個單位,同時匯入時Scale Factor設定為0.01;
  • Pivot Point要提前設定好;
  • 位移歸零位置要在座標原點(但初始位置不一定要在原點);
  • 不能有構造歷史(匯出FBX的時候會自動統一清空構造歷史,所以不要有任何依賴於構造歷史的修改變化);
  • UV都放在(0,1)象限內,且保持UV正向(Maya中顯示為藍色為正向);
  • 單一mesh的UV不要有重疊;
  • 只使用smooth bind進行繫結;
  • 動畫必須全部由動畫曲線關鍵幀控制;
  • 骨骼命名最好提前做好。

繫結(Rig)

Rig一欄下的設定比較簡單,最重要的是設定Animation Type

  • Legacy:這種方式比較老式了,不支援Avatar,通過Animation元件來呼叫動畫
  • Generic:這種方式現在比較常用,對動畫的呼叫主要通過Animator元件來完成
  • Humanoid:這種方式類似Generic,也是配合Animator使用的,但專門針對人形骨架,可以點選Configure...按鈕進入人形骨架Avatar的詳細設定

所謂Avatar,在我認為是對於骨骼結構的一種標準化描述方式,用來方便在不同模型之間自由應用動畫資料。比如Humanoid型別的Avatar,就把人形生物的各關鍵骨點都標準化為了特定的名稱,這樣不論動畫資料是基於怎樣的命名規範,只要將動畫資料fbx檔案以及目標模型fbx檔案都標準化成人形Avatar,就可以自由的將動畫資料應用在新模型上。

眼尖的同學應該可以發現,這個概念和Maya中的HumanIK很像。

在下面圖片所示的Mapping面板中,我們可以手動指定各關鍵骨點所對應的場景節點,甚至還可以對於頭部和手指的細節進行設定,非常方便:

unity_model_rig_avatar1.png

Muscles & Settings面板我還沒怎麼用過,以後用到了再補充進來。

對模型進行繫結設定的基本流程可以總結如下:

  • 對於非常非常簡單的動畫物件,可以選擇Legacy方式進行設定(但我還是不太推薦)
  • 對於標準人形物件,選擇Humanoid方式,Avatar Definition可以直接Create From This Model,也就是根據本模型新建一個Avatar
    • 如果對自動建立的Avatar不滿意,點選Configure...進入Mapping面板自行設定
    • 如果已經設定過同樣的Avatar,可以在Avatar Definition中選擇Copy From Other Avatar以避免重複工作
  • 對於非標準人形物件,選擇Generic方式,Avatar Definition同上
    • Generic方式還需要指定一個Root Node,也就是“根”節點,這個節點是所有動畫的起點,通常可以指定骨骼鏈的最頂端joint,或者骨骼鏈的父物體節點等等
  • **點選Apply按鈕確認!!!

將設定好的.fbx資源拖進場景中,Inspector中會顯示這個遊戲物體的元件

可以看到已經附加了一個Animator元件(動畫人),其Avatar引數已經新增好了,但Controller引數還是空的。這時候模型是不會在場景中播放動畫。

如果之前選擇的是Legacy方式的Rig,遊戲物體會被自動附上Animation元件。其中Animation引數也是空的(因為這個fbx模型本身是不帶動畫的!)。

初學者大多會“自作多情”地認為,帶動畫的fbx模型匯入Unity3D不是應該直接就自動播放動畫麼?其實並不是這樣的。如果是Legacy方式匯入,模型又自帶動畫的話,倒是有可能自動播放,但LegacyAnimation元件目前其實已經逐漸被大家拋棄了,而使用Animator的話,不新增Controller是不會有動畫被播放的。


動畫(Animation)

上面所使用的Unity-chan的素材,動畫檔案是和模型檔案分開的,如果選擇模型.fbx檔案開啟Animations面板的話,看到的是一片空白:

大家如果也使用這個資源的話,可以在UnityChan > Animations目錄下找到帶動畫的.fbx檔案。

我選擇unitychan_WALK00_F.fbx檔案來做演示,點選檔案右邊的小箭頭,可以顯示這個.fbx檔案的全部內容,我們可以看到只有一些貌似面部的mesh,一個Avatar,以及一個WALK00_F檔案。

這個.fbx檔案實際上只包含動畫資料,之所以會有這些mesh出現,是因為這些mesh上的動畫並不是通過骨骼繫結來實現的,而是blendshape或者是直接transform動畫,所以必須保留動畫資料所依附的節點,也就是這些mesh。

而這個WALK00_F檔案就是動畫資料所存放的檔案了(在硬碟上的檔案字尾名是.anim)。

有動畫的.fbx檔案在Animations面板下是有內容的。

unity_model_animation_2.png

  • Bake Animation:我沒用過這個選項,應該是把IK動畫烘焙成關鍵幀動畫的意思吧,但不保險,還是在三維軟體中做好所有的烘焙工作吧。

  • Anim. Compression:是否精簡壓縮動畫曲線,當然選擇Off

  • Clips:這裡可以對動畫曲線做切割,點選+號可以新增一個片段,並給這個片段指定Start幀和End幀,每一個Clip對應之前看到的一個動畫檔案,預設是將整段動畫曲線做成一個大Clip,也就是WALK00_F。我們可以在一個檔案中把全部需要的動畫都做進去,然後在匯入的時候手動分割,我個人比較推薦這種做法。

    要注意的是,手動分割以後的clips檔案才會真正出現在硬碟上,前面展開fbx檔案看到的那個動畫檔案實際上是包含在fbx檔案內部的,在硬碟上找不到的。

  • Loop Time:該片段是否預設迴圈播放

實際上,從設定clip的名稱開始,後面的所有設定都是針對某一個特定clip來做的詳細引數,這裡不細說了。

這張圖片中顯示出兩條Warning警告,說明這個模型其實是有一點點小問題的,我檢查了一下,應該是有一根Spine骨骼稍微有點歪,不過不影響大局,就不管它了。

在最底下的預覽框中可以看到,這種單獨匯出動畫檔案的工作方式真不咋地,由於沒有實體模型,所有動畫檔案預覽時都看不到,點選播放就看到一張白臉在那裡晃來晃去。

解決辦法是用滑鼠將模型fbx檔案拖到這個預覽視窗中,這樣就替換了原始模型,便可以看到該段動畫clip在正確的模型上優雅地播放了。

Animator Controller (動畫人控制器)

下面我們來讓這個模型能夠動起來。

unity_animation_1.png

如果使用老式的Animation元件,只需要將動畫片段clip拖到到Animation欄中,這段clip相當於“當前動畫片段”,會自動在game object被載入時自動開始播放了,如果設定了loop,那麼就會不斷迴圈。
Animations一欄中,可以新增任意多個clips,這些clips則是“後備動畫片段”,未來可以通過指令碼來呼叫他們進行播放。

老式Animation元件的問題在於,遊戲中動畫片段之間的切換是非常頻繁且複雜的,使用這種方式的話,所有的動畫切換都要通過指令碼來實現,變成了程式設計師的負擔。所以那些編寫遊戲引擎的程式設計師們當然就要想辦法把這份工作甩給美工去做咯,於是就開發了後面的Animator系統,把動畫片段的切換邏輯設計給“視覺化”。

unity_animator_1.png

新式的Animator元件需要呼叫一個Controller,我們可以在Assets中新建一個,暫且起名叫AC吧。

將這個AC拖到Animator元件的Controller一欄中,然後雙擊這個AC檔案開啟Animator面板。

這個面板現在空空蕩蕩的就3個類似按鈕的東西,我們可以拖動這些“按鈕”來隨意佈局。

unity_animator_controller_1.png

把動畫檔案拖到這個面板上,可以看到動畫clip變成了一個較大的橘色長條,然後從Entry長條中延伸出一個箭頭指向這個新加入的clip長條。

unity_animator_controller_2.png

unity_animator_controller_3.png

實際上,Animator Controller是一個“狀態機”(關於狀態機的解釋可以看這裡),而Animator面板則將這個狀態機的設計工作“視覺化”了。我們後面會學習到的PlayMaker也是一個基於狀態機的互動設計外掛。

這些不同顏色的“長條”代表不同的“狀態”,“箭頭”則代表狀態可以從一端變化到另一端。所以上面這樣圖可以這樣解釋:當該物體“進入”場景時,物體動畫狀態變為WALK00_F,也就是“一經載入,模型播放WALK00_F動畫”的意思。

點選WALK00_F,我們可以看到與在Project面板中點選WALK00_F動畫片段檔案時不同的Inspector面板顯示內容:

unity_animator_controller_4.png

在這裡我們可以設定這個“動畫狀態”下播放哪個動畫片段(Motion),用什麼速度(Speed)來播放,要不要把動畫倒放(Mirror)等等。

在Project面板中點選WALK00_F動畫片段檔案時Inspector面板顯示的內容是這樣的:

顯示成灰色是因為我點選的是fbx檔案中包含的clip,所以不可編輯,我們可以Ctrl+D將其複製成單獨的clip檔案,然後再修改。



作者:shimmery
連結:https://www.jianshu.com/p/e2aa4d898fb7
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。