バックアップ:ブロマガ たんさま!:メタセコイア4でのメッシュ統合に伴うスキニングとブレンドシェイプ
※この記事は2019-07-09 07:55に投稿された記事のバックアップです。
前回、UVとテクスチャを弄ってメッシュを統合したんだけど、今回はその続編として、ウェイトとブレンドシェイプを転写するところをやってみたので、その記録だよ。
今回も自分の備忘録も兼ねて。
●スキン対象オブジェクト化
先ずは、統合後のメッシュを、ボーンモードのスキン設定から対象オブジェクトに加えてみよう。そしてスキニングのペイントモードで見てみると…
とりあえず、統合後メッシュがボーンウェイトの対象に設定されたことがわかったよ。
だけどこのウェイトは、自動でボーンの位置から適当に計算されたものなので、ほしいウェイト分布になっていないことも多い。
特に今回は、もともと設定されていたウェイトを転写したいので、どのみちこのままでは使えないんだよねw
●転写元のウエイト情報をエクスポート
次に、ウェイトの転写元のメッシュから、ウェイト情報を書き出してみよう。
転写元になるメッシュのレイヤーを選んで、スキニングの「複製」タブから「エクスポート」。
これで、ウェイト情報が記述されたxmlファイルが書き出されるよ。
※因みにこの書き出されたウェイト情報は、頂点の座標とそれに紐づいたボーンウェイト情報が記述されているみたい。興味のある人は、テキストエディタであけて覗いてみるのもいいかもね。
ボーン名称を変えての転写や、ウェイト値の閾値を揃えるなんて応用もできるかもしれない。
さて、問題はここからだ。
●メタセコイア4のウェイト転写の機能制約
これは以前から問題視してたんだけど、メタセコイア4って、ウェイトの転写時に1メッシュから1メッシュへの『1対1転写』しかできないんだ。
統合後メッシュに対して、書き出したウェイト値をかきこみたいんだけど『1対1転写』の仕様だから、元が統合前の複数のメッシュからだと、うまくできないわけ。
例えば…
もともと「肌」「服」「髪」のメッシュがあって、ウェイトが設定済みであったとしてね。
それをコピーして統合した「全身」メッシュがある。これからウェイトを転写しようとする。
だけど、メタセコ4でやると、
「肌」のウェイトをインポートすると「全身」が「肌」のウェイトに、
「服」のウェイトをインポートすると「全身」が「服」のウェイトに、
「髪」のウェイトをインポートすると「全身」が「髪」のウェイトに…
なってしまう。
どうやったらいいの?と、サポートに問い合わせてみたんだけど、
『1対1転写』が仕様だから、現状ではできないです。
今後アップデートでの機能実装を検討します。(要約)
という返答だった…。
だけどもういちどサポート掲示板をつぶさに調べたところ、2018年11月~12月に、同じような内容の質問があり、直後のアップデート(4.6.9)で対応策が実装されていたことがわかったんだ。
これの対処法は次の手順。
ウェイト情報のインポート時に「選択頂点のみに適用」する選択肢がある。
これを利用して例えば「服」のウェイト情報をインポートしたい場合は「服」だった部分のみの頂点を選択し、インポートをすることが可能になるんだ。
肌メッシュだった部分は、肌メッシュと同じ部分の頂点のみを選択しウェイト情報のインポートをする。
しかし問題は、「どうやって統合前のメッシュの部分のみの頂点を確実に選択するか」ということだ。
考えられる選択肢は3つくらい。
a.そのまま「連続面選択」などを駆使して根性で選択する
b.UV編集画面から該当部分のUVを選択してUVToolsXの機能で頂点選択する
c.材質ウインドウから「選択材質の頂点・面を選択」を使う
----------
aは最も単純な方法。モデルのつくりによっては、簡単だと思う。しかし今回のモデルは、構造的に入り組んでいる部分があるし、選択ミスなんかも頻発することが考えられるので、よい選択肢とは思えない。
bは、前回の記事でやったように、UVとテクスチャをかなり弄ってしまい、かなりカオスな状況なので、どの部分がどのメッシュだった部分かわからなくなってるから、それを調べないとだし、やっぱり選択ミスも頻発しそうだから避けたいな。
c…既に前回統合しちゃってるから、できないよ。
----------
という、相当に面倒なことになっているわけ。
●もう1回統合やりなおす!?
こうなったら、面倒でも頂点選択で頑張っていくしかないか…いや、まてよ?
もうひとつ別のテを考えた。(友達からヒントをもらった)
ウェイト転写用に、もう1回、メッシュ統合したものを作ってしまう。
しかしこれはあくまで、ウェイト転写のためだけに、一時的に利用するものだ。UVもテクスチャも弄る必要はない。だから難しいことも面倒もない。
ただし、材質だけはちょっと細工が必要なんだ。
統合前のメッシュを、1つずつ複製する。
新しく材質を設けて、この複製したメッシュに適用する。
これを、統合前の全部のメッシュに行う。
そうすると、複製した統合前メッシュ1つに対して1つの材質が割り当てされるはずだね。
次にこの「複製統合前メッシュ」を統合しちゃう。
UVとかテクスチャのことはこの際、一切考えなくていい。
そしたらこのメッシュをスキン対象に設定するよ。
これに、ウェイト情報をインポートしていくわけだけど、さっきと違うのは、統合前メッシュの部分ごとに材質が分けられているという点だね。
これを駆使すれば、確実に、統合前と同じ部分のみを選択することができるわけだ。
材質を選んで「他」タブから「頂点・面を選択」するよ。これで選んでる材質の頂点のみが選択された。
統合前メッシュごとに材質を割り当ててから統合したことで、疑似的に統合前と同じわけかたで選択することが可能になったわけだね!
そうして、頂点選択した状態で、最初のほうでxmlに書き出したウェイト情報をインポートして「選択頂点のみに適用」しよう。
よし、できた!統合前のウェイトを、統合後の1メッシュに、完全に再現したよ!
しかし、欲しいのはこれではない、これはまだ、中間ファイルに過ぎないぞ。
この頂点を全選択して、再度ウェイト情報をエクスポートだ。
●ようやく、初期の目的を果たせる…
いよいよ、前回作成した統合メッシュに、このウェイト情報をインポートしよう。
今回は『1対1転写』だから、きっちりいける筈だ!
いけた!いけた!やったぜ!
動作確認してみよう、ちゃんとできているね!
ひゃー、一時は詰んだかと思ったけど、うまくできたわー
さてしかし。もうひとつ、肝心なものを転写しなくてはいけない。
ブレンドシェイプだ…
●ブレンドシェイプを転写作成
ありがたいことに、これにはプラグインの「TransmorphOther」というものが使える。
頂点の座標のみを基準に、転写元と同じような場所にある頂点に対してブレンドシェイプを自動作成してくれるんだ。
だから今回のように、統合で頂点番号がすっかり変わってしまったとか、ちょっと形状を微調整したとか、セグメントを増やしたとか、そういうのでもブレンドシェイプを作成しなおしてくれるんだよね。
だけどちょっと注意してほしい。
今回のような顔面の表情を転写する際に、例えば目の付近の前髪とか、顎付近の襟とかも、いっしょに動かしてしまうんだな。
これは多少ずれたり増えたりしたものに対しても転写を可能にするために、該当の頂点付近の別の頂点を、自動計算して割り当ててるからなんだ。
だけどここでも、ウェイトのときと同じく「選択頂点のみに転写」ができるので乗り切れる。
もうひとつ、注意したいことがある。
今回利用する「TransmorphOther」プラグインは、本来はメタセコ2~3時代から存在していて、MMD用データ作成に広く利用されてきた「Keynote」プラグイン用のブレンドシェイプ(モーフ)を対象にしたものなんだ。
なので、この「Keynote」の仕様に準拠した書式のブレンドシェイプしか編集できない。
難しい仕様ではないので、なんとかなるんだけどね。メッシュの名前を以下の書式に変えておくことになる。
参考になるのは、例えばこの2008年のブログの記事に書いてある記述。
「elem:モーフィングの名称-ターゲットの名前」
というやつだね。
※3以前のメタセコにはボーン、ウェイト、ブレンドシェイプとかの仕様が存在しなかったので、メッシュの命名法則を設けることで、プラグインが認識できる情報として利用していたんだね…
●というわけで
ますは、ブレンドシェイプ用のメッシュの名前を上記の書式に準拠して書き換えていこう。
めんどくさいけど難しいことじゃない。スペルミス(よくある!)がないか、細心の注意が必要だ。
従来「Body」メッシュに設定されていたブレンドシェイプは、
elem:(シェイプ名)-Body
とメッシュ名を書き換える。
これを、統合先である「ShangHighMesh」に転写していこうというわけ。
ちなみに統合前の「Body」メッシュの部品はこれだけ。
だから、統合後メッシュのほうの、同じ部品に相当する部分のみを選択する。
ウェイト転写のときほど絶望的な仕分けではないのでたすかった…
じゃ、この状態で、「Body」メッシュと「ShangHighMesh」メッシュを選択して、オブジェクト→TransMorphOtherを選択しよう。
プラグインのインターフェースでも、転写元、転写先、転写するブレンドシェイプ項目が、確認して選択できるようになってるよ。VRCの自動制御用の最低限の数なんだけど、結構沢山あるよね。
そして実行すると、ブレンドシェイプ用メッシュの数が倍になるよ!
このうち
elem:(シェイプ名)-ShangHighMesh
になってるのが、プラグインで自動作成されたメッシュだよ。
なんか急に増えた感…これだけの数のブレンドシェイプが、こんなにあっさりできたのかな?
実際に順番を入れ替えて整理して、メタセコ上のモーフ対象にちゃんとできるか確認しよう…できてるわ!
すげー、プラグイン様様だわ。
●完成!
そんなわけで、ウェイト、ブレンドシェイプとも、無事に転写できたので、前回と合わせて、真の意味でのメッシュ数の削減、マテリアル数の削減ができたわけ!
従来のMMDでは、製作上の都合でいろいろわけていてそのままだったり、場合によっては後の取り扱いのことを考えて、材質わけを疑似的にメッシュグループわけみたいに使ったり、とにかくここをいっぱいわけて使うことにほとんど制約が無かったので、キャラクター1モデルで10や20は平気で使ってしまうから、この感覚がちょっと違うんだよね。
(ボーン数とかもとにかく少なく!300とか500とか自慢してる場合じゃないからねw)