見出し画像

もう悩まない!(かもしれない)Unity/VRChat向けのHumanoid Rig/Bone/ボーン/骨の設定

【追記(2022年5月28日)】もはやこの記事が意味を成さなくなるかもしれないのですが、大事なことなので追記です!

DrBlackRatさんのCannyの文章を翻訳してみました。
アバターの背骨ボーンのカーブが矯正されて胸が凹んで猫背になったりするのを解決してほしいという内容。詳細は画像にて。

画像81
画像82

VRChatの対応はCannyの投票数で優先度が決まるので、この問題を何とかしてほしい人はぜひ投票してみて下さい👍

投票先のリンクはこちら↓
https://feedback.vrchat.com/vrchat-ik-20/p/chest-bone-gets-moved-back-when-its-not-directly-above-spine-tilted-a-bit

【Cannyに投票するには】
①Cannyのサイトへのログインは、VRC公式サイトにログインしているとできます。

画像83

②ユーザーIDやサムネイルなど全て問題無ければ「Yes!」

画像84

③投票自体はタイトル横の数字を押せば完了です。

画像85

これが解決されれば、正直この記事で取り上げている「ボーンを真っ直ぐに入れる」という方法は必要無くなります。
ただ、現時点でも多くのアバターの背骨ボーンは身体のカーブに沿うように入れられているものが多く、
これら全てのアバターのボーンを真っ直ぐにするというのは現実的ではないと思うので、ユーザーがVRCに合わせるのではなく、
VRCがユーザーに合わせてくれる方向で解決されれば良いなと思いました。
【追記ココマデ】

【追記(2022年3月1日)】この記事のボーン配置については
Lower BodyのAuto-FootStep(足踏みIK)を"オフ"にしていることが前提条件となっていたことに気づきました。
「そういえばそんな機能あったな…自分は足が勝手に動くのがどうにも気になって切ってた…」って感じでした。すみません。

画像77

「私はAuto-FootStep(足踏みIK)を"オン"にして、

画像78

 HumanoidRigの設定でToeまでMappingするぜ!」

画像79

…みたいな場合のボーン配置については以下の動画とVRCの公式ドキュメントの「Toe Bones」をご覧頂くと何かわかるかもしれません。分からないかもしれません。

動画:
【VRChat】3点やデスクトップモードで首がカクッとなる現象の検証8パターン個人的まとめ

【追記ココマデ】

すんごい長くなっちゃったんで、もう資料用に用意した簡易モデル(Blender用)だけ欲しいんだぜ!って人はこちらで公開しているので、ダウンロードしてください。CC0です。
【追記(2023年7月10日)】Unity用に出力する想定でローカル軸を設定し直し、hibit氏の記事を参考にボーン名を変更しました。


まえがき(すんごい長い)

VRChat向けのアバターのボーン構造について、これまで自分はなんとなく知ってるつもりだったんですが、三週間ほど前にフルトラ(フルボディトラッキング)になって「私はこれまで本当に何も分かっていなかった…」と膝から崩れ落ちるような体験をしました。

自作アバターの首が軒並み伸びる。しかもローカルの現象だから、アバターを着ている本人にしか認知できない。

この現象、知らないわけじゃなかった。何なら一時期話題になって心配になってフルトラの人に確認したこともあった。
でもその時みんな「若干首伸びるけど、許容範囲だよ」って優しく言ってくれた。
本当に心優しいフレンド達、みんな、本当にありがとう。

そしてごめん。

それ、全然私の許容範囲じゃなかった。

フルトラになって初めて分かった。ごめん、全然許容範囲じゃなかった。
そもそも私が公開してる身長2mの太田黒、デカいから常に人を見下ろすだろうなって思って首をちょっと前に傾けたんよ。それがまさか首が起き上がる原因になるなんて。ローカルの現象とは言え本当にすみませんでした…。

ずっと「首が若干伸びる」の意味を深く考えずにそのまま放置していた。
これはもう私の慢心だ。ヒントはいたる所にあったのに、追求してこなかったことが情けなくて、これまで啓蒙してくれていた方々の声にも気付けなかったことが悔しくて堪らない。
だから忘れないためにここに書いておく。
フレンドから教わったこと、自分で調べて知ったことを。

という訳で、「ボーン構造はこの設定さえおさえておけばUnity及びVRChatで大体問題無く動く"はず"」ということを諸々纏めておきます。
私、「ボーンの配置で困った人の助けになれば良いな…」なんてそんなこと思えるほど善人じゃなくて、ボーンを一から組み直した時に未来の私がまた分からなくなって絶対資料を遡るとこからスタートすると思うから、もうそれを今回で終わりにしたいんだよね。
少なくともこれをしておくとフルトラ(フルボディトラッキング)になった際に足が変な方向に曲がるとか腰がひっくり返るとかローカルで首が伸びる現象はなくなる"はず"。多分、きっと。
【追記:2021/12/03】
VRCのアップデートでまたIKがそっと変わったようで、キャリブレーション後にUser Real heightの数字を下げると以前にも増して首が伸びるようになりました。(◜௰◝)【追記ここまで】


そもそもUnityやBlenderのことがある程度分かっている人は以下の参考記事だけでも十分だと思うのですよ。
参考記事:Metasequoia 4.3の新機能(3) ボーン - Unity向けテンプレート

それでも読んでみようと思われた方は暇つぶしにでも読んでもらえたら嬉しいです。
まずは用語解説的なものからレッツゴー。

※もしも記述に間違いがあった場合はご指摘頂けると大変ありがたいです🙏


【用語】Bone/ボーン/骨

モデルを動かすための骨の役割を持った構造のこと。
細かく言うと「ボーン」と「ジョイント」を合わせてスケルトンとも呼ぶらしいのだが、普段私ははまとめて「ボーン」と呼んでいるので記事内でもボーンと呼ぶ。
この記事ではジョイントのことはBlenderの用語で「ヘッド」と「テール」と呼ぶことにする。

画像1


【用語】Humanoid Rig(ヒューマノイド・リグ)

誤解を恐れずにザックリ和訳すると、Humanoid(人型の)Rig(装置・仕組み)。
ボーンそれぞれに「頭・首・肩…」と人に必要な骨の役割を設定したもの。
ボーンと混同されることがあるが別物。
あくまでも「ボーンを動かすための仕組み」のこと。

【用語】各ボーンに付ける名称

モデリングツールでボーンに名前を割り当てる際の名称は、自分一人で完結する場合には自分一人が分かれば何でも良いのかもしれない。

が、VRC向けのアバターでなるべく汎用性のあるものにしたい場合はUnityのHumanoid Rigの設定に沿ったものが良いと思われる。
自分の数少ない経験のうち、データの名前に日本語を使ったことが原因でエラーを吐かれたことが2度あったので、なんとなく嫌な予感がするというそれだけの理由で個人的に使う文字は英数字のみになるようにしている。(例:Upper Leg_L)
【追記(2023年7月11日)】hibit氏の「ボーン名の左右の表記揺れについての現状分析と目安となる指針について」という記事を参考に、配布モデルのボーン名称を変更しました。


Unityで人間と同じような骨格を持つキャラクターとしてモデルを動かすために最低限必要なボーンは以下の12種類。

Head(頭)
Neck(首)
Chest(胸)
Spine(腰)
Hips(尻)
Shoulder(肩)
Upper Arm(上腕)
Lower Arm(前腕)
Hand(手)
Upper Leg(太もも)
Lower Leg(ふくらはぎ)
Foot(足)

その他(目・指・つま先等)のボーンについての詳細は
Unityの「アバターの Mapping タブ」や
バーチャルキャストの「Unity Humanoid Avatarの解説」を見た方がきっと分かりやすい。

【用語】FK

Forward Kinematics(順運動学)。
ボーンの関節を一個一個曲げることでモデルにポーズさせること。

【用語】IK

Inverse Kinematics(逆運動学)。
ボーンの関節をグループごとに動かすことでモデルにポーズさせること。
例:手の関節を動かした際に残りの上腕と前腕も手の動きに追従する。

【用語】XYZ軸

高さ・横幅・奥行きを表す座標の軸のこと。グローバルとローカルがある。
UnityとBlenderではグローバル座標軸が異なる。


・グローバル座標軸

画像20

Blenderのグローバル座標軸はZup(+Zが上方向)/右手座標なので、
キャラクターを"真正面"から見た場合
X:横幅(+Xが右)、Y:奥行き(+Yが奥)、Z:高さ(+Zが上)

画像6


Unityのグローバル座標軸はYup(+Yが上方向)/左手座標なので、
キャラクターを"真正面"から見た場合
X:横幅(-Xが右)、Y:高さ(+Yが上)、Z:奥行き(-Zが奥)

画像6

Blenderの座標に慣れていると、向かって右側や奥がマイナスの値になることに違和感があるかもしれない。
ただ、Unityではデフォルトのカメラ位置がキャラクターの背面にあり、カメラ視点、つまりゲームの画面構成でよくあるキャラクター(プレイヤー)を"背面"から見た場合には

X:横幅(+Xが右)、Y:高さ(+Yが上)、Z:奥行き(+Zが奥=キャラクターから見た進行方向)
となる。

画像5

何故右手型と左手型の座標が存在するのかとか、そういう話はここでは割愛。


・ローカル座標軸
グローバル座標軸は空間の天と地を定める絶対的な基準だが、オブジェクトごとにも個々にXYZ軸は存在する。
この記事ではボーンのローカル座標軸の、主に関節の曲げ伸ばし・ひねり・開閉に関わる回転軸について触れていく。

画像48


【小話】VRCでアバターの首が伸びる現象について(追記アリ)


・パターンA:
背伸びやジャンプの時のみ首が伸びる→キャリブレーションした後身長を下げる。(または、実際の身長より高めにUser Real Heightを設定してからキャリブレーションし、キャリブレーション後に身長を戻す)

画像21

・パターンB
Aをやっていても、SpaceDragで浮いた時に首が起き上がって伸びる→Head/Neck/Chest/Shoulderのボーンの軸が真上・真横から見て一本線になるよう揃える。→だったけど、アプデでまた変わった(下に追記アリ)

画像22

三週間ほど前に遂にフルトラ(フルボディトラッキング)になり、自作アバターを着てみたところ、首がことごとく伸びるのが気になり、フレンドさんから助言頂いたのがこの記事を書いたきっかけでした。
以降からは詳しくボーン全体の構造について書いていきます。

【追記2021/12/03:アプデでまた変わった】
どうもこの記事を公開した数時間後のVRCのアップデートで、IKの動きが若干変わったっぽいです。

VRC君っていっつもそう!IKを更新しても何も言ってくれないよね!😭
少なくともSpaceDragで浮いた時に首が伸びなくなっていました。
でもジャンプみたいな上下運動した時にみょんみょん伸びるのは変わらなくて、

そうならないようにキャリブレーション後にUser Real Heightの数字を下げるっていう↑のやり方だと前にも増してめっちゃ首が伸びる…!!詰んだ!!!!!!

※もしかしたらHaritoraX特有の症状の可能性もあるので開発者様にご報告しました。


ボーンに関しては次項からのやり方で何か大きく問題が起きることはない"はず"なので、キャリブレーションの方法を探そうと思います。何か「原因これや!!」ということが分かればここの項目だけ別記事に移動させて纏めます。
因みにUser Real Heightの適正値はアバターの腕と足の長さの比率、そして好みによるものらしいです。(『Real』とは?)【追記ここまで】


【Blender】準備

この記事ではBlenderの単位の設定を以下のようにしておく。

画像3

 単位系:メートル法
 単位の倍率:0.01
 単位を区切る:チェック入れない
(別に入れても良い)(ここは好きにしたら良い)
 回転:度
 長さ:Centimeters


【Blender】ボーンの配置(編集モード)

Unityのグローバル座標軸に関する記憶を一旦忘れて、Blenderのグローバル座標軸のことを念頭に置いて値を設定していく。

Blenderのグローバル座標はZup(+Zの軸が上方向)/右手座標なので、
キャラクターを"真正面"から見た場合
X:横幅(+Xが右)、Y:奥行き(+Yが奥)、Z:高さ(+Zが上)


①頭〜尻〜脚・肩(Head/Neck/Chest/Spine/Hips/UpperLeg/LowerLeg/Shoulder)のボーンのYの値を0cmに揃える(編集モード)

画像15
画像9
画像9

頭・首・胸・背骨・お尻(Head/Neck/Chest/Spine/Hips)のボーンのXの値を0cmに揃える。(編集モード)

画像15
画像11

※画像は見やすいように他のボーンを非表示にしています

③脚(太もも・ふくらはぎ)・足のX(UpperLeg/LowerLeg/Foot/Toe)のXの値を左右ごとに揃える。(編集モード)

画像14
画像11
画像12


④肩・腕・手(Shoulder/UpperArm/LowerArm/Handのヘッド)のボーンのZの値を揃える。(編集モード)

画像16
画像17
画像18


⑤お尻(Hips)のヘッドを太もも(UpperLeg)のヘッドよりちょっと高くする

画像44
画像44

上図のNGパターンだと、Hips・Upper Leg.R・Upper Leg.Lのヘッドの高さが揃っており、このままだとフルトラになった時にアバターがグシャッとなってしまうとか何故か右肩が脱臼する
Hipsボーンのヘッドの高さは、Upper Legよりほんの少し高くする。
Hips・Upper Leg.R・Upper Leg.Lのヘッドを結んだ際に三角形になれば良い。

Hipsのヘッドの位置を高くし過ぎて、Spineのヘッドと距離が近くなると、「SpineがHipsに近すぎる」という判定になってこれもまた不具合の原因となるらしいので、あまりオススメしない。

画像46

※実際にSpineに近付いているのはHipsの方だが、それが理解できるのはメッシュの形状から人間の目で見て判断できるからであって、Unity君はそんな風に計算してくれない。彼は粛々とボーンの位置だけで判断を下す。


⑥肘と膝の関節をちょっとだけ曲げる(編集モード)

画像19

・肘

画像24


・膝

画像25

※画像は見やすいように他のボーンを非表示にしています

【Blender】ボーンのローカル回転軸の設定

どこの軸を基準にしてボーンを回転させるか」が決まっていないと、屈伸運動をさせた際に腕や足があらぬ方向に曲がってしまう。
そのため基準となるローカル回転軸を設定する。
Y軸は必然的にひねりの回転になるので、X軸かZ軸が使える。
ここで配布した簡易モデルはX軸を基準としており、それぞれの回転軸の役割は以下のようになっている。
 Y軸:ひねり(ボーンのヘッドからテールに向かって+Y)
 X軸:屈伸(+の回転で縮む、-の値で伸ばす動き)
 Z軸:開閉

画像64



つまり、ポーズモードでトランスフォームの座標系を「ローカル」にして、
トランスフォームピボットポイントを「それぞれの原点」にして、
ボーンを選択してR(回転)X(軸)90(度)って打った時に縮こまってほしい関節が縮こまる角度になってくれたらOK。

画像7

ならなかったらロールの再計算を行う。
参考記事:ボーンのローカル回転軸設定

もしくは編集モードで手動で回転させる。

画像34
画像35
画像37
画像37
画像38

因みに、UnityではHumanoid Rigの設定をしたボーンのローカル回転軸はスルーされる。何故ならそれらのボーンはリグで曲げ伸ばしの設定を行うからだ。

参考記事:VRM はローカル軸の方向を破棄すべきでない

ただ、スルーされても情報は保持しているので、他のツールで使うこと等も想定して軸の設定はしておいた方が良いだろう。


【Blender】FBX出力(エクスポート)する

さて、Blenderの作業が終わったら、Unityにモデルを持ち込むためにFBXデータとして出力しなくてはいけない。
が、ここで思い出してほしい。BlenderとUnityでは座標軸が異なるということを。

画像49

このままエクスポートすると、何が起きるかと言うと、ズレてる座標軸を合わせようとして、Y軸が上向きになるようにX軸が-90°回転した状態になっちゃうんだ…。

画像50

※Unity上では90って数字を打ったら大体89.98って数字になるけどこれは「そういうもの」らしいのでスルーしよう。そういうものなんだ。

この90°回転の何が問題になるかというと、Unity上で着替えをするために何かしらのツールを使った時に、アバターと衣装で軸が合わなくておかしなことになったりする。他にも何か特別イヤだな…と思う不具合があった気がするけど思い出せない。思い出したら追記します。

あと、スケール適用を「すべてFBX」にしないとUnityでは100倍ってことになるよ。

画像65

コレに関してはDynamicBonesコライダーとかアウトラインとか、あらゆるものの数値が0.001倍になってしまうのでちょっと大変。

【追記2022/05/15:「Asset Creation Toolset」というAddonを使う】
BlenderからUnityに持って行った時に起こるArmatureのScale100倍問題と回転-90度問題が一発で解決する(それだけじゃない)最強のAddonを教えて頂きました!

Asset Creation Toolset

画像80

もうこのAddon使えばイイよ!!
※ダウンロードできる場所はGithubGumroadがあります。

使い方はしーわんさんの記事これができる人は信頼できる!がとても分かりやすいです。

「Addon?そんなもん使わねーよ!」
「Addonを使う前にある程度自分でも仕組みを理解しておきたい」

という方は以下の方法をお試し下さい。【追記ここまで】

【FBX出力するための準備】
90°回転しないようにする方法の前に、まずFBX出力の準備として
・自動スムーズにチェックを入れる
・角度を180°にしておく

画像51

【追記2021/12/17:トランスフォームの座標系とピボットポイント】
・トランスフォームの座標系:グローバル
・トランスフォームのピボットポイント:バウンディングボックスの中心

画像70

例えばトランスフォームのピボットポイントが「それぞれの原点」だったりすると、この後の回転の工程でメッシュの回転とボーンの回転にズレが生じる↓

画像71

そのままFBX出力すると、ボーンの回転は0°でも、メッシュの回転が90°になってしまう↓

画像72

なので次の工程に移る前に、必ず座標系とピボットポイントの設定を確認しておこう(さっきやらかした)【追記ここまで】


【出力までの流れ】
①ボーンとメッシュ(ボーンが無い場合はメッシュのみ)を選択し、X軸を”-90°”回転(オブジェクトモード)

画像52


②Ctrl+A「回転」または「全トランスフォーム」の適用(オブジェクトモード)
※X軸の回転が適用されて0°になる。

画像53


③X軸を”90°”回転し、

画像65

以下の設定で、オブジェクトが90°回転したまま出力する。
▼内容

 Limit to
 ☑選択したオブジェクト
 オブジェクトタイプ
 ☑アーマチュア
 ☑メッシュ

▼トランスフォーム
 スケール:1倍
 スケール適用:すべてFBX
 前方:-Zが前方
 上:Yが上
 ☑単位を適用
 (『トランスフォームを適用』にはチェックを入れない

▼ジオメトリ
 スムージング:辺

▼アーマチュア
 □リーフボーンを追加 (チェックを外す

画像66


追記:すみません!!!!ココ、Twitterに載せてた時からずっと「チェック入れる」になってました!!!
チェックが入ってると末端のボーンに_endというボーンが新たに追加されてしまいボーン数が増えます。何か特別な理由でも無い限り『チェックを外す』で大丈夫です。
※UnityのHumanoid Rigの設定の時にSceneでボーンが視認できなくなるけど特に問題は無い(はず)

※例えばUnity上ではボーンのテールが反映されないので、リーフボーンが無いとDynamic Boneが意図しない挙動になることがある。
Humanoid Rigとしてマッピングされていないボーンの末端には、ボーンのテール位置を確定するためのウェイト無しのボーンを追加しておくと良い。
(これがリーフボーンの役割)

↓リーフボーン無しの意図していないDynamic Boneの入り方(靴紐のボーンがメッシュと合わず中央になる/画像は片側だけだがもう片方も全く同じ位置にくる)End Length:1

画像70

↓リーフボーン有りの意図したDynamic Boneの入り方(靴紐のボーンがメッシュに合っている)End Length:1

画像69



-----
この出力設定はオペレータープリセットに名前を付けて保存していつでも呼び出せるようにしておこう。

画像56


さて、出力したFBXをUnityで開いてみると、

画像60

回転してない!スケールも1倍だ!やったーーー!

参考記事:【Unity】【Blender】【手順編】BlenderでFBXをエクスポートしてUnityに取り込む(スケールと回転の問題を解消)


【Unity】Humanoid Rigの設定をする

ようやくUnityでHumanoidRigを設定する時がやってきたね。
もう書き疲れてだんだん口調も保てなくなってきたよ。
さっさかやっていこう。

今回のモデルは異世界転生OLの牧場OLさんです。
よろしくお願いします。
牧場OL「ヨ~レイヒ~♪」

①Unityに入れたFBXをクリック
②InspectorのRigって項目にある「Configure...」をクリック

画像60


するとこんな画面が出てくるよ(私は画面構成をデフォルトから変更していますが機能的な違いはありません)

画像61

マッピングの方法は割愛。
ここはもう単純にBlenderで設定したボーンがちゃんと項目に入っていたらOK。
ただ以下の3つだけは気をつける。

画像67

・Upper Chest:None
 (入ってるとVRCにアップロードできない)
→【追記:2021/12/12】そんなことはなかった。今のVRCではそのままアップロードできる。
ただ、VRCの公式ガイドRig Requirementsでは下の図のように「Upper ChestがマッピングされているとIKの問題を引き起こすから胸の上部(Upper Chest)は空白にしておいてね」という感じの注意書きがあるから、そうした方が良いんじゃないかなって思うんだ。UpperChestを埋めてしまうと今のVRCのIKではフルトラ時に不具合が起きるようなんだ。IKがガッツリ変更されたらこれも変わるんだろうけど…!(2021年12月時点)
例えばChestとUpperChestのボーンがある場合は、UpperChestのボーンをChestとしてマッピングして、UpperChestの箇所は空白にしておくんだ。(その場合マッピングされなかったChestはSpineの一部みたいな感じで動くぞい)【追記ココマデ】

画像67

・Toe:None
 (つま先立ちが気になる場合は入れない)
・Jaw:None
 (入ってると口が開きっぱなしになるっぽい)
Jawって齶のボーン、一回やってみたらずっと口ポカンって開けてたんですけど最近のVRCだとどうなるかは知らないです。

マッピングに関してはUnityの「アバターの Mapping タブ」や
バーチャルキャストの「Unity Humanoid Avatarの解説」を見た方がきっと分かりやすい。(二回目)

③「Character is not T pose(キャラクターがTポーズじゃないんだけど)」と警告が出ていたらPose▼の「Reset」を選択

画像63

Pose▼の「EnforceTpose」を選択(これで警告が消えればOK)

画像64

※注意※
「EnforceTpose」ではあくまでもUnity上で動くためのTポーズに修正するだけなので、VRC向けのボーンの角度にいい感じに修正してくれる、なんてことは起きないんだ

アバターのボーン(特に足)が真っ直ぐでなく問題が起きている場合、このマッピング上でRotationの値を変更してやることである程度問題が解決したりもするよ。
スクロールバーを下ろすと隠れていたTransformの項目が出てくるよ。

画像66

でもそのやり方だと、何らかの理由でポーズのRecetをかけた時や、再度FBXを読み込んだ時にRotationのデータが残らないから、結局作業全部やり直すことになるんだ…。
以前やり方をまとめたことがあったんですけど、そういう理由があるので今はオススメしないです。記事も非公開に致しました。
ブックマークして下さった方、もしいらっしゃったら申し訳ないです。

結局モデリングソフトの時点でボーンの配置を変えておくか、
アバター専用のモーションを作って適用させてあげるのが一番なのかもしれません。

⑤あとは諸々設定してVRCアップロードするだけだよ!

という訳でボーンに関する作業のお話は以上です。

ここから先は「小話」として「なぜ?」という部分について書いていきます。あとちょっと。


【小話】ボーンを真っ直ぐにしたら実際の人間の骨の形と全然違うけど大丈夫なの?


はい、大丈夫でした。
私も最初は「え? 本当に全部真っ直ぐにして良いの?」と思ったんですが、実際の骨の形に合わせるとトラッキング時におかしなことになるらしく、これはトラッカーによるフルボディトラッキングでも、スーツによるモーションキャプチャーを使うような場合でも違いは無いようです。

【ここから追記2021/12/02】という話を聞いたんですが、別の方からのお話で分かったのが、モーキャプに関しては会社文化や環境によって様々なので全部コレが当てはまるとは言えないそうです。思えば使うツールごとに仕様が違ったり、会社によっては独自のリグの組み方とかがありますもんね。【追記おわり】

画像67

そもそも、24~55本のボーンでどうにか実際の人間が持つ200本以上の複雑な骨の動きを再現しようというのは無理がある。
本場のカレーをレトルトカレーで何とか再現しようというくらい無理がある。(最近のレトルトもすごいんですけども)
自分は「たった2~3本背骨に沿わせた程度で再現できるはずもないか…」と割り切ることでボーンを真っ直ぐ入れることに抵抗はなくなりました。(個人的な感想)
あと、ウェイトによりますが動きも案外気にならなかったです。(個人的な感想)
【ここから追記2022/01/28】
アバターの動きに違和感が生じる場合もあるので、それについての追記です。
ここで言う「違和感」というのは、
「実際にVRモード(特にフルトラ)でアバターを着た人の着心地に対する違和感」ということであって、
「制作者が意図したキャラクターの挙動でないために違和感がある」ということとは若干違います。
まずは下図参照。ちょっとわかりにくいですが。

画像76

A:ボーンに沿うように胸~腰周りが真っ直ぐのアバター
B:ボーンに対して胸~腰周りが前に突き出ているアバター

※AとBはどちらも同じボーン

アバターを着た時の違和感というのは、
・身体のパーツの比率の違い
・着た人間の普段の姿勢とアバターのデフォルトの姿勢の違い

この2つが原因であることがほとんどだと思います。
この記事では姿勢に関する違和感について述べていきます。
普段の姿勢がA・Bのアバターのどちらに近いかで、アバターを着た時の違和感の印象も異なります。

A・BそれぞれのアバターをVRCで着た時、
A:Bのアバターに違和感の無い人は「Bに比べて若干姿勢が悪い/猫背に感じる」という違和感が生じる
B:Aのアバターに違和感の無い人は「Aに比べて胸~腰が常に前に反っている」という違和感が生じる

私は普段の姿勢がどちらかと言えばAのアバターの方が近いので、Aに比べてBの方が胸~腰周りの違和感があります。あと、Bは反り腰気味なので、どうしてもお尻が出てるように感じてしまいました。(AもBもお尻の位置は同じ)

ボーンを真っ直ぐにして何かしらの不具合が解消されたとしても、アバターを着る人の姿勢との相性はどうにもならなかったりしますね…。
しかもこの違和感がある時というのはほとんどの場合VRモードでなおかつフルトラの時だけで、3点トラッキングでのVモードやデスクトップモードでは気付けない・気にならない点だったりします。
着心地の違和感は千差万別なので、結局制作者側は「キャラクターとして意図した姿勢になればOK!」くらいの気持ちで良いのかもしれません。
【追記おわり】

【ここから追記2023/04/03】
牛山正博氏が背骨を真っ直ぐ入れた時のメリットを紹介している動画を投稿して下さっていたので、久々に追記しに参りました。

「Spine Joint : CGキャラクターセットアップ : 胴体のジョイント」

3つのボーンの入れ方、それぞれの特徴がとてもわかりやすいです。恐らくですが補助ボーン無しの動きかと思われます。
これらが人体の動きに近いかどうかはさて置き、私が注目したいのはそれぞれのボーン構造でメッシュが崩れる(伸び縮みする)かどうかです。
IKにもよりますが、この動画内で上半身のメッシュが最も崩れにくいのは、身体の中心に真っ直ぐにボーンを入れ肋骨を全てChest一本のみで制御している、向かって右のモデルでした。
胸のトラッキングを使用するなら中央(肋骨がChestで乳頭の高さくらいがChest2)の方法が良さそうですね。

牛山氏は、他にも「ポリゴンモデルの関節の分割線 [肘と膝や指など一方方向に曲がる関節の分割方法]」という動画も投稿されていて、こちらもボーン構造と合わせてオススメしたいです。

因みに自分が牛山氏を知ったのは以下の動画でした。
今でもちょいちょい見に行きます。
「Human Head Modeling [HD] Slow Reproduction Version : 牛山雅博」

【追記おわり】


【小話】どうして肘と膝だけちょっと曲げるの?(極端な内股クロス・ガニ股問題の原因)

肘・膝をちょっと曲げる理由の前に、まず足を真っ直ぐにするメリットについて述べておきます。

足は、ボーンが真っ直ぐでないと三点トラッキングでもおかしくなります。

画像26

↑向かって左から、真っ直ぐ・内股(X脚気味)・O脚気味の足のモデルですが、ボーン自体はどれも同じ構造で真正面から見た際に足のボーンが床面に対して垂直になるようになっています。
これでボーンを曲げ伸ばしさせても問題無いのであれば、このままで良いのです。

むしろ足の形に沿わせてしまうと、VRCで動かす際に問題が生じます。

例えば、
X脚にボーンを沿わせた場合は、足を曲げると極端な内股になったり膝が交差(クロス)してしまい、

画像38

O脚にボーンを沿わせた場合は、ガニ股になってしまうのです。

画像39

※画像はBlenderでの再現なので、VRChatでの動きとは異なりますが、概ねこのような感じです。ほんのちょっと内側/外側に逸れるだけで割と顕著。

何故こうなるのかと言うと、肘と膝に関しては他の関節(指は除く)と違い、一方向にしか曲げれないという構造にしなくてはならないので、あっちゃこっちゃに曲がってしまわないように、IKを使って「こっちの方向に曲がるよ」という情報と、曲げるための計算が必要になります。


その計算方法については、VRChatというか、Final IKというアセットの仕様で、青木そらすさんの以下のツイートがとても分かりやすいです。

「腕の付け根・肘関節・手首を結んだ三角形の鈍角の方向に曲がるよ」
「足の付根・膝関節・足首を結んだ三角形の鈍角の方向に曲がるよ」

という計算で肘・膝が一方向にだけ曲がってくれるようになるわけですね。肘・膝を曲げなければならない理由はコレです。
これは先に述べた

UnityではHumanoid Rigの設定をしたボーンのローカル回転軸はスルーされる

ということも大きく関わって来ます。多分。うん。
そして、X脚・O脚にボーンを沿わせると内股・ガニ股になってしまう謎もこれで解けるわけです。

X脚の形をしたボーン配置の場合、簡略化して真上(下図右)から見ると、実際のモデルのローカル回転軸はどうあれ、三角形の鈍角が内側に向いていることになり、その結果として極端な内股や膝が交差(クロス)することになるようです。

画像43
画像39

O脚の形をしたボーン配置の場合、簡略化して真上から見ると、実際のモデルのローカル回転軸はどうあれ、三角形の鈍角が外側に向いていることになり、その結果としてガニ股になるようです。

画像43
画像40

という訳でトラブルを避けたい場合は足のボーンは真正面から見た時に床面に対して垂直にしておくのが吉なようです。

もしもアバターをしっかり内股にさせたい・ガニ股にさせたいということであれば、モデルの足やボーンは真っ直ぐにしておき、そのアバター専用のIdle(待機)・歩き・走り・ジャンプ等のモーションを用意して適用させるのが良いかもしれません。

余談ですが、VRCのSDK2を使用したアバターは、内股にさせるかガニ股にさせるかを「Male/Female」のIdleモーションで指定できまして、その設定で内股にさせると、アバターによっては足がかなり交差してしまっていた記憶があります。
今思い返せば、あれは足が真っ直ぐのボーン配置に適用されることを想定したモーションで、元々内股気味のボーン配置だったアバターに適用させてしまうと、余計に膝が交差していたということだったんですね…。


【小話】Hipsだけは間違いなく真っ直ぐが良い!

背骨に位置するボーン(Neck・Chest・Spine)は若干湾曲している程度であれば許容範囲の動きに留まるようなのですが、Hipsというボーンに関してだけはちょっと特殊です。
Hips(※UnityでHipsのリグとして設定したもの)は全てのボーンの親(一番上)であり、全てのボーン及びモデル全体の位置や傾きの基準になってくれています。
という訳でHipsは基本的に原点上に垂直配置が良いです。

追記:MMD等ではHipsに値するボーンよりも上に垂直配置のボーンが存在する。ここではあくまでもHipsのリグとして設定したものについて述べる

Hipsが前に傾いていると、モデル自体に「このモデルは前に傾いているよ」という情報を持たせてしまい、バウンディングボックスが傾いてしまって思ったように設定できなくなったり、フルトラ時に腰の挙動がおかしくなる原因になります。

バウンディングボックスについての参照記事:カメラが近づくと消えるメッシュの原因と対処法【Unity】【トラブルシューティング】

画像31
画像32

モデル:みぉん。君

Bender上ではジョイント同士は接続されておらず、ボーンも存在しないように見えますが、Unity上では空白の間にもしっかりジョイント同士を繋ぐボーンが存在していて、計算されます。
つまりHipsとUpper Legのジョイント間にもボーンが左右それぞれ一本ずつ存在することになっています。

画像46


⑤お尻(Hips)のヘッドを太もも(UpperLeg)のヘッドよりちょっと高くする

と書きましたが、もしかしたらIKの計算ではUpper LegとHipsの高さでHipsの上下を割り出していて、両ボーンのヘッドジョイントの高さが揃ってしまうとHipsの上下が判定できず、全てのボーンの基準であるHipsがそうなってしまうと上手くトラッキングできずにグシャッとなってしまう……のかもしれませんね…。右肩が脱臼するのはよく分からないけれど。
これは単なる憶測ですが、きっと何らかの計算にこの三角形が必要なのでしょう。

画像45
画像33




冒頭にも載せた参考記事:Metasequoia 4.3の新機能(3) ボーン - Unity向けテンプレート

この参考記事、モデリングを始めた時に一番知りたかった情報だなぁと思いました。
モデルをどの位置に置くのかもよく分かっていなくて今までかかと部分が原点にくるように合わせたりしてたけど、ボーンを原点に合わせたら良かったんだね…。そうだよね…。その方がモーションも流用させやすいもんね。



【小話】フルトラ適正について

この記事に書いたことは決してフルトラ適正を高めるというものではなく、あくまでもアバターが正常に動くためのボーン配置です。
何を以ってフルトラ適正というのか難しいのですが、少なくとも手足が自分の思ったところに来るということがフルトラ適正であるとするならば、別の対策が必要になります。

VRCの公式ガイドラインでは

The avatar's rig does not deviate greatly from the example rig given in the SDK named tpose-new.fbx.

アバターのリグは、SDKで提供されているtpose-new.fbxという参考リグの例から大きく外れないこと。

という記述が2019年の9月からあります。
ただ、このtpose-new.fbxというデータの保存場所というのが、もう廃止予定のSDK2の中にだけあったり、

画像48
画像49

特記事項として、ガイドラインには以下のような記述があります。

Tweaking your Rig
Although the full-body tracking system in VRChat is quite robust, it works especially well when you perform some tweaks. If you're interested in fixing up some common issues with your rig and making it feel perfect in Full Body Tracking, check out Kung's guide. It is extremely well-made, and very easy to follow given some basic existing knowledge of Unity and Blender.

リグの調整

VRChat のフルボディートラッキングシステムは非常に堅牢ですが、いくつかの調整を行うことで特に効果的に機能します。リグの一般的な問題を解決して、フルボディートラッキングで完璧な状態にすることに興味があるなら、Kung氏のガイドをご覧ください。非常によくできていて、UnityとBlenderの基本的な知識があれば、非常に簡単に従うことができます。
(DeepL翻訳)

このようにKungさんの動画が紹介されていたので動画のリンクを貼っておきます。内容は2020年のものなんですが、今でもフルトラで起きるほとんどのトラブルが解消されるはずです。
この記事で紹介したこともいくつか載っています。(全部英語)
【追記2021/12/03】
ただし「(RIG HACK)」と書かれているものはVRC側の不具合にアバターを合わせる方法で、それらの不具合はAvatars3.0でどんどん改善されていってる最中のため、現在はやる必要は無いようです。【追記ここまで】

画像65

【追記2021/12/02】
まさかの昨日、VRChat公式からクリエイター向け解説チャンネルが発足されておりました!!解説者はKungさん!これは期待!
参考記事:Introducing the VRChat Learning Channel! by Kung

YouTubeの公式チャンネル:



【追記:小話】Unity上ではボーンのテールが反映されない

この項目は2022年1月16日に追記されました
リーフボーンについて書いた際にチラッと出てきたのですが、Unity上ではボーンのテールが反映されません。

画像75

どういうことかと言うと、
Blender等のモデリングソフト上では傾きの無い垂直なボーンでも、Unityに持って来て、HumanoidRigのマッピングを適用されたモデルの場合は、リグとしてマッピングされたボーンのヘッド同士を繋ぐ形になります。

つまり、下図のようにボーンのヘッド同士が垂直に並んでおらず前後に間隔がある場合、Unity上では垂直ではなく傾きのあるボーンとして認識されます。

画像73

更に上図のようにNeck/Chestのボーンが前に傾くボーン配置の場合は、VRC側で用意されたIdle用等のモーション等を適用された時に、首が起き上がる/胸を張るような形になります。(自作アバターの首が起き上がっていたのはこのせいでした)

逆に、
下図のようなNeck/Chectのボーンが後傾するボーン配置の場合は、VRCのIdle用モーションを適用した際に、若干首が前に出る/胸が後ろに下がるような形になります。

画像75

真っ直ぐ垂直でなくても、上半身のボーンが後傾気味なボーン配置のアバターは、結果的にVRCのモーションとも相性が良いように思います。(個人的な感想)

自分はフレンドからボーンは真っ直ぐにした方が良いと教わりましたし、実際そうすることで自分のアバターの問題は解決したのですが、
結局のところは、作った本人自身が良いと感じるのであれば、無理に真っ直ぐにする必要は無いと思います。
この記事は「何か思ってた動きと違うな…」という人のお役には立てるかもしれない、そんな可能性があるかもしれない文章で構成されています。

【まとめ】

以上、ボーンの設定についてのまとめでした。

実は、ここに書いてあることは、全てではないにしても、二年前、三年前から一部のフルトラのVRChatユーザーの人達が言ってくれていたことではあるのです。
単に私が問題を把握できずに知らなかっただけで。

なので、もしかしたらずっと前に、既に私にこの内容を教えてくれた方がいらっしゃったかもしれません。
だとしたら、何も身に付いておらず、何一つ覚えておらず、本当に申し訳ございません。

私も人伝に聞いたのか、口頭で実際に教わったのか、もう記憶には無いのですが、自作アバターのボーンを見てみると恐らくこの情報を中途半端に知ってボーン修正したんだろうな…という形跡があります。

何せ今までアバターのボーン構造に関する情報というものが、私の中ではとにかくボンヤリとしていたので、今回ここまで知れて良かったです。
もう悩まない!(かもしれない)

ここまで読んでくださった方、本当にお疲れさまです。
ありがとうございました。
簡易モデルは手指以外は本当にめちゃくちゃ簡易なもので、ウェイトのデータ転送とかに使おうと思ってたやつです。あんまり使えないかもしれないんですが、よろしければご自由にご利用下さい。
もしも何かお役に立てることがあれば幸いです。ではまた。


-Special Thanks-
青木そらすさん うきだけさん ゆらんさん















いやこれ多分きっとVRChatやってる限りアプデでまた何やかんや変わって結局悩まされるんだろうなとは思うんだわ…。


【追記2021/12/03】
ほらな!!!!!!!




この記事が気に入ったらサポートをしてみませんか?