UE4动画系统笔记
目錄
0、UE4動畫基礎概念
1、模型 - 骨骼 - 動畫 - 動畫藍圖基礎
2、 動畫/模型導入及骨架重定向
3 、動畫類型&動畫融合
UE中動畫相關類型主要包括:
UE中動畫融合主要有兩類方法:
混合動畫的軸向設置(Axis Settings):
瞄準偏移動畫
蒙太奇動畫:
4、蒙太奇動畫專題
5 、動畫藍圖中的重要節點
事件圖表特定事件和重要節點:
動畫圖表重要節點:
6、裝備物品附加到角色
7、RootMotion
8、動畫IK
9、動畫通知
10、動畫曲線
0、UE4動畫基礎概念
-
骨架(Skeleton):Skeleton是整個動畫系統的基礎,其主要作用是記錄了骨架以下信息:
-
骨骼層級信息
-
參考姿勢信息
-
骨骼名稱
-
曲線(Curve)信息
-
動畫通知(Animation Notify)信息
-
插槽數據(插槽名稱、所屬骨骼、Transform等)
-
虛擬骨骼信息
-
骨骼名稱Index映射表
-
其他骨骼設置信息:包括位移重定向(Translation Retarget)設置,LOD設置等信息
-
-
骨骼模型(Skeletal Mesh):顧名思義,骨骼模型是在骨骼基礎之上的模型,通俗來說就是綁定骨骼后的網格體,也就是我們在游戲中能夠看到的角色的“肉身”。其主要包含以下信息:
-
模型的頂、線、面信息
-
頂點的骨骼蒙皮權重
-
模型的材質信息
-
模型LOD信息
-
所屬骨架
-
Morph Target信息
-
Physics Asset設置信息
-
布料系統相關設置
-
-
動畫序列(Animation Sequence):動畫序列是用來記錄骨骼運動狀態的資源,也是讓動畫動起來的關鍵之一,其主要包含了一下信息:
-
動畫關鍵幀信息
-
包含運動的骨骼信息
-
每幀骨骼的Transform信息:包含了骨骼的旋轉、位移和縮放
-
動畫通知信息:記錄了觸發通知的類型和時間
-
動畫曲線信息:記錄了隨時間軸變化的曲線信息
-
其他基礎信息:包括了疊加動畫設置、根骨骼位移設置等信息
-
-
混合空間(BlendSpace):其主要作用是根據輸入的float值從若干臨近的動畫中采樣并輸出一個融合后的Pose。根據數據維度不同分為BlendSpace和BlendSpace1D兩種類型。
-
瞄準偏移(AimOffset):是BlendSpace的一種特殊形式,區別在于其內部的所有采樣點都是疊加動畫。主要用在游戲過程中疊加角色瞄準和看的方向。
-
蒙太奇動畫(AnimationMontage):對Animation Sequence資源的擴充,可以方便的使用藍圖、代碼控制動畫資源的播放,并且可以方便的實現根骨骼動畫和動畫播放結束后的回調。要使用Montage就需要將相應的動畫拖入其中,在Montage編輯器中可以對動畫進行編輯、裁剪、拼接等操作。Montage編輯器中有一個Slot(插槽)的東西,通俗的解釋就是,插槽是對應在動畫藍圖中播放Montage的播放點,同一個Montage可以有多個不同的Slot。
-
動畫藍圖(Animation Blueprint),主要負責動畫的混合驅動邏輯以及后處理的相關工作。一般大部分動畫程序的工作就是在這里完成。動畫藍圖中可以搭建動畫狀態機以及動畫后處理邏輯,例如IK、疊加動畫等。
-
骨骼動畫系統大致可以分為兩步:
-
計算骨骼Pose:每一根骨骼可以看做一個點,而我們的Pose就是所有骨骼Transform(位移+旋轉+縮放)的集合,注意,一般來說,這個Pose是基于骨架參考姿勢(Reference Pose)的變換矩陣。
-
蒙皮:骨骼計算好后我們還是無法看到一個角色的造型,這時需要將3D美術制作好的網格體的頂點按照骨骼Pose進行變化。這里變換的依據是頂點的蒙皮權重和參考姿勢的信息(一個頂點可能受到多個骨骼的影響)。
-
動畫系統更新過程:UE4里主要承擔上述兩步職責的是Skeletal Mesh Component。在SkeletalMeshComponent創建時,會創建一個Animation Instance,這就是主要負責計算最終Pose的對象,而我們制作的AnimationBlueprint也是基于UAnimationInstance這個類的。在SkeletalMeshComponent進行Tick時,會調用TickAnimation方法,然后會調用Animation Instance的UpdateAnimation()方法,此方法會調用一遍所有動畫藍圖中連接的節點的Update_AnyThread()方法,用來更新所有節點的狀態。然后后續根據設置的不同會從Tick函數或者Work線程中調用SkeletalMeshComponent的RefreshBoneTransforms()方法,此方法進而會調用動畫藍圖所有節點的Evaluate_AnyThread()方法。Evaluate的含義就是指根據特定的條件(從Update時獲得的參數)計算出動畫所有骨骼的Transform信息,最后輸出一個Pose給到渲染線程并存在本地Component上。
-
動畫多線程:UE4的動畫系統支持多線程的處理,一般來說Game線程會觸發一系列Game Play邏輯,最后調用到動畫系統的Update內,然后這個方法里面把所有動畫系統所需要的信息收集起來,存到一個Proxy里,然后計算具體Pose的工作就交給工作線程去完成,這時主線程可以繼續進行后續的處理工作。需要注意的是,雖然此時Game線程未被Pose計算阻塞,但是渲染線程會等待RefreshBoneTransform結束后再開始工作,如果Evaluate Pose的時候有很多高消耗的操作,會發現渲染線程的時間會增長。
?
1、模型 - 骨骼 - 動畫 - 動畫藍圖基礎
-
無動畫模型:靜態網格staticMesh, 能指定動畫的模型:骨架網格sketonMesh
-
骨骼和動畫一對多綁定,骨骼和模型也是一對多綁定(蒙皮),動畫和模型(骨架網格體)沒有關系, 模型通過設置動畫藍圖來使用動畫,動畫藍圖用于管理各種動畫的觸發和狀態轉換
?
-
動畫序列包括 普通動畫 和 混合動畫BlendSpace(疊加動畫)
-
動畫藍圖用于控制動畫播放和切換的特殊藍圖,可以和綁定了骨骼網格體的藍圖類關聯
-
動畫藍圖里通過動畫圖表(動畫藍圖特有的圖表,Pawn藍圖沒有)設置動畫的狀態機,管理動畫切換;事件圖表設置動畫狀態機所需要的參數如速度方向等;動畫藍圖里的變量在事件圖表和動畫圖表里共享
-
狀態機包括規則和狀態,規則用于控制狀態的切換
-
動畫序列直接拖入狀態機中會自動產生一個狀態;狀態機可以嵌套
-
pawn藍圖類中可以通過Mesh獲取動畫實例get anim instance,然后通過類型轉換可以直接和動畫藍圖的變量通信(讀寫動畫藍圖類的變量),同理,動畫藍圖中可以轉換為pawn藍圖來反向通信
?
-
Pawn、Charactor藍圖中通過輸入事件觸發動畫藍圖中的狀態機切換,需要在項目中預先設置輸入按鍵映射,沒有需要新增:操作映射對應瞬時輸入,軸映射為持續性輸入
?
?
2、 動畫/模型導入及骨架重定向
-
動畫導入常用格式fbx (obj為純模型文件),只導入模型和導入動畫的方法一樣
fbx可能包括sketal、sketal Mesh、動畫序列,可以導入以下幾種情況:
-
fbx不含動畫序列,若指定已有兼容骨骼則只導入模型Mesh,不指定則同時導入骨骼
-
fbx包含動畫序列,則可以導入骨骼和mesh的同時導入動畫文件
-
可以導入的同時創建材質和紋理(可以創建材質,不建議創建紋理)
-
-
動畫導入需要前確認幾點并預處理:
-
文件是否是原地動畫(in place),不是需要maya中處理
-
文件的骨骼是否有根骨骼root(原點位置),沒有需要maya中處理
-
文件的骨骼和游戲中已有的骨骼是否兼容,如果是導入時可以不用導入骨骼;如果不兼容需要同時導入骨骼并做后續處理
-
不同的骨骼不能直接應用動畫,需要先進行動畫重定向,將不同骨骼的動畫重定向到同一個骨骼,假設新導入的A骨架去匹配B:(另一種方法是在mixamo網站自動綁定!)
-
角色 - 骨骼 - 所有層級
-
B骨架視圖 - 重定向管理器 - 選擇人形綁定
-
B骨架視圖 - 修改參考姿勢與A相同,修改完后,重定向管理器-修改姿勢-使用當前姿勢
-
A骨架視圖 - 重定向管理器 - 選擇人形綁定 - 指定B骨架 - 自動映射
-
兩邊打開骨骼命名,對應調整骨骼映射,調整自動未匹配和匹配錯誤的后保存
-
選擇A骨架的動畫右鍵- 重定向動畫 - 復制動畫并重定向 - change保存路徑
-
如果是是A套用B骨架及其動畫,則右鍵B骨架的動畫藍圖或動畫序列進行復制動畫并重定向即可
-
-
動畫包合集要確認動畫是否包含有骨骼,一般有一個帶有骨骼,其他的沒有,需要先導入有骨骼的動畫(不指定骨骼),再批量導入其他動畫(指定剛才導入的骨骼)
?
-
?
-
CharactorCreator導入UE4使用插件可以直接指定UE4骨骼,自動綁定和渲染設置,Animation需要勾選Use T0 pose,避免Pose問題(詳見踩坑記錄0)
?
3 、動畫類型&動畫融合
-
UE中動畫相關類型
-
動畫序列:導入的原始動畫(一般為fbx格式)
-
混合空間(1D/2D):融合軸向的動畫序列,UE完成動畫切換過渡
-
瞄準偏移:瞄準朝向和身體其他動作混合,UE操作類似混合空間
-
動畫合成:對動畫序列進行簡單的組合
-
蒙太奇動畫:用于復雜動畫或指定骨骼混合的動畫
-
利用時間軸+lerp實現簡單動畫效果
-
逆向動力學IK:Two Bone IK / Fabrik IK
-
-
UE中動畫融合主要有兩類方法
-
混合空間動畫 + 狀態機切換
-
蒙太奇動畫 + 分層骨骼融合
-
-
混合動畫的軸向設置(Axis Settings)
設置動畫圖表所依賴的參數,如水平設置一個Direction變量,垂直設置一個Speed變量,這兩個變量影響混合動畫在多個動畫切換時的過渡效果
-
最小/大軸值確定變量取值范圍
-
網格區分數確定動畫拆分數
-
內插時間影響動畫過渡時間,值越大效果越明顯:如run切idle時不會立馬停下,會多跑幾步后慢慢停下; 對于參數跳動導致的動畫抖動問題,一般也可以調整該值解決
-
BlendSamples設置單個動畫的播放速率,能解決類似滑步問題
-
-
瞄準偏移動畫
-
RInterp to節點:Rotation的一個插值的表述,該節點有四個參數,Current和Target分別表示當前角度和目的角度,DeltaTime為間隔時間,一般設置為我們計算機計算每幀的時間,Interp speed為調整的速度,越小速度越慢,一般調整為5左右效果比較好
-
獲取攝影機(控制器)和人物朝向的角度差:
-
get actor rotation
-
get controller rotation
-
delta / make rotator / break rotator
?
-
-
AimOffset不能添加動畫解決辦法:
?
-
?
?
-
蒙太奇動畫
-
蒙太奇為動畫片段剪輯組合而成,比如攻擊過程PunchProcess = 攻擊準備PunchBegin + 左拳PunchLeft * n + 右拳PunchRight * n + PunchEnd攻擊結束,這些動作的組合都可以用一個蒙太奇片段組合實現
-
蒙太奇有以下場景:
-
不需要使用狀態機來定義的短暫動作行為:比如,彎腰伸手拾取
-
復雜的動作組合:比如,組合動作攻擊
-
只需要骨骼部分呈現的動作:比如,有一個伸手拾取的動畫和walk_run狀態,使用蒙太奇的分層骨骼混合可以實現邊走路/跑步,邊伸手拾取的動作
?
?
-
-
?
4、蒙太奇動畫專題
-
section用于分段和重組,基本操作技巧:
-
點擊綠線可以拖動,控制起始位置,重命名
-
銜接:點擊一個section后點擊另一個
-
循環:點擊同一個兩次(變藍, 常用于組合動作idle循環)
-
移動幀條到指定時間,添加notifier
-
-
軌跡可以設置多條,用于跳轉控制
-
montage jump section,用于多條軌跡跳轉或循環狀態的跳出
-
設置動畫序列的Root Motion啟動根運動,使用移動動畫,可以攻擊帶位移(前提是動畫序列是帶位移的而不是inplace)
-
蒙太奇動畫的制作步驟總結
-
制作蒙太奇動畫,設置section,軌跡,自定義slot,notifiers
-
動畫藍圖中使用slot進行pose混合
事件圖表:
-
begin play(動畫藍圖初始化)時獲取所屬pawn等相關的外部變量并保存:如Try get pawn owner,通過設置pawn中的變量控制普通藍圖中的蒙太奇調用
-
update animation(更新動畫藍圖)時更新動畫藍圖中的變量,用于姿勢blend的控制變量
動畫圖表:
-
在指定pose后添加slot
-
分層骨骼節點設置,指定骨骼的所有子骨骼生效
-
根據布爾型 / 整型 / 枚舉型 / 分層骨骼 等方式進行pose混合
-
-
普通藍圖中調用蒙太奇相關節點:如Montage play (注意!使用動畫里的蒙太奇播放,可以精準控制section 和 position,不需要獲取動畫實例 )
?
5 、動畫藍圖中的重要節點
-
事件圖表特定事件和重要節點
-
Update Animation事件:每幀都會更新動畫的事件
-
Try get pawn owner節點
-
get movement component節點
-
get velocity + get vector length:計算移動速度(0 ~ max speed)
-
get actor rotation + get velocity + calculate direction:計算方向(-180~180)
-
-
動畫圖表重要節點
-
save pose / use cached pose:保存姿勢 / 使用姿勢
-
動畫融合:
-
blend posses by bool / int / enum:根據條件播放不同動畫
-
apply additive融合
-
layered blend per bone:只對某些骨骼進行混合,其他骨骼保持原姿勢,對哪些骨骼進行混合以及混合的權重,都可以由我們自己決定。比較典型的用法是在奔跑的時候切換武器,就可以將上半身用 站立時切換武器的動畫 進行混合, 而下半身保持原奔跑姿勢不變
-
play aim montage:播放蒙太奇動畫,常和分層骨骼融合結合使用
-
-
?
6、裝備物品附加到角色
-
骨架對應位置添加slot
-
如手持物品在hand_r骨骼下添加slot
-
掛在背上的物品在spine_02骨骼下添加slot
-
-
attach / detach actor到組件
-
獲取插槽變換get slot transform
?
7、RootMotion
-
動畫序列細節面板中啟用rootMotion
-
動畫藍圖中設置 - animation preview editor - edit defaults - root motion
-
UE4 RootMotion要求RootMotion動畫的根骨骼不能有旋轉移動等信息,因此需要先maya中處理一下根骨骼,可以添加一個新的根骨骼用于root motion
-
AI MoveTo要替換自定義task
?
8、動畫IK
-
雙骨骼IK
-
Fabric IK
?
9、動畫通知
三種類型動畫通知:
?
10、動畫曲線
-
動畫曲線是一種在動畫播放時更改骨骼屬性,材質屬性或變形目標值的方法
-
指定要修改的資源(材質或者變形目標),相應的命名曲線,然后在動畫的持續時間內調整關鍵幀值
-
-
動畫曲線(Anim Curves) 面板顯示選定骨架的 變形目標(Morph Target)、屬性(Attribute) 和 材質(Material) 曲線的曲線值。 可以在此處刪除和重命名曲線,以及預覽曲線數據。
?
-
打開方式:
?
-
曲線取消選中了 自動(Auto) 復選框,將不再從曲線中提取數據,選擇性地關閉曲線的影響并預覽結果
-
Type默認為屬性,點亮對應Type切成材質或變形目標
-
添加新動畫曲線:右鍵單擊任意曲線并從下拉菜單中選擇 添加(Add)
-
-
動畫藍圖獲取曲線信息
-
在 動畫藍圖 的AnimGraph里,調用一些藍圖節點來訪問曲線信息或獲取曲線名稱
?
-
?
-
參考鏈接:
-
動畫曲線變形骨骼:https://blog.csdn.net/lei_7103/article/details/108207857
-
-
動畫曲線修改材質:https://docs.unrealengine.com/zh-CN/Engine/Animation/Sequences/Curves/index.html
-
關聯知識-變形和換裝原理:https://www.chinaar.com/UE4/1817.html
-
官方變形文檔:https://docs.unrealengine.com/en-US/Engine/Content/Importing/FBX/MorphTargets/index.html
-
總結
- 上一篇: Mulitisim频率计设计
- 下一篇: java信息管理系统总结_java实现科