アバターの表情を変えるにはシェイプキーを使えばいいのか〜
あ、この表情いいな(フヒッ)!

よくみたらデフォルトの表情、口の大きさが若干変だな?変えたくなってきた
デフォルトの表情を変えたらシェイプキーの形がおかしくなっちゃった!?
シェイプキーの変え方がわからないよ〜😭

…ということで、
Blenderにて、後で作った顔の方がよかった!しかしベースの顔を後で調整する方法がわからない!という場合にどのようにリカバリーするのかの方法について紹介します!
今回はBlenderの基本機能だけで特定のシェイプキーの状態で頂点を保存し 、後で適用する方法について説明します。
検証に使ったBlenderバージョン
- 4.2.1 LTS
■背景と原理
Blenderにおけるシェイプキー(Shape Key)とはBasisに対する頂点移動量の差分という形で表現されます。
そのため、シェイプキーでは回転などのような平行移動以外の移動をうまく表現することができません
同じ頂点情報を持つオブジェクト間で、頂点の位置情報をコピー・ペーストすることができます。
また、オブジェクトを構成する頂点の一つ一つにはそれぞれ頂点番号が割り振られているため、
この頂点番号による位置の変化を利用することでキャラクター表情の共通化ができ、一つのコントローラーですべてのキャラクターの表情を操作できるように設計されたゲームがあるのだとか…!(ファイ〇ーエ〇ブレム)1
Blenderの編集作業においても、例えば異なるオブジェクト間で同じ頂点番号の頂点に関する位置情報をコピーすることができます。
課題
しかし、シェイプキーおけるBasisに対する頂点移動というものが厄介で、
以下の図のように基準となるシェイプキーが変わると、意図した表情の変化を表すことができなくなります。
一例
少々説明が難しいですが、図例にて紹介します。
以下の一通りの表情を作成したとします。
- 基本の表情:Basis
- 口をすぼめた表情:Purse
- 頬を膨らませた表情:Pout
- 「お」の口:Lips_oh

キューピーちゃんみたいだな
Basisの表情は若干閉じた口元が横に広く間延びしていて、
また頬はすっきりしてますが丸顔を目指そうとしたときには、ほっそりしすぎな印象があります。

そこでシェイプキーのスライダーから、Purse:0.6、Pout:0.4に調整させることで、口をすぼめて頬を膨らませることでふっくら感を持たせました。
こちらの表情が気に入ったのでこれをBasisにしたくなりました。


ここでリップシンクに使用するシェイプキー「Lips_oh」のスライダーを1にして、口の確認をしてみました。
すると、Purse:0.6 + Pout:0.4 + Lips_oh:1.0の設定では、Purseで口をすぼめたせいでLibps_ohの口元がつぶれた顔になってしまいました。

ではPurseの値をゼロに戻して Pout:0.4 + Lips_oh:1.0の表情を設定すればいいと思いますが、ここからが曲者です。
Purseの表情をBasisに上書き(※)をすることができますが、Lips_ohのシェイプキーは基準となる頂点位置に対する位置変化を表します。
もともとのBasisに対しての「Lips_oh」の口が、新しく設定したBasisに対してはうまく設定できなくなってしまう場合があります。
つまりは複数のシェイプキーを合体させた状態を新しいBasisとしたいときに、今まで設定していたシェイプキーをそのBasisに対して適用すればいいのか解決法がわからないという事態に陥ります…

※シェイプキー一覧でPurseのシェイプキーを先頭に持っていき、ほかのシェイプキーのRelative toを指定することで、Basisの表情を変更できます



解決法
ということで本題です。
シェイプキーの[∨(Shape Key Special)]メニューの「Apply All Shape Keys」と「Join as Shapes」を使用します。
前提条件として、シェイプキーのコピー元とコピー先は同じ頂点数(頂点番号)を持っている必要があります。
また、以降の手順ではシェイプキーが消えるような非破壊な操作を行うため、念のためバックアップを保存することをお勧めします。
⓪準備
オブジェクトモードにて、あらかじめシェイプキーを設定したいオブジェクトをShift+Dキー(オブジェクトの複製)で複製します。

通常は変更先となるオブジェクトのコピーを使用します。
本例では顔メッシュ適用先となる”Head_Mesh_Target”(Target)をコピーし、シェイプキーのコピー元”Head_Mesh_Source”(Source)とします。
片方のオブジェクトに対してはシェイプキーが消えるような非破壊な操作を行うため、念のためバックアップを保存することをお勧めします。
①デフォルトのシェイプキーの適用
デフォルトの表情にしたいシェイプキーの調整を行います。
オブジェクトモードにてTargetオブジェクトを選択し、シェイプキー一覧で各表情のスライダーを調整してデフォルトにしたい顔にシェイプキーを調整します。
その後、Propertyエディター>Dataタブのシェイプキー サブメニューにてシェイプキーサブメニューの[∨(Shape Key Special)]メニューより [Apply All Shape Keys]を実行します。
今回の例では、Pruse:0.6、Pout:0.4 をミックスした表情を設定し、 [Apply All Shape Keys]を適用してBasisの表情にします。

このメニューを使用するとすべてのシェイプキーはクリアされてしまいます。

以降、このシェイプキーの状態が「Basis」となります。

②シェイプキーの結合
Sourceのシェイプキーを操作し、コピーしたい表情の形状にします。
本例ではPout:0.4、Lips_oh:1.0の表情を作成しています。
オブジェクトモードにてShiftキーを押しながらSource→Targetの順にオブジェクトをクリックして選択します。

Propertyエディター>Dataタブのシェイプキー サブメニューからリスト右側の[∨(Shape Key Special)]をクリックし、メニューから[Join as Shapes]を選択します。

するとTargetのシェイプキーに<Targetオブジェクト名>.00xなるシェイプキーが登録されます。

このシェイプキーはSourceの変形後の状態を反映させたものになります。
つまりはTargetのBasis表情の状態にかかわらずSourceの表情を適用することができます。
シェイプキー名を適切な名前にリネームしたら、基本的なシェイプキーの転送は完了です。

③ 「Join as Shapes」操作の繰り返し
その後、②の手順を表情差分の数だけ繰り返しSourceのオブジェクト名からシェイプキーを結合します。
表情差分の数だけ繰り返し必要がありますが、この方法であれば確実にシェイプキーのセットをコピペすることができると思います。
スクリプトなどの自動化やこの機能を利用したアドオンを使用することで、これら操作を効率化できる可能性があります(未検証です。。すみません)
デフォルトのシェイプキーを書き換えたいという特殊な状況を除き、2つのオブジェクト間でシェイプキーを転送したいだけであれば、②の操作でOKです。
終わりに
調べる手がかり、というかどんなワードで調べればいいのか見当もつかないようなことってありますよね…
皆さんのBlenderライフの一助となりましたら幸いです!
脚注・参考
- “実在感”のあるルックでキャラクターを魅力的に見せる『ファイアーエムブレム エンゲージ』:https://cgworld.jp/article/202311-cgw303-fee.html ↩︎
データの転送と言えば「データ転送」モディファイヤですが、ことシェイプキーに限っては転送することはできないようですね、、
シェイプキーの転送方法については引き続き検証、続報をお待ちください。