MetaHuman DNA
MetaHuman DNA は当社独自のデータ形式を指します。 DNA では、完全な MetaHuman のヘッド、ボディ、およびリグを組み立てて、構成するために必要なすべての情報がエンコードされます。
これは、一般的には (メモリ内にある場合に) データにおいて互換的に使用され、それらのファイルには、ストレージに対してシリアル化された同じデータが含まれます。
DNA では、MetaHuman のヘッドおよびボディ ジオメトリとそのスケルトン (ニュートラル ポーズ時) が複数の詳細度 (LOD) でエンコードされます。 また、スキン ウェイトも LOD ごとに個別にエンコードされます。 Unreal Engine の MetaHuman Creator の DCC Export アセンブリ パイプラインでは、キャラクターのヘッドとボディが個別の DNA ファイルとしてエクスポートされます。 Expression Editor はヘッド DNA ファイルにのみ対応しており、完全にリギングされたキャラクター (ブレンド シェイプを含む) が必要となります。
リグ定義により設定された事前定義の数およびタイプの表情がジョイント アニメーションのセットとしてエンコードされ (各表情につき 1 つ)、より細かい部分のために頂点ごとの変位により増強されます (後者は LOD0 のみ)。
DNA ファイル形式はバージョン管理されます。 Expression Editor は Unreal Engine 5.6 以降の MetaHuman Creator で作成された DNA ファイルにのみ対応しています。
リグ定義
リグ定義 (多くの場合、RigDef と呼ばれる) により、形状の名前や数などの一部のリグ パラメータが設定されます。 Expression Editor の通常の使用時に RigDef が問題になることはないはずです。
リグ定義はバージョン管理されます。 Expression Editor においてリグ定義は静的であり、Unreal Engine の MetaHuman Creator で使用されるリグ定義と一致します。
リグ操作
MetaHuman には複数のメッシュが含まれており、最も重要なもの (頭部のメッシュ) は「皮膚で覆われているすべてのもの」であると考えることができ、その他のメッシュでは目や口のさまざまな部位が表現されます。 シンプルにするため、ここでは頭部のメッシュのみについて説明しますが、それ以外のすべてのメッシュも同じ原則に従います。
リグ ロジック
MetaHuman の最初の独特な特性としては、ジョイントのアップストリーム、そして、その RigLogic があります。 RigLogic は Unreal Engine と Maya の両方において演算子/ノードとして提供されており、意味論的に有効な数百のチャンネル (たとえば、眉の内側の上げ下げなど) を処理します。また、法線スケールの実行を多数のジョイントの変形にマッピングするだけではなく、(LOD0 での) 頂点ごとの変位 (形状/モーフィング) や、外部に接続された他の一部のパラメータ (たとえば、マテリアルにつながっている皺のトリガーなど) のマッピングを行います。
メッシュの変形
頭部のメッシュは共通のソフト スキニング演算子により、ジョイントにスキニングされます。 ソフト スキニングに関する重要なこと、および一般的に適用されることは、すべてここで実行されます。
「形状アニメーション」(Maya の用語での表現) という形での変形の追加レイヤーがあり、言い換えると、これはむしろ頂点ごとの変位マップです。 これらは、ジョイントにより動く粗い質量や大きい質量に対するわずかな追加に寄与するよう意図されています。
次に挙げる 2 つの点は、常に頭に入れておくことをお勧めします。まず、頂点ごとの形状の補間は線形となるため、大きい質量を動かすと人工的に見える上に、中程度の (パラメータ空間内での) 問題になる可能性がはるかに高くなります。 また、頂点の変位は LOD 0 でのみ使用され、より低い LOD では完全に無視されます。
詳細度 (LOD)
MetaHuman には LOD 0 から LOD 7 までの 8 レベルの使用可能な詳細度 (LOD) 設定があります。 LOD 0 で複雑度が最も高くなり、すべての項目は降順で後に続きます (トポロジ密度、ジョイント数など)。LOD 0 は最も詳細な「最高の」LOD を指し、LOD 7 は最低の LOD を指します。
すべての LOD において動作するジョイントのセットは 1 つのみです。 LOD を低くする際のジョイント数の減少は除外により行われ、後続の各 LOD では、サブセット全体からジョイントの一部が除外されます。
頂点の変位形状が使用されるのは LOD 0 のみです。
各 LOD には独自のジオメトリ セットがあり、LOD 間で共有されるメッシュはありません。したがって、ジオメトリ関連のすべての属性 (スキニング ウェイトの割り当てなど) は LOD ごとになります。
ジョイント
スケルトンは Maya ジョイントのバニラ セットです。 ただし、これらのジョイントに対するツールキットでの影響はさまざまであり、特にジョイントの用途や、ジョイントが対象となる自動化の程度によって異なります。
メッシュに関連するジョイントの配置は、バインド ポーズ (ニュートラル ポーズで表示) とさまざまな表情の間で異なるものになります。 バインド ポーズは多少体系的に扱うことができる一方で、表情の技術的な正確性や顔立ちについては、目視で検査する必要があります。
バインド ポーズ
サーフェス ジョイントはさまざまな段階で自動的に配置され、その名前から分かるように、メッシュの特定のサーフェス位置のできる限り近くに配置することが最善です。 これらはスケルトンのジョイントの大部分を占めるため、実際のところ個別のリストは必要ありません。
ボリューム ジョイントの大半は、ヘッドがスキニングされる対象となる (サーフェス ジョイントではない) 他のすべてのジョイントです。
一部は自動的に配置できますが、すべてを自動的に配置できるわけではなく、手動での検査や調整を必要とするジョイントがある場合、それらは自動的に配置できません。 その名前から分かるように、これらは大きいボリュームを動かすためのものです。
参考として、バインド ポーズの更新中に自動的に配置されるボリューム ジョイントを以下に示します。
FACIAL_C_Forehead FACIAL_L_ForeheadIn FACIAL_R_ForeheadIn FACIAL_L_ForeheadMid FACIAL_R_ForeheadMid FACIAL_L_ForeheadOut FACIAL_R_ForeheadOut FACIAL_L_EyesackUpper FACIAL_R_EyesackUpper FACIAL_L_EyelidUpperFurrow FACIAL_R_EyelidUpperFurrow FACIAL_L_EyeCornerInner FACIAL_R_EyeCornerInner FACIAL_L_EyeCornerOuter FACIAL_R_EyeCornerOuter | FACIAL_L_EyesackLower FACIAL_R_EyesackLower FACIAL_L_CheekInner FACIAL_R_CheekInner FACIAL_L_CheekOuter FACIAL_R_CheekOuter FACIAL_L_CheekLower FACIAL_R_CheekLower FACIAL_C_NoseLower FACIAL_L_Nostril FACIAL_R_Nostril FACIAL_C_LipUpper FACIAL_L_LipUpper FACIAL_R_LipUpper | FACIAL_L_LipUpperOuter FACIAL_R_LipUpperOuter FACIAL_L_LipCorner FACIAL_R_LipCorner FACIAL_C_LipLower FACIAL_L_LipLower FACIAL_R_LipLower FACIAL_L_LipLowerOuter FACIAL_R_LipLowerOuter FACIAL_L_Jawline FACIAL_R_Jawline FACIAL_L_NasolabialBulge FACIAL_R_NasolabialBulge |
バインド ポーズの更新中に自動的に「配置されない」ボリューム ジョイントを以下に示します。
FACIAL_C_Skull FACIAL_L_EyelidUpperB FACIAL_R_EyelidUpperB FACIAL_L_EyelidUpperA FACIAL_R_EyelidUpperA FACIAL_L_Eye FACIAL_L_EyeParallel FACIAL_L_Pupil FACIAL_R_Eye | FACIAL_R_EyeParallel FACIAL_R_Pupil FACIAL_L_EyelidLowerA FACIAL_R_EyelidLowerA FACIAL_L_EyelidLowerB FACIAL_R_EyelidLowerB FACIAL_C_Nose FACIAL_C_NoseTip FACIAL_C_MouthUpper | FACIAL_C_TeethUpper FACIAL_C_LowerLipRotation FACIAL_C_MouthLower FACIAL_C_TeethLower FACIAL_C_Tongue1 FACIAL_C_Tongue2 FACIAL_C_Tongue3 FACIAL_C_Tongue4 FACIAL_C_Jaw FACIAL_C_Chin |
上記のリストにある 2 つのジョイント (FACIAL_L_Pupil および FACIAL_R_Pupil) には、さらに他と区別される特性があり、 これら 2 つのジョイントだけは、スケーリング コンポーネントを動的に変更してメッシュに影響するジョイントです。
リグにはボディ ジョイントもありますが、エクスポートされたリグでは、ボディ ジョイントはボディ リグ コンポーネントから提供されます。 これらのジョイントの変更は推奨されませんが、その必要があると判断した場合は、対応する変更をボディ リグに送信するツールを用意する必要があり、このツールはニュートラル ポーズ編集モードでのみ機能します。
ボディ ジョイントの位置を変更する何らかの理由がある場合にも、表情では変更すべきではありません。 これらのジョイントに対する表情での変更は DNA に送信されないため、結果として、セッションの表示内容は DNA により最終的にアニメートされる内容と異なるものになります。
最後に、3 つのボディ ジョイント (FACIAL_C_Neck1Root、FACIAL_C_Neck2Root、および FACIAL_C_FacialRoot) は、常にそのままで残しておく必要があります。 これら 3 つのジョイントは常にボディと一致している必要があり、ボディ リグの選択に依存します。
上記に該当するすべてのボディ ジョイントのリストを以下に示します。
spine_04 spine_05 clavicle_pec_l clavicle_pec_r spine_04_latissimus_l spine_04_latissimus_r clavicle_l clavicle_out_l clavicle_scap_l upperarm_l | upperarm_correctiveRoot_l upperarm_out_l upperarm_fwd_l upperarm_in_l upperarm_bck_l clavicle_r clavicle_out_r clavicle_scap_r upperarm_r upperarm_correctiveRoot_r | upperarm_out_r upperarm_fwd_r upperarm_in_r upperarm_bck_r neck_01 neck_02 head FACIAL_C_Neck1Root FACIAL_C_Neck2Root FACIAL_C_FacialRoot |
ジョイント マッチング
ジョイント マッチングは Expression Editor における重要な操作であると同時に、表情ポーズでのジョイント位置の自動変更の唯一のソースとなります。
本質的に、ジョイントのリストはバインド ポーズのリストとは異なります。
非線形ソルバ ジョイント マッチング (NLSJM) は複数のパスで構成されており、各パスは特定のリストのジョイントに影響します。NLSJM の代用となる機械学習ベース ジョイント マッチング (MLJM) は、変更不可である除外リストを除くすべてのジョイントに影響します。
以下の特定の除外対象は自動的に「配置されません」。
neck_01 neck_02 head FACIAL_C_Jaw FACIAL_C_LowerLipRotation FACIAL_L_Eye FACIAL_R_Eye FACIAL_L_EyeParallel FACIAL_R_EyeParallel | FACIAL_L_Pupil FACIAL_R_Pupil FACIAL_L_EyelashesUpperA1 FACIAL_R_EyelashesUpperA1 FACIAL_L_EyelashesUpperA2 FACIAL_R_EyelashesUpperA2 FACIAL_L_EyelashesUpperA3 FACIAL_R_EyelashesUpperA3 | FACIAL_L_EyelashesCornerOuter1 FACIAL_R_EyelashesCornerOuter1 FACIAL_C_Skull FACIAL_C_Nose FACIAL_C_MouthUpper FACIAL_C_MouthLower FACIAL_C_TeethUpper FACIAL_C_TeethLower |
上記のリストにある 2 つのジョイント (FACIAL_L_Pupil および FACIAL_R_Pupil) には、さらに他と区別される特性があり、 これら 2 つのジョイントだけは、スケーリング コンポーネントを動的に変更してメッシュに影響するジョイントです。