はじめに
今回は、Blenderでキャラモデルにウエイトを塗って動かす方法を解説します。
第18回の続きになります。
このような、ウエイトが塗られたキャラが用意されてる状態で進めます。
(体はセンシティブ判定回避用に立方体で隠してます)

また、このモデルはマテリアルで”単色”が塗られた状態になってます。

マテリアルの割り当て方はこちらをご覧ください。
このタイミングで実機に入れる狙い
色を塗るための処理の後に、構造を変えるとすべてやり直しになります。
なので、最低限の見栄えが分かる状態にして実機に入れます。
そして、上手くいかない場所があればこのタイミングで構造を修正します。

これが、このタイミングで実機に入れる狙いです。
VRChat用に最低限動かす設定
VCCでプロジェクト作成
VCCとUnityが入ってる前提で進めます。
無ければ、こちらを見ながら導入。
VCCを立ち上げ。
「Create New Project」を選択。

「Avatars」を選択。
任意の名前と保存先を設定。
Create Projectを選択。

入れるアドオンを設定します。
こだわりが無ければ、そのまま「Open Project」を選択。

これで、VCCでプロジェクト作成が完了です。
アバターモデルの読み込み
VCC経由でUnityが立ち上がります。
私は下図のような画面構成を使ってます。

UIは右上の3つの点 → Add Tabで増やせます。

Projectに.blendファイルをドラッグ&ドロップ。

Projectの3Dモデルを、Hierarchyにドラッグ&ドロップ。

これで、アバターモデルの読み込みが完了です。
面が正しく表示されない場合(面の向き)
読み込んだモデルは、下図のように正しく表示されないことがあります。
面の裏側が見えるのは、面の向きが正しく設定されてないからです。

直すために、Projectの.blendファイルをダブルクリック。

Blenderを立ち上げ。
ビューポートオーバーレイ → 「面の向き」にチェック。
赤くなってるところが裏返った面です。

Ctrl+Tab → 6キーで編集モード。

Lキーのリンク選択などを使い、赤くなった面を選択。
Alt+N → 「反転」で面の向きを反転。

全体が青くなればCtrl+Sで保存。

これで、表示が治ります。

ヒューマノイドボーンの設定
Unityはヒューマノイドというボーンの共通規格があります。
VRChatで動かす場合、ボーンをこの規格に “対応” させる必要があります。

Projectで読み込んだモデルを1回クリック。

Inspectorを確認。
Rig → Animation Typeを「Humanoid」に設定。
Applyを押します。

この状態で「Configure…」を選択。

すると、今のHierarchyの状態を保存するかと聞かれます。
「Save」を選択。

任意の名前を付けて保存。

すると、下図のような画面になります。

Inspectorも、下図のような画面が出てきます。

出てこない方は、複数のInspectorを開いてないか確認してください。
ヒューマノイドの設定が出るInspectorは1つだけです。

ボーン名を確認。
誤認証されてるところがあれば修正します。

修正はHierarchyのボーンをドラッグ&ドロップで出来ます。

Headなどをクリック。
すると、顔のボーンが表示されます。
ここも同じく確認。

Jawは顎です。
前髪が認証された場合は選択 → Deleteキーで削除。
Noneの状態にします。

Hand系も軽く確認。

問題がなさそうであれば「Done」をクリック。

Applyを選択。

これでヒューマノイドボーンの設定が完了です。
自動設定の挙動を見てボーンを変える
先ほどの自動設定で、下記の2つの問題点が分かりました。
・RootボーンがHipsとして認識される
・Jawに前髪が認識される
この2つに対処するため、ProjectからBlenderファイルを開きます。

今回は、顎とRootボーンを削除することにしました。
選択 → Xキーで削除。
Ctrl+Sで保存。

ボーンなどの構造を変えると、高確率で不具合が起こります。
今回は体が消えました。
なので、一度Hierarchyから「モデル」を選択 → Deleteキーで削除。

Projectから読み込みなおします。
これで、ボーンの修正ができます。

もう一度、モデルのInspectorを確認。
ここも初期化されていれば、HumanoidでApply。

Configure…を選択して、設定をやり直します。

Jawは消したので、Noneか前髪が誤認証されます。
誤認証された場合は手動で消してください。

問題がなさそうであれば「Done」をクリック。

Applyを選択。

これで、ヒューマノイドボーンの設定が完了です。
この時点で行った方がよい設定
「最低限必要」から少し離れますが…
アップロードした際に起こる、よくある問題をここで潰します。
Hierarchyで表示されるモノの整理
Hierarchyで読み込んだモデルを開きます。
すると、意図しない形状が入ってる事があります。

この形状は、Blenderでアウトライナーを確認。
そこにある「オプジェクト」に対応してます。

.001のような、意図しないモノが入ってるは、どこかでパーツ分けしたのが原因です。
なので「.001」の名前があるモデル → 「.001」の名前がないモデルの順に選択。
Ctrl+Jで結合します。

最後に、全体にCtrl+A → 「全トランスフォーム」を選択。

オプジェクトプロパティで、名前とトランスフォームの値を確認。
トランスフォームは「位置0,0,0 回転0,0,0 スケール1,1,1」になっていればokです。

Ctrl+Sで保存。
すると、モデルデータが上書きされ、Hierarchyで表示されるモノが変わります。

以上が、Hierarchyで表示されるモノの整理です。
Boundsの設定
Hierarchyから、モデルを展開。
中にあるメッシュ情報を選択。

Inspector → Boundsの「Extent」の値を少しふやします。
そして、白い枠がモデルより少し大きいぐらいに設定。

以上で、Boundsの設定が完了です。
不要な形状の非表示化
Hierarchyから不要なメッシュを選択。

Inspector からチェックのオンオフを切り替え。
すると、メッシュの表情/非表示を切り替えれます。

これで、不要な形状の非表示化が完了です。
光の調整
デフォルト環境の場合、逆光で体の陰影が見づらいです。
そこで、光の向きを変えます。

Hierarchy → 「Directional Light」を選択。
Eキーで回転用のUIを表示。
回転させて光の向きを調整。

これで、正面が明るくなります。

また、デフォルトのDirectional Lightは若干黄色みがかってます。
気になる方は、Inspector → 「Color」の所で白色に修正してください。

以上で、光の調整が完了です。
VRChatにアバターをアップロード
ビューポイントの設定
Hierarchyから、アバターのモデルを選択。

Inspectorを確認。
Add Component → 「vrc」で検索。
VRC Avatar Descriptorを選択。

View → View Positionの「Edit」を選択。

Sceneを確認。
すると、画面にビューポイントが表示されます。

このビューポイントを調整して、目と目の間の顔の中に入れます。

位置が決まれば、Returnで確定。

これで、ビューポイントの設定が完了です。
アバターのアップロード
VRChat SDK → 「Show Control Panel」を選択。

VRChat SDK にログインします。

「Builder」を選択。
赤いエラーが出たものは「Auto Fix」を選択してエラーを取ります。

「Build & Publish for Windows」を選択。

もし、ほかのエラーが出て、アップロードできない方はGoogle翻訳などのアプリり入れてカメラ入力。
エラー文を翻訳して修正してください。

名前を入力。
利用規約に同意にチェック。
「Upload」を選択。

アップロードできましたら、下図のような画面が出てきます。
Okeyを押して確定。

これで、アップロードが完了です。
VRChatで挙動確認
デフォルトマテリアルの場合、光と影の影響を強く受けます。

そこで、確認は環境光が強く陰影差が出にくい「Just 三面図」がおすすめ。

ここでウエイトこのミスなどを確認。

また、間接を曲げた形をみます。
これで、違和感がある所は修正します。

頭で思い描いた挙動と、実際の挙動を観察しながら修正します。
例えば、私は腕は二の腕の影響はなく、90°回るモノと思ってました。
が、VRChatは肘の痩せ対策なのか、二の腕から回ってました。

このような、エラーを修正 → 再アップロードを繰り返して取り去ります。
VRChatに入った際、修正ポイントをまとめておくと作業しやすいです。
【修正リストの例】
・脇、 腕のウエイト入って削げる
・二の腕、分割が少ないのか、角張りが出る
・手、指が綺麗に曲がらない
・手が小さいので治す
…など

Blender画面で見る印象と、VRで入ってみる印象はかなり変わります。
VRで一番いい見え方になるように調整してください。
以上が、VRChatでの挙動確認です。
最低限のPhys Bone設定
Unity上でPhys Boneを動かす
下記のことをやって行きます。
【Phys Boneでやる事】
・Transforms → Root Transformsで親ボーンを設定
・Collision → Radiusでボーンの大きさを決める
・Unity上で動かす
・Forcesで動きの設定を入れる
・動き方を見ながらLimitsを設定
アーマチュアを開き、中にあるボーンから揺れもの設定したいボーンを選択。

Inspectorを確認。
Add Component → 「VRC Phys Bone」を選択。

Root Transformを確認。
ここに揺れモノ親ボーンを読み込ませます。
Hierarchyからドラッグ&ドロップで設定可能。

Collision → Radiusでボーンの大きさを設定。

この大きさはPhys Boneのプレビューに影響を与えます。

Forcesを展開。
Integration Typeを「Advanced」に設定。

画面上部の「再生ボタン」を押します。

Hierarchyからモデル全体を選択。
(変化が分かりやすいよう、体を非表示にしました)

3Dビュー上で移動。
すると、尻尾が動きます。

あとはForcesの「Advanced」にある値を設定調整します。
・Pull = 影響の受けやすさ、どのように元の状態に戻るか(減衰)
・Momentum = 動きのバネっぽさ(弾力性)
・Stiffness = 元の形の保ち具合(剛性)
・Immobile = 動かなさ、元の動きがどれぐらい影響受けないか(不動性)
・Gravity = 重力の影響、下方向への加速度(重力)
・Gravity Falloff = 体などが傾いてない時の重力影響の無効化(回転角度による重力相殺)
※Cを押すとカーブで細かく動きを設定可能。
動きが決まりましたら、Limitsを展開。
Limit Typeを「Angle」などに設定。
Max Angleを任意の値に設定。
これで、ボーンが動きすぎて崩れる対策ができました。

以上が、Unity上でPhys Boneを動かすための最低限の設定です。
あと必要な方は、Stretch & Squish や Grab & Poseなどの細かい設定を行ってください。

Phys Bone設定の詳細はこちらでまとめてます。
他のボーンにPhys Boneを割り当てる
Inspectorの設定をコピーして、ほかのボーンに割り当てます。
VRC Phys Bone横の3つの点 → 「Copy Component」を選択。

Hierarchyから、ほかに割り当てたいボーンの親をを選択。

Transform横の3つの点を選択。
「Paste Component As New」を選択。

すると、先ほどのPhys Boneの値がコピーされて貼り付けられます。
これを、再生ボタンを押しながら調整する流れになります。

以上が、他のボーンにPhys Boneを割り当てる方法です。
再生モードで値を操作した際の注意点
再生ボタンを押しながら、値を調整した場合の注意点があります。

それは… もう一度再生ボタンを押すと設定した値が元に戻る事。

再生ボタンを押してる中で、良い値ができた場合「3つの点」をクリック。
「Copy Component」で値をコピー。

再生ボタンを解除。
これで、値が初期化されます。

再生ボタンが入ってない状態で「3つの点」をクリック。
「Paste Component Values」で値を貼り付けます。

以上が、再生モードで値を操作した際の注意点と対策です。
Unityで触った際の挙動テスト
Phys Boneは触る事ができます。
Unity上で「掴み」は再現できません。
が…「触れる」は再現できます。
この触れるを再現して挙動テストを行います。

Hierarchyの何もない所を右クリック。
3D Object → 「Sphere」などを選択。

Inspectorを確認。
・Mesh Rendererのチェックを解除
・Sphere Colliderのチェックを解除
・Add Component → 「Phys」で検索
・VRC Phys Bone Colliderを選択して追加

Hierarchyで、挙動テストをしたいPhys Boneを選択。

Inspectorを確認。
Collison → Collidersの値を1に設定。
Element 0に「Shpere」をドラッグ&ドロップで割り当て。

この状態で再生モード。

ShpereをPhys Boneにぶつけます。
すると、触った時の挙動を確認できます。

最後は、VRChatに上げて挙動確認してください。
Unityとは少し違った挙動になります。

実機(VRChat)で一番綺麗に見えることが重要です。
これらの方法を使い、調整すればPhys Boneの設定が完了です。
形が崩れた場合の対処法
ボーンや形状の修正を繰り返すと、形が崩れる事があります。
これは、Unity上ボーンなどの位置データと修正した形状が合わなくなったから起こります。

治すには、再度Unityに読み込みなおす必要があります。
一番簡単な方法は「名前を変えたBlenderファイル」を再導入。
一連の流れを辿って再アップロード。


ただ、Blenderファイルが4~5個になると訳が分かりません。
そこで、消して上げなおす方法を紹介します。
消して上げなおす場合…
まず、Phys Boneの設定データを残すために「Prefab化」します。
Hierarchyから読み込んだモデルをProjectにドラッグ&ドロップ。


Prefab化は、Hierarchyの中身を保存する機能です
次に、モデルデータを削除。
すると、参照できる形状データが無くなり、Prefabからモデルが消えます。

ただ、この中にはPhys Boneの設定は残ってます。

そしたら、Blenderファイルを上げなおします。

あとは気が済むまで調整
あとは気が済むまで調整します。
ただ、無限にやってると病んできます。

公的に推奨はできませんが… 衣装のデザイン画を確認。
修正箇所が服と被って無さそうな場所であれば、先に服を作るのもアリです。


モチベーションの問題
以上が、VRChatへのアップロードとモデルの調整です。
まとめ
今回はVRChatで自作モデルを動かすための設定方法を紹介しました。
・UnityはVCC経由で立ち上げる
・VCCを経由すると、アバターアップに必要なSDKが入る
・モデルはUnityのProjectに入れて読み込む
・読み込んだモデルは、ヒューマノイド設定を入れて動くようにする
・アバターはVRC Avatar Descriptorを入れてビューポイントを設定すれば最低限の設定が完了
・揺れ物ボーンを動かしたい場合は、PhysBoneを使う
↓次回↓

また、ほかにも3DCGについて解説してます。
ぜひ、こちらもご覧ください。
コメント