スクリプトによる自動化を推し進め、Sims 4 の人物モデルをなるべく手戻りさせず、今度こそ半日以内で VRM アバターに改造できるようにする。
前回、自動化をだいぶ進めた手順で進めたが、メッシュ分割は愚策だったようで、結局のところ半日かかって収拾がつかなくなり投了した。
再び1つのメッシュでの制作方式に切り戻し、メッシュが癒着してしまうなどの問題は再発して時間はかかったものの、改造は成功した。
Converting a Sims 4 character model into a VRM avatar with as little rework as possible (success)
Push for scripted automation to make the Sims 4 character models as rework-free as possible, so that they can be converted to VRM avatars in half a day or less this time around.
I cut back to a single mesh production method again, and the conversion was successful, although problems such as adhesion of the mesh recurred and took time.
使用ソフトウェア一覧
The Sims 4 にて適当に人物モデルを作成する
Sims4 でキャラクターは新たに作らず、隣人の中からカトリーナ・カリエンテ Katrina Caliente 氏を今回は起用。髪のボーンを埋め込んでみたいため、今回は女性とした。
TS4 SimRipper より DAE 形式でエクスポートする
画面右手で設定を調整できる。以下2つを変更しておく。
- Solid and glass meshes and textures
前回は All separate meshes, one texture だったがメリット無く再び変更した - Clean DAE mesh? (Removes doubles) にチェック
変更した後、DAE形式でエクスポート。
E:\Users\tombi\Pictures\3D\KatrinaCaliente\KatrinaCaliente.dae
Blender へ Collada (.dae) でインポートする
Sims4人物モデルを整理して入れておくための器として、新規コレクションを用意する。
- 新規コレクション「Sims4人物モデル 」を作成
- ファイル - インポート - Collada (.dae)
- Lamp を削除、立方体も削除
- 3Dビューのシェーディングをマテリアルプレビューモード表示に切り替え
- モデルを選択して正面向けて拡大[1][.]
Sims4人物モデルのメッシュを確認しておく
TS4 SimRipper の設定の影響により、メッシュは結合状態で出力された。
メッシュ名:KatrinaCaliente
Sims4人物モデルを Tポーズにする
最終的にTポーズにする必要があるので、最初のうちにやっておく。
自動スクリプトをスクリプト Scripting のテキストエディタにコピペし、引数のメッシュ名を KatrinaCaliente に変更して流す。
GitHub - tombi-aburage/Sims4VRMAvatar : changeAPoseToTPose.py
VRoid Stuidio にてサンプルモデルを VRM形式でエクスポートする
女性のサンプルとして AvatarSmaple_B と A がある。髪長めの B を登用する。
必須入力のタイトルと作者だけ入力して、VRMエクスポートを行う。
E:\Users\tombi\Pictures\3D\KatrinaCaliente\AvatarSmaple_B.vrm
VRM Add-on for Blender にてインポートする
インポートされた VRoid人物モデルのうち、リグ Armature を主に利用するので、それ以外は、ぎょろ目クリックで非表示にしておく。
- リグ Armature の配下にある、身体 Body、顔 Face、髪 Hairのメッシュ
手作業での位置合わせの代わりに、自動スクリプトを実行する
自動スクリプトを外套・スカート・髪のとりあえずの位置調整にも対応するように改良したので、これを流す。
GitHub - tombi-aburage/Sims4VRMAvatar : RelocateVRMBones2Sims4Rigs.py
relocate_init('Armature')
relocate('Armature','rig')
female('Armature','rig')
これから作る人物モデルで不要な Vroid4人物モデルのボーンの変形をオフにする
今回の Sims 4 人物モデルは
- 後ろ髪は長め、前髪は中分け
- 衣服はヒラヒラ要素あり
となっているので、外套 Coat 系のボーンは要らない。上着 Tops 系の一部は使うべきだろう。髪のボーンはどうすればいいか分からないので調べる。
VRoid 側のモデルで確認すると、前髪系の枝番 01、02、03は全て使用しており、最後のボーンはメッシュ外。額の前の前髪はないので枝番02、03のみとする。
後ろ髪は、枝番07/08はリボン立たせ用、枝番04/06はツインテール用なので今回不要。
枝番05のみで良さそうだ。最後のボーンはメッシュ外なので、05は3本目のボーンまで使うことにする。
- Sims4人物モデルが邪魔なので、オブジェクトモードで Sims4人物モデルの最上位アーマチュア rig を[階層を選択]し [g][x][2]で右の方にどいてもらう
- VRoid人物モデルのアーマチュア Armature を選択し、編集モードに変更
- 使わないボーンを選択して、ボーンプロパティの変形チェックをオフにする。
まとめて設定できないらしい。毎回、対象となるボーンは変わりうるので実行の都度修正必要だが数が多いので、あまり使わないものを決め打ちで変形 Deform オフにする自動化スクリプトを後日作成した。GitHub - tombi-aburage/Sims4VRMAvatar : setUnusedBoneDeformFalse.py
setUnusedBoneDeformFalse_init('Armature')
female('Armature') - 指さし確認も兼ねて、オフにしたものは[ポーズ]-[表示/隠す]-[選択物を隠す] またはキーボードショートカット [H] でそのボーンを非表示にする。
※[選択物を再表示]または[ALT]-{H]でいつでも再表示させることができる。
別の方法として、階層表示アウトライナーにて
- Topsで検索した結果ハイライトされたボーンを [Ctrl]クリックして隠す hide
- 同様に Hair、Coat も行う
でもよい。
腰回りのヒラヒラは、前は無いので除外したが横と後ろは残す
髪周りは
何だか、やたら時間がかかったので、ここらで保存する。
髪のボーンの位置を合わせる
- オブジェクトモードで Sims4人物モデルのアーマチュア rig を階層選択し、[g][x][-2]で元の位置に戻ってもらう。
- VRoid人物モデルのアーマチュア Armature を選択し、編集モードに切り替える。横向き[3]にする。
- 3Dビューのシェーディングはソリッドまたはワイヤーフレーム表示とし、オーバレイを表示、透過表示をオンにする。
- 後ろ髪ボーンを選択し、移動[g]させる。ボーンは頭や身体から十分離す。髪メッシュの中に入れる必要もない。三本目のボーンは完全に髪メッシュの外。
- 前髪ボーンも同様とする。
- 腰回りのヒラヒラも同様とする。高さは左右まとめて操作する。
- 乳ボーンも同様とする。
※後日の調査で髪・衣服・乳などの揺れモノは必須ボーンではなく、削除に支障はなかったと判明したが、この当時は削除せず変形オフで対応していた
レンダーモードで全周を確認する
また20分ほど時間がかかったので、ここらで保存する。
メッシュの重複頂点の削除を行う
今回は一括出力したので、メッシュは1つしかない。
- 逐一、オブジェクトモードに戻し、[選択]-[なし]を行ってから、選択し直す
- 編集モードに変更し、[選択]-[すべて]、[メッシュ]-[マージ]-[距離で]
1200個ほどの頂点が削除された。
すべてのボーンを埋め込む
- 安全のため一旦オブジェクトモードに戻し、[選択]-[なし]を実行する
- VRoid人物モデルのアーマチュア Armature を選択し、ポーズモードに切り替える。
- 3Dビューのシェーディングはワイヤーフレーム表示、オーバレイを表示オン、透過表示にする。
- Sims4人物モデルのメッシュを選択する。
- 自動ウェイトでボーンを埋め込む。
- 保存を行う。
首も含めて、どこにも穴が開いておらず上出来
ポーズモードで色々なボーンを動かして動作確認する。
ポーズモードで不要なボーンが表示されているときは邪魔なので非表示にする。
現時点では、以下は想定の範囲内である。
- 髪を大きく動かすと顔面崩壊が発生する(これから治す)
- ヒラヒラを動かすとふとももが少し引っ張られる(そのままとする)
- 目線リグを動かすと顔面崩壊する(これから治す)
また15分ほど時間がかかったので、ここらで保存する。
目線リグを動かすと顔面崩壊するので、眼球の頂点グループを補正する
これは頂点グループ割り当ての問題であり、放置できない。
Sims4人物モデルのメッシュを選択選択し、編集モードで頂点グループに対する頂点たちの割り当てを補正していく。
眼球の頂点グループが差す頂点たちを正しくする
毎回のことなので、自動化してもいいかもしれないが今回もまた手作業で補正する。
Sim4人物モデル由来の左眼球頂点グループ b__L(またはR)_Eye__の内容を、VRoid人物モデル由来の左眼球頂点グループ J_Adj_L(またはR)_FaceEye へ移植する。
- オブジェクトモードに変更し、選択-なし
- Sims4人物モデルの顔面メッシュ Head を選択し、編集モードに変更
- 左眼球の頂点グループ J_Adj_L_FaceEye を頂点グループの一覧から選び、[選択]ボタンを押してみると、右眼球は除外されているが、眼球以外も含まれてしまっていることが分かる
- [削除]ボタンを押す。見た目は変わらないが、これで頂点の割り当てが削除された。
- どこか画面上の空隙をクリックするなどして頂点たちの選択を外す
- Sim4人物モデル由来の左眼球頂点グループ b__L_Eye__を一覧から選び、下のボタン[選択]を押すと、Sims4が左眼の頂点グループと見做していた頂点たちが選択される。
- ここで[g]を押しながら、適当なところに眼球を移動させてみる。
他のメッシュと繋がっていないなら、問題はない。眼球の位置は元に戻す。
もし繋がっていた場合には、眼球の位置を元に戻した後、[メッシュ]-[分割]-[選択]を実行する。見た目は変わらないが、眼球メッシュだけが分離される。 - 左眼球の頂点グループ J_Adj_L_FaceEye を頂点グループの一覧から選び、その下の[割り当て]ボタンを押す。
- どこか画面上の空隙をクリックするなどして頂点たちの選択を外す。
- 左眼球の頂点グループ J_Adj_L_FaceEye を頂点グループの一覧から選び、[選択]ボタンを押す。先ほど割り当てた、眼球を構成する頂点たちがハイライトされる。
- [g]を押しながら、適当なところに眼球を移動させてみる。
他のメッシュと繋がっていないなら、問題はない。眼球の位置は元に戻す。 - 同様に右眼球についても移植を行う。
- 安全のため一旦オブジェクトモードに戻し、[選択]-[なし]を実行する
- VRoid人物モデルのアーマチュア Armature を選択し、ポーズモードに変更し、目線リグを選択して操作[r][r]し、顔面に関しては、目玉しか動かないことを確認する。
髪が一緒に移動するはずだが、これは髪の修正のさいにでも直す - また保存を行う。
いよいよ、顔面の表情モーション(モーフ)に取り掛かる
パラメータを書き換えて、自動スクリプト shapeedit.py を流す。
GitHub - tombi-aburage/Sims4VRMAvatar
とりあえず一発実行命令を流して動作確認
shapeedit_all('KatrinaCaliente', 'rig')
- 眼の閉じ角が不足しており薄目開いてる
- 怒り表情が弱い
- 喜び表情が弱い
シェイプキーを一旦全て削除し、スクリプトのパラメタ値を変更して流す。
ベースというシェイプキーは名前を Basis に変更しておく。
歯がくっついちゃってる事件発生
これは困った。
眼のように簡単にはいかず、治すのに2時間以上かかってしまった。
b__CAS_LowerMouthArea__
下唇が含まれていなかったので含め、上唇と癒着している点があったので頂点をリップして少し間を空けて、頂点グループからその頂点だけを外した。
頂点結合する前に、少し口を開けるなどで回避できるかもしれない、と思ったが、調べてみると実は最初の TS4SimRipper からのインポートの時点ですでに頂点グループがこうなっていたので、Blender 側で力技で直す以外に方法はない。
b__CAS_UpperMouthArea__
上唇との癒着している点があったので頂点をリップして少し間を空けて、頂点グループからその頂点だけを外した。
シェイプキーを一旦全て削除し、スクリプトのパラメタ値を変更して流す。
あらためて表情をテスト
問題は解消されたので保存する。
VRM人物モデルのブレンドシェイプキー を修正する。
Blender の GUI でブレンドシェイプの名称またはプリセットとメッシュ Mesh、シェイプキー Shape の対応関係を明に設定する。
- 階層表示 Outliner にて、アーマチュアを選択
- オブジェクトプロパティ Object Properties タブを選択
すると、
がある。
ここで作成した表情モーションのメッシュやシェイプキーと、ブレンドシェイプキーのプリセット(標準的なモーション名称)を正しく紐づける。
バインドされているメッシュが Face となっているので、今回は KatrinaCaliente に全て変更する。単なる繰り返し処理だったので自動化した。
GitHub - tombi-aburage/Sims4VRMAvatar : editVRMMeta.py
新たな VRM モデルに必須の要素だけを残し、他は全て削除するか非表示にする
選択したものだけエクスポートすることもできるようだが、VRoid 人物モデルが混じっていると動作がおかしいので、関係無いオブジェクトを削除するか非表示にする。
- 新規コレクションで作成した器、カメラ、光源などモデルと直接関係ないものを階層を削除して消去する
-
これまで非表示にしていた VRoid人物モデル由来のメッシュ(身体 Body・顔 Face・髪 Hair の3個)は階層を削除して消去する
- VRoid人物モデルをインポートした時に作成されたフォルダ体系と同等にする
メッシュは今回1個しかないが、アーマチュアの下に移動させるオブジェクトに枝番が付いている場合には名前を変更して枝番を消しておく
- Sims 4 人物モデル由来のリグ rig は非表示とする。
- メッシュのモディファイアプロパティを開いて、何もリグの無いアーマチュアや Sims4由来リグが割当たったアーマチュア(ごみ)があれば削除する
新たな VRM モデルを VRM 形式で出力する
ここらで一旦保存しておき、VRM形式で出力する。
必要なものを表示状態とし、不要なものを非表示とする
- VRoid人物モデルからインポートされたコライダーのコレクション Colliders
- VRoid人物モデルからインポートされた謎の secondary
- VRoid人物モデルからインポートされたアーマチュア Armature
- Sims4人物モデルからインポートされたメッシュ KatrinaCaliente
アーマチュア Armature だけがモディファイアーとして割り付けられている
特にエラーなどは出なかった。
VMagicMirror に読み込んでテストする
詳細設定 - Word to Motion (abc→万歳)から angry を再生したら、ちゃんと怒った。
不具合を修正する
- 風の効果を有効にしていると、髪がその影響を受けて不自然に浮き上がる
- うなずいたり、首を振ったりすると禿げる
髪頂点グループのウェイトを見直し頭上半分はウェイトなしとする
幾つかの髪頂点グループにおいて、頭頂部にウェイトが振られていたので、それをウェイト 0 (青)にペイントした
不具合を修正する
- うなずいたり、首を振ったりすると、禿げはしなくなったが、逆に髪が頭についてこずに浮いた感じとなっている
頭頂点グループを見直し、耳たぶより上はウェイト 1.0 とする
従前の調査では、頭の頂点グループは、目玉を除き、耳たぶより上を含みウェイト 1.0 であるべき。
しかしながら、まずもって頂点グループの範囲が中途半端となっている。
範囲も足りないが、ウェイトについても中途半端となっている。
編集モードで頂点グループを見直す。横向き透過モード、追加選択モードにして、眼玉を含めずに、耳たぶより上を選択して頂点グループに含めるようにした。
好都合なことに、ウェイト 1.00 で埋め尽くされた。
VMagicMirror に読み込んでテスト、全く問題なし。
やっと完成した。
今回の振り返り
良かった点
- Sims4メッシュを一体で出力したので、穴あき事故は発生しなかった。
- さらに自動化を進めたことで、ミスによる手戻りなどの時間は短縮された
- 髪、スカートのボーン(リグ)は、メッシュに埋め込まず、頭や身体から離しておいたので副作用が少なかった。
- Sims4由来のリグを削除する必要はなく、非表示で十分であった。
- 使用しないアーマチュアを削除したり分離したりする必要はなく、変形をオフにすれば十分であった。分離の場合と異なり、コライダーへの副作用もない。
今後の留意点
- 眼球の癒着だけではなく、歯と唇の癒着までもが発生した。
わずかに歯を開けた状態にしてから、重複頂点を削除した方がよさそうだ。 - 眼/頭など、VRoid由来の頂点グループがSims4由来のメッシュに強制マッピングされる際に生じてしまうズレの問題は、相変わらず手修正で対応せねばならなかった。首から上は、基本的に頂点グループはズレていると思っておくべきで、VRM 出力前に直しておく方が手戻りしないが、Blender では問題ないように見えるので忘れがち。
- 眼については Sims4由来の頂点グループの流用で対処した
- 首については今回は対処する必要がなかった。
- 頭から髪部分が除外されていたり、ウェイトが足らなかったりしたので、頂点グループを手作業で直した。そうするとウェイトは 1.0 で振り直された。