
前から書こうと思っていた、庭子アバターでの自動ウェイト設定方法を記述しておきます。
はじめに
今回は Blender 4.3.2 で動作確認しました。昔(2.9xの頃)より自動ウェイトが失敗しにくく(Failしないで通る)、ウェイト塗り品質も上がっているように感じました。
【庭子アバターコンセプト:解決したかった課題、自動ウェイト主体になった理由】
- キレイな素体メッシュ、補助ボーンによるスムースな関節動作を実現したい。
- 補助ボーン実験を頻繁にやりたいし、アバター素体メッシュも更新していく予定。その度に手でウェイト塗りするのはイヤ。
ということで、可能な限りBlenderの自動ウェイト活用する方向にしています。
【ポイント】
- 頭メッシュとメイン素体メッシュに分かれている。頭メッシュは目をのぞいて基本headボーンウェイト一色で塗られている。頭メッシュの首周りはneckボーンウェイト。
- 首から下のメイン素体ボディメッシュは基本自動ウェイト一発ですが、頭メッシュと接する首の境界はマニュアル(手作業)でのウェイト塗りです。
- 衣服ウェイトは、メイン素体ボディからデータ転送でウェイト設定し、細かいところをウェイト手塗りで修正する方針。これは仕方なし。
- 髪の毛、リボン、などのユレモノ・ボーンが自動ウェイト設定時にメイン素体ボディのウェイトに影響与えてしまう。なので自動ウェイト設定時には、ユレモノ・ボーンを1m(2mでもいい)上空に待避させて置く。自動ウェイト設定終わったら戻す。
説明で使用する庭子アバター
庭子アバター v01.40 Blender fileを使って説明します。庭子アバター 配布所から「Niwako-v0140 Blender file」をダウンロードしてzip解凍してください。下記のファイルが解凍されるはずです。

「庭子 70k v014 セーラー服.blend」ファイルをBlenderで開いてください。下記のように表示されればOKです。

ボーンの表示は、見やすいように「スティック」形状にしています。

庭子アバターのウェイト状況確認
あらためて庭子アバターのウェイト関連状況確認します。
衣服は邪魔なので、非表示します。シーンコレクションの「Clath Release」というグループの目のアイコンをクリックして、衣服関連全て非表示にしましょう。

Body-Headlessメッシュを選択すると。頭メッシュと分離していることがわかります。頭メッシュには表情などのBlendShape(Shape key)が入っていますので可能な限り分離して扱う方が良いです。どうしてもskinned meshオブジェクト数減らしたいときに統合(Ctrl-J)を検討しています。
Body-Headlessメッシュを選択した状態で、ウェイトペイントモードに移ってください。
ウェイトペイントモードで、頂点グループの検索ボックスに「upperarm」といれて、その中から「upperarm.twist1.L」を選択してください。下記のようにupperarm.twist1.Lのウェイト(これは自動ウェイトで塗られた物です)が表示されます。

同様にupperarm.twist2.L, upperarm.twist3.Lも見てみましょう。


様々な実験・トライアルで、これらをいちいち手ウェイト塗りするのが耐えられなくて自動ウェイト主体になりました。
頭メッシュ(メッシュ名はBody)のウェイト状況も確認しておくといいでしょう。なぜ頭なのにBodyという名称かというとMMD表情のブレンドシェイプはBodyというメッシュ・オブジェクトの中にないと動作してくれないからです。
下記が頭メッシュ(Body)のheadボーン頂点グループのウェイト。

下記は頭メッシュ(Body)のneckボーン頂点グループのウェイト。この首(neck)部分で今回自動ウェイト設定するBody-Headlessと接続します。なのでBody-Headlessの首境界部分もneckボーンのウェイト100%にして、neckボーン以外のウェイトを0%にしておかなければ隙間無く、スムースに繋がりません。

自動ウェイト
実際に自動ウェイトしていきますが、その前に髪の毛・揺れ物ボーンの待避を行わないと行けません。
オブ希求とモードで、いずれかのボーンをクリックしてアーマチュアプロパティを表示してください。その中にボーン久コレクションがあります。
今は下記のようにボーンコレクションのLayer2(アバター素体のHumarioid アーマチュア+補助ボーン)のみ表示されています。

Layer3も表示すると下記のようになります。

髪の毛ボーン、スカートボーン、腰布の結び目ボーンなどが出てきます。ここでベレー帽を揺らすボーンをLayer3に移動し忘れているのを気づきました。頭の上なのでBody-Headlessまで距離があり、自動ウェイトにBeret.001ボーンは影響しません。実質問題無いのですが、今後は整理整頓の意味でLayer3に移動しておこうと思います。

Layer2を非表示にし、Layer3のみ表示して、「ボーン編集モード」に移ります。「a」キーを押してLayer3の髪の毛ボーン・揺れ物ボーンを全選択します。

ここで、キーボードをg, z, 1の順でおします。選択したボーンをg:移動、z:z軸方向、1:1m と指示したことになります。下記のように表示されるので「Enter」キーで確定してください。

自動ウェイト設定に、髪の毛・揺れ物ボーンを影響させないために、1m上方に待避させました。これを簡単に行うために、Layer2: アバター素体アーマチュアボーン、Layer3: 髪の毛・揺れ物ボーンと分けています。Layer1:には制御リグを入れることがありますが、今回は使っていません。2m上方に待避させてもいいです。その場合にはg,z,2とキーを打ちます。あとで自動ウェイト後、待避したボーンを戻すときには、先の移動距離を覚えておいて、数字をマイナスにして、g,z,-1(g, z, -2)と入力します。
次に自動ウェイトを行うので、Layer2を再度表示しておいてください。

自動ウェイト設定前には、対象メッシュ(今回はBody-Headless)のウェイト用頂点グループを全削除しておきましょう。オブジェクトモードでBody-Headlessオブジェクト選択した状態で、メッシュプロパティの頂点グループを見ます。頂点グループリストの右側に「V」のボタンがあるので、それを押してメニュー表示します。その中の「全グループを削除」を選択してください。

下記のようにキレイになくなります。この状態ではボーズモードでボーンを動かしてもアバターが追従しません。ウェイトが全削除されたので当然ですね。

自動ウェイトを実行します。オブジェクトモードでBody-Headlessメッシュを選択した状態で、SHIFT押しながらマウスの左クリックで素体向けボーン(spineでもchestでも)をクリックしてください。最初にウェイトを塗るメッシュを選択し、次にウェイトの元になるアーマチュア(ボーン)を連続選択した状態になっています。ここでCtrl+Pを押してください。メニューが出るので「アーマチュア変更」の所にある、「自動ウェイトで」を選択してください。これで自動ウェイト実行完了です。
先ほどクリアされていたメッシュプロパティの頂点グループにはボーン名のリストが出来ているはずです。

先ほどと同じように upperarm.twist1.L などのウェイトが、自動ウェイトで塗られているか確認しましょう。

またポーズモードで首(neckボーン)を動かしてみて、髪の毛などに体メッシュが追従していないか確認しましょう。

首境界ウェイトの手動設定
頭と繋がる首境界部分のウェイトはneckボーンのみ100%ウェイトにしておかないと頭メッシュとスムースに繋がりません。
下記では見やすいようにソリッド表示モードにしています。首がまっすぐだと頭・首接続部に問題無いですが・・・

現在の自動ウェイト直後の首境界ウェイトでは、下記のようにneckボーンをポーズモードで回転させると隙間が出てきます。これを手動設定で修正します。

ポーズモードからウェイトモードに入ることで、ボーンをマウス(ALT+マウス左クリック)で選択しながら、ボーンを動かしながらウェイト塗りすることができます。とても重要なウェイト塗り方法です。
下記のように首境界を編集しやすい構図(視点)にしてください。

オブジェクトモードでBody-Headlessを選択した状態でTABキーを押して「編集モード」に肺ってください。Body-Headlessの首境界の辺をCtrl-マウス左クリックして、下図のようにループ選択してください。

次にCtrl+「+」(Ctrlキー押しながらテンキーの+)を押して選択範囲を拡大します。下図のように2列分選択した状態にしてください。

下記のようにこの首境界、頂点2列のウェイトを設定していきます。shoulder.ASSIST.Lのウェイトをゼロにするのは下記の手順です。
- ①検索ボックスにshoulderを入力
- ②shoulder.ASSIST.Lを選択
- ③ウェイトを「0」に設定
- ④「割り当て」ボタンを押す
- ⑤首2列のshoulder.ASSIST.Lのウェイトが全て0になる。

同様にして shoulder.ASSIST.L, shoulder.ASSIST.R, head (要はneck以外のここにウェイトが乗っているボーン)のウェイトを「0」にしてください。そして、neckボーンのウェイトを「1」にしてください。

この状態でポーズモードから首を動かすと下記のようになります。見やすいようにソリッド表モードにしています。

首と堂の境界は完全に繋がりましたが、滑らかさがありません。ウェイトペイントで「ぼかし」て滑らかにします。
ボーン選択・動かしながらウェイト塗りするために、ポーズモードからウェイトペイントモードに入ります。
髪の毛メッシュは邪魔なので、「hair mesh」オブジェクトを非表示にしておくと作業しやすいでしょう。

オブジェクトモードでボーンをクリックして、CTRL-TABを押し、ポーズモードに入ります。左上のモード選択ボタンからポーズモードに入ってもかまいません。

ポーズモードで、今回対象となるneckボーンをマウス左クリックで選択しておくといいでしょう。
この状態のポーズモードから、Body-Headlessオブジェクトを選択します。(左上はオブジェクトモードと表示が切り替わります)

ここでBody-Headlessが選択出来ない場合、下記の二つがoffになっているかをチェックしてください。この二つがoffでないとボーン選択・動かしながらのウェイトペイントができません。
- 「編集」→「オブジェクトのモードをロック」:off
- 「オーバーレイを表示」→「非アクティブ形状をフェード」:off

先のポーズモードからBody-Headlessオブジェクト選択した状態で、CTRL-TABを押してください。
下記のようにサークルメニューが出てきます。この左上の「ウエイトペイント」を選択してください。

これで下記のように、ALT-マウス左クリックで任意のボーンを選択し、そのボーンを動かし(R:回転、G:移動)ながらウェイトペイント出来るようになります。とても便利です。ウェイトペイントのメインモードをこれにして欲しいと思います。

次に「ぼかしツール」でウェイトをぼかしてい行きます。下記のようにぼかすのが良い感じのようです。首の後ろも忘れずにぼかしましょう。

neckボーンを動かしながら、こんな感じで滑らかにウェイトをぼかしてみましょう。

今回は下記のようになかなか良い感じですが、時にはぼかしすぎてまた隙間が空いてしまうことがあります。

ダメ押しで、首境界1列だけneckウェイト100%に設定し直しましょう。
先ほどの要領で、編集モードから1列のみ選択します。

この1列のshoulder.ASSIST.L, shoulder.ASSIST.R, head(要はneck以外のここにウェイトが乗っているボーン)のウェイトを「0」にし、neckウェイトを「1」にします。

前後左右から動作チェックします。首と胴体が隙間無く、滑らかに繋がればOKです。

最後に、忘れずに待避した髪の毛・揺れ物ボーンを元に戻しましょう。ボーン編集モードで、Layer2を非表示にし、Layer3のみ表示して「A」キーで全選択します。

g, z, -1(2m移動した場合はg, z, -2)をキーボードで順に打ち込み「Enter」で確定するとと元に戻るはずです。

最後に:自動ウェイトが出来る場合と出来ない場合がある
メッシュ形状によって自動ウェイトが出来ない場合があります。庭子アバターの体部だと、爪の鋭く切り込んでいたところ、股下・お尻の形状が入り組んでいたところが原因で最初は自動ウェイト通りませんでした。
「ボーンヒートウェイト:一つ以上のボーンで解決に失敗しました」とエラー・警告がでて自動ウェイトされません。今でも庭子アバターの頭部は自動ウェイト失敗します。


こういう場合は、怪しい部分のメッシュを削って自動ウェイトが通るかトライ&エラー実験して、原因箇所を特定していきます。どこか検討もつかないときは半分にしてどちらが悪いか見ていきましょう。
庭子アバター頭部の場合には、原因は分かっていて目の睫毛メッシュです。下記のように睫毛のみとりだして自動ウェイトかけても失敗します。

下記のように睫毛の鋭利な先端部分三カ所のメッシュを削ると自動ウェイトが成功します。

いずれ自動ウェイト通るように睫毛メッシュ修正しようと思いつつ、頭部はheadボーンウェイト一色なので、自動ウェイトの必要あるかな・・・、と悩みつつ今の状態になっています。おそらくどこかで修正するでしょう、いずれやりたいBlendshape大改造の時にでも・・・。
自動ウェイト主体にするとある程度、メッシュ形状が制約うけます。思いのままのメッシュ形状を選択できない場合もあります。庭子アバターでは、そえでも自動ウェイトの便利さを選択し、自動ウェイトが通るメッシュ形状の中でも、キレイなボディラインのメッシュを目指してみました。