Unreal Engine (UE) Advent Calendar 2024 9日目の記事です。
はじめに
お手軽にControlRigを作って、シーケンサーから表情(MorphTarget)を制御する方法を紹介します。
表情の制御自体はBlueprintやAnimSequenceでも可能です。ただ調整やプレビューにやや難がありますので、状況に応じて使い分けください。
ControlRigでMorphTargetを制御しよう
シーケンサーからこんな感じに設定できます。
ControlRigで表情を設定している様子 |
---|
AvatarSample_Aさん |
UE5.5で動作確認しています。
それ以前のバージョンではControlRigの挙動があやしいのでご注意ください。
表情のControlRigを作る(手動、モデル固有バージョン)
手順(1/2)
下図のようなControlRigを作成します。あちこち警告が出るかもしれませんが、以降の手順で解消します。
ざっくり解説
- ConstructionEventにて、MorphTargetに対応するControlを生成します
- ForwardsSolveにて、Controlの値をMorphTargetに反映させます
なおSpawnFloatControl ノードを使うには、 SpawnControlノードのInitialvalueにfloatを接続すればOKです。
手順(2/2)
MorphTarget名の配列を設定します。SkeletalMeshからMorphTargetを全て選択、コピーして、
MorphTarget名をコピー |
---|
テキストエディタに貼り付けて編集します。
↓ 貼り付けるとMorphTarget名が行ごとに並んでいます。これを、
vrc_v_sil
vrc_v_pp
vrc_v_aa
:
mouthStretchLeft
mouthStretchRight
tongueOut
↓ カンマで区切り、括弧で括るよう書き換えます。最終行のカンマは無いので注意ください。
(
vrc_v_sil,
vrc_v_pp,
vrc_v_aa,
:
mouthStretchLeft,
mouthStretchRight,
tongueOut
)
このテキストをコピーし、配列にペーストします。格納されます。
配列にペースト | 格納された様子 |
---|---|
シーケンサーからControlRigを割り当てれば完了です。
ControlRigを割り当てる | 全てのMorphTargetを制御できる |
---|---|
(New NecoMaidさん) |
ただこのRigは別のモデルに利用できず、個別にMorphTargetのリストをコピペしなおす必要があります。
(正確には「MorphTarget名が異なるモデルでは利用できない」です。同名なら流用できます)
表情のControlRigを作る(C++による自動、汎用バージョン)
MorphTarget取得を自動化し、どのモデルにも利用できる汎用ControlRigを作成します。
C++でノードを作ります。
色々省略していますが、ノード部分のソースはこんな感じ
#include "Units/RigUnit.h"
#include "ControlRigDefines.h"
#include "RigUnit_VrmDynamicHierarchy.generated.h"
/**
* get curve list
*/
USTRUCT(meta = (DisplayName = "VRM4U GetCurveNameFromMesh", Keywords = "VRM4U", Varying))
struct FRigUnit_VRMGetCurveNameFromMesh : public FRigUnitMutable
{
GENERATED_BODY()
FRigUnit_VRMGetCurveNameFromMesh() {}
RIGVM_METHOD()
virtual void Execute() override;
UPROPERTY(meta = (Output))
TArray<FName> Items_Morph;
UPROPERTY(meta = (Output))
TArray<FName> Items_Curve;
};
FRigUnit_VRMGetCurveNameFromMesh_Execute() {
Items_Curve.Reset();
Items_Morph.Reset();
const USkeletalMeshComponent* skc = ExecuteContext.UnitContext.DataSourceRegistry->RequestSource<USkeletalMeshComponent>(UControlRig::OwnerComponent);
if (skc == nullptr) return;
auto* sk = skc->GetSkinnedAsset();
auto morph = sk->GetMorphTargets();
for (auto& a : morph) {
Items_Morph.Add(a.GetFName());
}
}
このノードでMorphTargetのリストを取得できます。
先ほどのControlRig内の配列を置き換えましょう。
配列をノードに置き換えたControlRig |
---|
完成です。
さっそくモデルに割り当ててみます。
自動版Rigを割り当てた様子1 | 自動版Rigを割り当てた様子2 |
---|---|
シアノスさん | 桔梗さん |
どんなモデルでも、いい感じにMorphTargetを制御できるようになりました。
めでたしめでたし。
おわりに
ここで紹介した汎用ControlRigは私が作成しているプラグインVRM4Uのパッケージに入っています。
パラメータを手軽に設定するためのWidgetなども入っているので 興味があればご利用ください。
ちなみに、CurveパラメータとPoseAssetを利用すると、1つのパラメータで複数のMorphTargetを同時に操作できます。
VRM4Uはこの仕組みを利用してVRMの表情セット(例えばsmileとかblinkとか)を操作しています。