9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unreal Engine (UE)Advent Calendar 2024

Day 9

【UE5】お手軽ControlRigで表情を制御する

Last updated at Posted at 2024-12-08

Unreal Engine (UE) Advent Calendar 2024 9日目の記事です。

はじめに

お手軽にControlRigを作って、シーケンサーから表情(MorphTarget)を制御する方法を紹介します。

表情の制御自体はBlueprintやAnimSequenceでも可能です。ただ調整やプレビューにやや難がありますので、状況に応じて使い分けください。

ControlRigでMorphTargetを制御しよう

シーケンサーからこんな感じに設定できます。

ControlRigで表情を設定している様子
image.png
AvatarSample_Aさん

UE5.5で動作確認しています。
それ以前のバージョンではControlRigの挙動があやしいのでご注意ください。

表情のControlRigを作る(手動、モデル固有バージョン)

手順(1/2)

下図のようなControlRigを作成します。あちこち警告が出るかもしれませんが、以降の手順で解消します。

ざっくり解説

  • ConstructionEventにて、MorphTargetに対応するControlを生成します
  • ForwardsSolveにて、Controlの値をMorphTargetに反映させます
image.png

なおSpawnFloatControl ノードを使うには、 SpawnControlノードのInitialvalueにfloatを接続すればOKです。

image.png

手順(2/2)

MorphTarget名の配列を設定します。SkeletalMeshからMorphTargetを全て選択、コピーして、

MorphTarget名をコピー
image.png

テキストエディタに貼り付けて編集します。
↓ 貼り付けると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
)

このテキストをコピーし、配列にペーストします。格納されます。

配列にペースト 格納された様子
image.png image.png

シーケンサーからControlRigを割り当てれば完了です。

ControlRigを割り当てる 全てのMorphTargetを制御できる
image.png image.png
(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
image.png

完成です。

さっそくモデルに割り当ててみます。

自動版Rigを割り当てた様子1 自動版Rigを割り当てた様子2
image.png image.png
シアノスさん 桔梗さん

どんなモデルでも、いい感じにMorphTargetを制御できるようになりました。
めでたしめでたし。

おわりに

ここで紹介した汎用ControlRigは私が作成しているプラグインVRM4Uのパッケージに入っています。
パラメータを手軽に設定するためのWidgetなども入っているので 興味があればご利用ください。

ちなみに、CurveパラメータとPoseAssetを利用すると、1つのパラメータで複数のMorphTargetを同時に操作できます。
VRM4Uはこの仕組みを利用してVRMの表情セット(例えばsmileとかblinkとか)を操作しています。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?