遊戲引擎架構----動畫

1.角色動畫類型
  賽璐璐動畫(cel animation):基於幀的,電子版本爲精靈動畫(sprite animation),可以設計成循環動畫(looping animation) 
  剛性層階式動畫(rigid hierarchical animation):可能在關節處產生裂縫
  每頂點動畫(per-vertex animation):網格添加動畫,數據密集
  變形目標動畫(morph target animation):極端的網格姿勢+混合
  蒙皮動畫(skinned animation):骨骼+皮膚

2.骨骼
剛性關節(joint)的樹形層級結構構成。骨骼只是關節間的空位,關節是動畫師控制的
內存中存儲:關節名字,父關節索引,關節綁定姿勢的逆變換矩陣(蒙皮綁定時關節的姿勢)

3. 姿勢
關節相對模型參考系的位置、定向和縮放。用矩陣或者SQT數據結構表示(縮放scale、四元數旋轉quaternion、平移translation)
綁定姿勢:參考姿勢、放鬆姿勢、T姿勢
局部姿勢:相對父關節的姿勢,SQT表示。每個關節定義了一個座標空間。把關節姿勢變換Pj施於關節j座標系表示的點時,得到的是父關節空間表示該點。即從子關節空間變換到父關節空間。Pj=P(j->parent(j))
全局姿勢:在模型空間的姿勢。從關節到根關節,乘以局部姿勢得到。P2->m = P2->1*P1->0*P0->m

4. 動畫片段(animation clip)
互動:動畫
非互動:遊戲內置電影(in-game cinematics IGC)、非交互連續鏡頭(non interactive sequence NIS)、全動視頻(full motion video FMV)
半互動:快速反應事件(quick time event QTE)
動畫片段的採樣定義了連續函數。動畫片段是 SQT組成的通道函數(channel funciton),通道函數是連續的。遊戲引擎使用分段線性逼近的方法插值。
4.1 局部時間線:
時間:0-T
關鍵姿勢(key pose)、關鍵幀+插值。t是實數,不一定是整數
時間比例(time scale):負值則動畫倒轉
幀:有時指一段時間,有時指一個時間點
採樣(sample):代表時間點,那相應的時間可以指幀了。非循環動畫:N幀有N+1個採樣、循環動畫:N幀有N個採樣
相位(phase):歸一化的時間,0表示開始,1表示結束
4.2 全局時間線
播放動畫:局部時間映射到全局時間。循環就使用模除。起始時間、播放速率/時間比例、循環次數、持續時間
同步動畫時,由於通信系統的時間延遲,造成動畫不同步。使用全局時鐘可以同步動畫,將動畫的全局開始時間匹配即可。
4.3 動畫重訂目標(retarget):
動畫通常只兼容特定骨骼,此技術可以讓動畫適用於不同骨骼
4.4 元通道(metachannel):
非關節通道,如事件觸發器通道,定位器通道。
定位器用於記錄遊戲中物體的位置和方向,也是一個仿射變換。可以設置攝像機的位置和角度

5. 蒙皮
網格每個頂點可以綁定至一個或者多個關節,再加權平均
蒙皮矩陣(skinning matrix):把網格頂點從綁定姿勢的位置變換至骨骼的當前姿勢的位置。蒙皮頂點的位置在模型空間定義的,所以變換前後的位置都在模型空間。
     頂點在綁定至關節的位置時,在關節空間是不變的:頂點在模型空間的位置->頂點在關節空間的位置->關節變換->頂點回到模型空間
     假設只有一個關節:則綁定姿勢的網格位置VmB, 關節在模型空間中的綁定姿勢B,關節在模型空間中的當前姿勢C可得到:VmB * B^-1 * C = VmC      ==>  蒙皮矩陣:B^-1 * C:綁定姿勢的逆矩陣*目標姿勢的變換矩陣 
矩陣調色板(matrix palette): 一系列矩陣,每個矩陣對應了關節j的蒙皮矩陣。將網格頂點關聯的蒙皮矩陣取出,加權求和後,將頂點從綁定姿勢位置變成目標姿勢位置,由於C是每幀變化的,B^-1會緩存起來
將模型空間變化到世界空間:乘以矩陣Mm->w,可以預處理將B^-1*Mm->w緩存
動畫實例(animation instancing):多個角色同時播放單個動畫。此時不應該將B^-1*Mm->w緩存

6.動畫混合(animation blending)
將多個動畫片段混合,對角色最終姿勢起作用
6.0 無需混合
核心姿勢:站立、蹲下
確保每個動畫片段都以某個核心姿勢開始核心姿勢結束,就無需混合
6.1 線性插值混合
linear interpolation(LERP),混合百分比、混合因子=[0,1]
姿勢混合通常在局部進行
應用:
     時間混合
     動作連續性(淡入淡出):混合因子隨時間按三次函數變化:緩出曲線(ease out curve)、緩入曲線(ease in curve)
          圓滑過渡:兩個片段的混合因子都同時變換,同時播放
          凍結過渡:一個片段凍結,另一個片段一遍播放一遍增加混合因子
     方向性運動:
          軸轉移動(pivotal movement):按軸旋轉
          靶向移動(targeted movement):面朝着一個方向,身體朝不同地方移動。製作三個基本動畫:朝前、朝左、朝右做一個半圓,按照移動方向和靶向的角度選擇混合因子
複雜的線性插值混合:
     一維線性插值混合:多個片段的一維混合
     二維線性插值混合:三個一維混合可得:x軸方向兩個,求出中間姿勢,y軸方向使用前面的兩個中間結果得到。
     三角形的二維線性插值混合:a,b, 1-a-b的加權混合
     泛化的二維插值混合:利用Delaunay三角剖分求出一組三角形,再找到對應的姿勢所在的三角形,最後用三角形的二維線插值混合得到結果
6.2 骨骼分部混合:
達到一隻手做A一隻手做B的效果
通過允許不同關節有不同的混合百分比實現。
混合因子爲0,1時可以實現 混合遮罩(blend mask)
6.3 加法混合(additive blending):
區別片段(difference clip)
來源片段(source clip) + 區別片段 = 參考片段
目標片段 : 任何動畫,+ 區別片段 = 其他片段,也是加法混合的意義
來源於矩陣的乘法,除法
加法混合的應用
     移動噪聲
     瞄準及註釋:對最左最上最右製作區別動畫,混合至向前動畫就可以得到其他的瞄準動畫。(可以利用時間軸lerp)

7. 後期處理
布娃娃
逆運動學(inverse kinematics IK): 輸入是全局姿勢,稱爲末端受動器,根據誤差最小化求出局部姿勢
正向運動學(forward kinematics FK):輸入是一組局部姿勢,輸出是一個全局姿勢以及每個關節的蒙皮矩陣。

8. 壓縮技術
通道省略:移除平移通道,減少存儲姿勢
量化:減少存儲爲數。浮點數轉化爲n整數表示
採樣頻率減少
選擇性載入

9. 動畫系統
9.1 動畫系統架構
動畫管道(animation pipeline):動畫片段和混合因子作爲輸入局部骨骼姿勢作爲輸出
動作狀態機(action state machine ASM)
動畫控制器(animation controller):每個控制器通常父子一個類型的角色行爲,如掩護、跑步。能提供高層次的動畫管理接口
9.2 動畫管道
片段解壓以及姿勢提取->姿勢混合->全局姿勢生成->後期處理->重新計算全局姿勢->矩陣調色板生成
數據結構:
     共享資源數據(shared resource data):骨骼、蒙皮網格、動畫片段。骨骼是中心,蒙皮綁定至骨骼,動畫應用於骨骼
     每實體狀態信息(per-instance data structure):動畫片段的狀態(局部時鐘、播放速率)、混合方法、混合權重、局部姿勢、全局姿勢、矩陣調色板
混合方法:
     加權平均法
     混合樹:將6變成樹的結構,就是加法混和必須爲一個葉子節點,而其他的混合可以而且是葉子節點和內節點。
淡入淡出:
     加權平均法:調整片段權重、將片段邏輯分組,調節組權重
     混合樹:加入一個二叉混合節點,混合原來的樹和新的樹
9.3 動作狀態機
每個狀態對應一個任意複雜的動畫片段集合,在混合樹架構中狀態對應一棵樹、加權平均法中狀態對應一系列權重何一組片段
過渡:定義狀態間的過渡矩陣
過渡方法:跳轉、淡入淡出(引入過渡狀態節點 transitional state)
狀態層
     預備動作(anticipation):由一個部位引領其他部位的動作,即要獨立操控不同部位,同時有多個狀態出現
     引入狀態層:每層在某一刻只有一個狀態,不同層之間狀態是獨立的
9.4 約束
依附:依附點/定位器(locator):特殊的關節,僅僅爲依附中的父子關係加入額外的變換
對準:多個角色參與一個動畫
           利用定位器,使多個角色的動畫中的定位器在世界空間內重合
解決滑步的方法:
  1. 動作提取:從動畫中提取出每幀角色重心到局部空間原點的距離(利用元通道),作爲速度參數來移動角色。同時將局部空間原點移動到此幀的角色重心處
     2. 腳步IK:腳接觸地面時,記下其在世界空間的位置,我們用IK去調整腿的姿勢,令腳能固定於正確位置
注視
掩護對準





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