Skeleton編輯器相關設置
- 骨骼編輯器中取消顯示每個骨骼的座標軸
- Show -> Advanced -> Hierarchy Local Axes -> None
->
- Show -> Advanced -> Hierarchy Local Axes -> None
- 顯示骨骼
- Show -> NonRetargeted Animation - Checked
使用骨骼動畫的曲線插值變量
-
官網資料:https://docs.unrealengine.com/latest/INT/Engine/Animation/Sequences/Curves/
-
可以在某個動畫序列(AnimationSequence)中,加入一個曲線(curve)賦值到某個變量(float類型)中,然後你再Get到這個變量用來做其他事,比如改變 材質中的某個值
-
選取一個動畫序列 qiya_move,添加一個曲線命名爲 CurArg1
-
Checked一下可以展開曲線,下拉列表中也可以勾選曲線類型(Curve Types)
-
在對應的動畫藍圖(AnimBlueprint)中Get到這個曲線的插值
-
修改模型頂點數據,達到動態變形效果
-
官網資料: https://docs.unrealengine.com/latest/INT/Engine/Content/FBX/MorphTargets/index.html
-
需要在模型中加入需要修改的頂點(Vertex)的name,具體參考官網資料。然後再根據這個name設置具體的值,這個值可以動畫序列中的曲線插值獲得。
-
可以參考這篇文章,裏面還有工程文件下載。這個工程還有角色 換裝 的功能
角色換裝、部件組合
換裝和組合的前提條件是,3d工具導出時必須是同一套骨骼,導入進ue4時變成 SkeletalMesh 也必須時同一個套骨骼。
-
方式1:一個Actor丟如N多個 USkeletalMeshComponent 部件組件,每個組件使用不同的部件 SkeletalMesh,但AnimClass必須是同一個動畫藍圖。下面兩個教程都是這種做法。
- https://www.youtube.com/watch?v=taR9f2rumaU
- https://ke.qq.com/webcourse/index.html?from=qqchat#course_id=95589&term_id=100137875&taid=450138342520165&vid=d140573kcd7&ADUIN=364105996&ADSESSION=1484704131&ADTAG=CLIENT.QQ.5509_.0&ADPUBNO=26652
經過斷點調試,看到每個 USkeletalMeshComponent 裏的 AnimInstance 實例都是不同的,部件越多 AnimInstance 也就越多,但是骨架 Skeleton 只有一份。
-
方式2:Actor只加入一個 USkeletalMeshComponent作爲基礎骨骼(SkeletalComp),使用引擎提供的工具 FSkeletalMeshMerge,將所有部件的 SkeletalMesh (SrcMeshList)組合成一個新的 SkeletalMesh,替代基礎骨骼中的 SkeletalMesh。測試代碼如下:
bool UMyGameInstance::MyMerge2Char(AActor* PlayerPawn, TArray<USkeletalMesh*> SrcMeshList, USkeletalMeshComponent* SkeletalComp) { if (!PlayerPawn || !SkeletalComp || SrcMeshList.Num() == 0) return false; TArray<USkeletalMesh*>& SourceMeshList = SrcMeshList; auto CompositeMesh = NewObject<USkeletalMesh>(GetTransientPackage(), NAME_None, RF_Transient); TArray<FSkelMeshMergeSectionMapping> InForceSectionMapping; FSkeletalMeshMerge MeshMergeUtil(CompositeMesh, SourceMeshList, InForceSectionMapping, 0); if (!MeshMergeUtil.DoMerge()) { UE_LOG(MyLog, Log, TEXT("DoMerge Error: Merge Mesh Test Failed")); return false; } CompositeMesh->Skeleton = SkeletalComp->SkeletalMesh->Skeleton; //設置新的 *SkeletalMesh* 的骨架 SkeletalComp->SetSkeletalMesh(CompositeMesh); //用新組合成的 SkeletalMesh 替換舊的 return true; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 這樣組合會重新播動畫,有待研究