-
メタセコイア4でのメッシュ統合に伴うスキニングとブレンドシェイプ
前回、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)
-
メタセコイア4とGIMPを使ったメッシュ/テクスチャ統合
つい数日前にも寄稿したんだけど、またまた。
今回は、メタセコイア4の機能「画像の再配置」を活用したテクスチャ統合を試した。
今回も自分の備忘録も兼ねて。●「テクスチャの統合」の必要性
従来、MMDでは、テクスチャというか…材質数をそんなにシビアに減らす必要性は要求されなかったんだけど、それはあれが、スタンドアロンの映像制作用ソフトだから、なんだよね。
これが、リアルタイムで、いろんな環境で複数のキャラクターを滞りなく動かす、VRや携帯端末用ゲームとかでは、負荷に直結する『マテリアル数』を減らすことがかなりの重要度で必要になってくるらしい。
そうそう、早速わかりにくいことになってるけどここでは『材質数』=『マテリアル数』のこと、ということにしちゃいましょう。以後は『マテリアル数』と統一して呼称するね。
これも前回と同じく、ソフト毎の方言みたいなもんだと思う…で、このマテリアル数とテクスチャの使い方には重要な関係があるんだ。
テクスチャ(ここでは普通に絵が描き込んであるやつのこと、ディフューズマップとかアルベドに相当する奴、ということにしておくね)は、ひとつのマテリアルに対して、1つしか使用できないよね。
テクスチャが2つも3つもあるやつを、ひとつのマテリアル内では使い分けられない筈…(なんか方法があるかもしれんけど)つまり「マテリアルを減らすためには、必然的に、テクスチャの使用数を減らさなくてはいけない」ってことなんだ。
でも、もともと作ってたものを部分的に集めてきて流用する場合にとかでは、どうしてもテクスチャがわかれた状態になってしまってるよね。
なので、テクスチャをうまく統合するためのテクニックが必要になってくるわけだ。●メタセコ4の機能でもできるんじゃね?
正直メタセコ以外のソフトでやってたので、別にそれでもいいんだけども。なんかメタセコにも「画像の再配置」って機能があるので、それでもできるんじゃね?と思ったんだ。
メタセコは長年使ってきたのもあるし、どのみち使ってるんだから、できりだけ他のツールを経由せずにデータを扱ったほうが、簡単だし安全性も高いとも言えるんじゃないかな。
じゃあそろそろやってみようか。
●1.テクスチャを単純に並べてくっつける
こっからは実際にやってみながらの画像で説明していくね。大雑把だけど。
今回の実験台は、VRCやVRMでいつも愛用してる上海Mk3。
これはだいぶ前にMMD用に作った奴を改修してVRC用にしたものだよ。
VRC用改修を行った際に、テクスチャの統合はある程度実施していて、だいぶ減らしたんだけど、それでも現状は4つを使っている。1024pxが3つと、256pxが1つ。まあ、素体、髪、服、瞳…と、後々の組み換えに対して使いまわしができそうな作り分けではあるんだけど、今回は敢えてこれを、1つにしてしまおう。
これらのテクスチャを、まずは単純に、並べてひとつにしちゃう。
1024pxが3つ+小さいのが1つなので、2048pxあれば全部はいってしまう。というわけで、フォトショ上で2048pxの画像を1個用意して、そこにテクスチャを放り込んでしまうわけだけど、事前に忘れちゃいけないのが、UVの分布がわかる、ワイヤーフレームの画像を先に入手し、テクスチャとセットで扱えるようにしておくこと。
そんなわけで、並べてみたよ。
場所はかなり余ってるなあ。
まあそれはあとでね。●2.メタセコ上でUV編集
さてこのようにしてできたものを、いったんpsdで保存して、メタセコに移ろう。
メタセコでは、新しくマテリアルを1つ作成して、上で作成したpsdファイルをテクスチャに指定しよう。
もとのメッシュデータにはまだ、壊したくない情報も含まれてるので、メッシュレイヤー単位で複製したやつを使い、新しいマテリアルを割り当ててみた。まあ当然、こうなるよねw
なのでUVを編集して、あらかじめテクスチャ上で表示しておいたUV展開図にあわせていく。
テクスチャは上記の統合で、従来縦横倍の大きさになってるから、UV座標は逆に縦横半分の大きさに縮めてやらないとあわない筈だ。
UVを選択して拡大縮小の操作ウインドウでUVとも0.5倍を設定して実行。
そいつを移動にして操作ウインドウ上で正確そうな数値で移動させたんだけど、何故かテクスチャに刻んだUV展開図とちょっとずれてるんだよね。(なんで!?)なので、ちょっとずれてるやつなんかは、手で動かしていく。UV展開図と実際のモデルのUV座標が一致するようにするんだ。
そんなこんなで、UVの調整がおわりましたものが、ハイこちら!
まあこれだけでも、2048pxテクスチャ1枚で収まってるんでいいんだけどね。
こっからが今回やりたかったことだよ!●3.見せてもらおうか、再配置の性能とやらを。
ここでフォトショに戻って、UV展開図の表示を消して、pngで保存しよう。
因みにこのpngは、あとでメタセコが勝手に上書きして描き変えてしまうので注意が必要だよ。
あくまでpsdファイルがマスターで、いまpng保存するものはコピーと考えようね。で、メタセコ側は、テクスチャの指定を、新しく保存したpngを使うように指定しなおそう。
※このへんの手順、忘れないでね。あとでやり直しがきかないからね!(僕はハマったで、次に、さっき統合したUVを表示して、モデルのUVの頂点を全選択してから、
UV操作→画像の再配置→記憶
とやるのね。
で、次に自動展開を使う。
今回のセッティングは「再配置のみ」とし、余白は3pxくらいにして、実行!バアン!テクスチャなんか無視してUVが自動配置された!
モデル表面のテクスチャ状態もかなりきついw尚、この時はとりあえずやってみた感じだけど、自動配置時の条件をかえて何度もトライしたり、UVを手で弄ったりしてもいいので、なるべく無駄ない面積を減らしたい、このパーツはきちんと並べておきたい、など、納得いくまでやるといい!
そうして、さっきの
UV操作→画像の再配置→再配置
を実行!テクスチャメタセコ上でテクスチャが書き換わるよ!
で、この状態から、別のマテリアルを選択とかしようとすると、変更したテクスチャを保存するかどうか聞かれるので、OKするよ!
そうするとね!テクスチャで指定してたpngファイルが、メタセコから上書きで描き変えたものに変わってるよ!
●4.GIMPを使ってフォローするよ!
これでできたかと思いきや、1点注意しなければならないことがある。
拡大して見てみると、色が塗られているのは、UV展開図ギリギリのところまで、なんだよね。
こういうのは、全くマズい状態で、下記の記事(2014年なんだけど…)のような問題がおきる可能性が非常に高いよ。
https://ch.nicovideo.jp/sevrunear/blomaga/ar604109
で、記事にあった方法で、出来上がったテクスチャデータをGIMPを使いフォローしてみよう。
GIMPを立ち上げてテクスチャデータを読み込み。
レイヤーを選んでいる状態で、"fayLayer" を実行。これで!GIMPがいい感じに勝手にしてくれてるのだ!
うむ、いい感じにフォローしてくれた!
…もうちょっとかくことがあるんだけど、眠くて眠くてもうだめだああ
ちうわけでここから、翌朝追記ぶん。GIMPのプラグインによって、UVギリギリだったテクスチャの端が引き延ばされた。
これでもう、ギリギリ問題は解消!●無駄な面積を減らすこととは
途中でちょっと触れたけど、使っていない無駄な部分を減らしていくということは、有効に利用できる場所を大きくするということでもあり、テクスチャ自体を小さくしてもディテールを維持しやすいってことなんだ。
こうすることで、マテリアルを減らしだけでなく、テクスチャの画像サイズを小さくできたら、より軽量化にもなるってもんだ。
出来上がったテクスチャを1024pxに縮小してこの通りだよ。
ちょっと思ったよりパーツが小さくなってしまった。だけど顔とかはアップになるので、大きくしておいたよ!
-
VRC用にブレンドシェイプの名前と順番を編集
さて、相当に久々の更新。
今回は、FBXデータ内の、ブレンドシェイプの名前と順番について。
自分の備忘録も兼ねて。●VRC用
最近は、専らVRC用のアバターを作って遊んでいるのだけども。
VRC用アバターは、基本的に頂点モーフであるブレンドシェイプを使い、リップシンク、自動まばたき、その他の表情を使うことができるんだけどね。で、その作り方はというと、MMDの頂点モーフとまずかわらない。
僕はメタセコイア4を主に使っているので、メタセコイア4上でモーフとして普通に作成して、それをFBXフォーマットに書き出し、Unityに持ち込んで設定する。このとき、メタセコイアは「モーフ」と呼ぶけど、Unityは「BlendShape」と呼ぶ。
モーフと呼ぶかブレンドシェイプと呼ぶかは、この際、単にソフトウエアの中の呼び方、つまり方言に過ぎない、と考えちゃおう。
ややこしくなるので、以降は「ブレンドシェイプ」と名称を統一するよ。●VRCが決めているルール
VRC側はアバターのデータの中にある『決められた順序・名称』のブレンドシェイプを自動制御する。これが違っていると、全く制御できないんだな。
MMDでも、モーフはモーションデータ中で名称で一致するものに自動割り当てされるようにできてるので、それと同じように考えればいいかもしれない。
ただし更に厳しいのは、順番も守らないといけないってこと。これは、VRCで使う基本的なブレンドシェイプを示すショット。
自作アバター(偽リーチャ隊長)の奴なんだけど、基本的なもののみしか作っていない。
「最低限必要なもの」くらいに思ってもらえればいいかなと。上の4つは、自動まばたきと自動視線コントロールに使われるもので、そのほかは全てリップシンクに使う。
リップシンクは、実は名前も順番も、あとでVRCSDKで設定するときに、割り当てを手動でやるから、別に変わってても問題は無いんだけどね。
だけど、上の4つだけは、絶対にこの順序でないといけない。
※実際にどんな表情なのかは、いろんな方が記録されているTipsか、VRCSDKに含まれているチュートリアルアバターでも確認できるよ。
●名前と順番、これが意外とクセモノこれらを踏まえて、実際にアバターを製作していくわけだけど、なんらかの理由で「ブレンドシェイプの順序が意図したものにできない」とか、「名前が勝手に変わってしまう」なんてことが発生する。
具体的には
・FBXに出せたんだけど、順番が違ってたとか、
・文字化けとか別の名前に置き換えられてしまい、どれがどれだかわかんない!ソフトの仕様によるものなんだけど、これが意外とダメなんだ。
例えばMayaでは、ブレンドシェイプ名称に日本語を扱うことができないし、FBXエクスポート時に名称が<大分類_小分類>みたいな命名法則になって出てくる。
例えばSoftImageでは、ブレンドシェイプの順序をコントロールすることができない。FBXファイルを扱えるソフトでも、内部ではデータの持ち方を変えてしまうから、うまくコントロールができず、「PMDEに比べて融通が利かないなあ」って思う。
●Unityで編集してしまうという手段
そんなこんなで困っていたところ、Unity上でブレンドシェイプを編集することができるツールが、UnityJapanから出ていることがわかった。
それがこの『BlendShapeBuilder』だ。https://github.com/unity3d-jp/BlendShapeBuilder
だけどこれだけでは、ブレンドシェイプ自体を作成・編集することはできても、名称と順序を自在にコントロールすることはできないわけで…
そこで嘆いていたところ、Furiaさんがばっちり素晴らしいツールを用意してくれた!やったね!これらのおかげで、ようやくFBX内のブレンドシェイプの名称と順序を任意にコントロールすることが可能になった!
●では、その効能を実際に見てみよう!(ここだけ政宗一成のナレーションで脳内再生)
今回はコンセプトとして「FBXファイルを読み込んで、編集して、FBXファイルを書き出す」という、あたかもPMDEみたいな使い方をやってみることにするよ。
そのために、Unityは2018を使い、無料アセットの「FBXexporter」をあとで使いFBXファイルを書き出すことにする…けど、それはここでは割愛しようかな。
まあそのへんは各自の判断でご自由に。
1.まずはUnityに、上記で紹介したツールを入れよう。
BlendShapeBuilderのほうは、入れ方がGitのサイトに入ってる。
Furiaさんのツールのほうは、スクリプトデータ単体なので、これどうやって入れたかな?ちょっと忘れたけど、たぶんスクリプトエディタ立ち上げてコピペしたとおもう。。。2.Unityの準備が整ったら、FBXデータを入れて、ヒエラルキーにドラッグ。
そんで、ブレンドシェイプを入れてあるメッシュを選択。3.その状態で「Window」→「Blend Shape Inspector」
4.そうすると、編集用ウインドウが立ち上がるので、ブレンドシェイプの名前を弄れたり、順番を弄れたりできるぞ!
名前を変えたら「Update」で反映される。
順番を変えたら「Extract」で反映される。●まあかんたん!
というわけで、できたよ!
やったね!
例えばこれでヒエラルキーにあるモデルを、Export to FBXしてしまえば、編集済みのFBXデータを得ることができるわけですよ。
広告
1 / 5