VRChatとVRMでの手首のひねり時のボーンの挙動とねじれボーンの設定について
目次
- この記事の目的
- テスト準備
- VRChatでの手首ひねり時の挙動
- VRMでの手首ひねり時の挙動
- ねじれボーンの設定
- VRChatでのねじれボーン設定後の挙動
- ねじれボーンの設定(VRM)
- VRMでのねじれボーン設定後の挙動
- まとめ
この記事の目的
この記事はVRChatやVRMでのモーショントラッキング時に手首を回転させた際に発生する腕のねじれについて、ボーンがどういう動きをしているのかを記録し、どのような設定をすればねじれを回避できるかの設定を記載します。
テスト準備
テスト用モデルについて
テストするにあたり、まずはテスト用のモデルを用意する。

簡単な立方体で構成された、前面を赤、側面などを青で塗り分けたモデルを作成した。

ウェイトはそれぞれUpperArm、LowerArm、Handのボーンの範囲が100%となるように塗っている。
このモデルを用いてVRChatやVRMでのトラッキング時の動きを見ていく。
トラッキング条件について
モーショントラッキングについては、使用する機材はmocopi、
VRChatでのトラッキングはmocopiLink→mocopiVR→VRChatというルートで行います。
VRMでのトラッキングはmocopi→VirtualMotionCaputure→VRMPosingDesktopというルートで行います。
VRChatでの手首ひねり時の挙動
上記のモデルをVRChatへアップロードし、トラッキング状態でTポーズとTポーズから手首を180度回転させ手のひらを上に向けた状態のスクリーンショットをそれぞれ正面と背面から撮影した。

上のスクリーンショットでは、Tポーズから手のひらを上に向けた時は、UpperArmが45度、LowerArmが45度、Handが90度回転しているように見える。
現実の人体でこのような動き(前腕の回外動作)をしようとした場合、実際に動くは前腕部(LowerArm)だけのはずだがVRChatでは1ヵ所だけ回転することによる腕のねじれを緩和するためにこのような挙動になっていると思われる。
VRMでの手首ひねり時の挙動
同じように上記モデルをVRMエクスポートしてVRMPosingDeskTopで撮影した。

VRMでも回転を分散させているのは同じだが、こちらはUpperArmが回転せず、LowerArmが90度、Handが90度の回転をしていた。
ねじれボーンの設定
左前腕のねじれボーンの設定
上記の結果のようにVRChatやVRMでのトラッキング時は手首の回転を各ボーンで分散しているため腕のねじれがある程度軽減されるが、より自然にするために以下の記事を参考に腕のねじれボーンを作成、設定していく。
肘関節が痩せるのを防止するTwistBone設定|みかんねここ

前腕のねじれボーンを作成する。手順としては。
- ・LowerArmのボーンをコピーして、名前をLower_Arm_Twistなどに変える(以下Twistボーンと呼ぶ)
- ・Twistボーンを細分化し長さを2分割する
- ・Twistボーンの体側の方を削除する(2と3の手順はボーンを選択しやすくするために行っているので、やらなくてもよい)
- ・Twistボーンの親をUpperArmからLowerArmに変更する

続いてTwistボーンのウェイト設定をする。手首側に行くにつれてTwistボーンの影響が強くなるようにグラデーションに塗っていく。
左上腕のねじれボーンの設定
同じように左上腕(UpperArm)や右側のボーンも設定する、上腕の場合はTwistボーンの親をShoulderからUpperArmに変更する以外は先ほどと変わらない。
Unityでコンストレイントの設定
上記設定をしたモデルをFBXにエクスポートしてUnityで設定する。

LowerArmのTwistボーンを選択し、「VRC Rotation Constraint」コンポーネントをアタッチする。そして以下のように設定する。
- ・Is Activeにチェック
- ・Weightを1に
- ・Freeze Rotation AxesはYのみチェック
- ・Source Transformをhandに設定
- ・Source TransformのWeightは1に
同様の設定をUpperArmのTwistボーンにも設定してVRChatにアップロードする。
VRChatでのねじれボーン設定後の挙動

ねじれボーンを設定した後のモデルでVRChat上でTポーズからの手のひらを上に向ける動きをした結果上の画像のようになった。設定をしていない右腕に比べて左腕は上腕と前腕の全体でねじれているのが見て分かると思う。
ねじれボーンの設定(VRM)

VRMでも確認するためUnityで設定したのと同様の設定をしていく。
VRMのエクスポートのために 「VRM format」アドオンを使用しているためBlender上でボーンコンストレイントを以下のように設定する。
- ・LowerArmのTwistボーンに回転コピーを追加
- ・ターゲットボーンはhandを指定
- ・座標軸はYのみ
- ・ミックスは加算
- ・ターゲット、オーナーともにローカル空間を指定
- ・影響は1.0にする
設定が完了したら同様の設定をUpperArmのTwistボーンにも行いVRMエクスポートする。
VRMでのねじれボーン設定後の挙動
VRMPosingDeskトップで上記で設定したVRMを読み込み、Tポーズから手のひらを上に向けてスクリーンショットを撮影する。

こちらでも関節部分での極端なねじりが腕全体へと分散される結果となった。
まとめ
今回のような設定をすればトラッキング時の腕のねじれはおそらく防げるだろう。
ただ、アプリケーション側でも腕のねじれをある程度分散してくれるような動きをしてくれているので無理してでも設定しなくてもあまり困らないのではないかとも思う。
おまけ
脚についてもつま先を90度外側に向けたときにどうなるかのスクリーンショットを撮ってみた。

左側はコンストレイント未設定、右側はUpperLegにTwistボーンを設定した状態のもので、これを見る限りつま先を90度外側に向けた時はUpperLeg、LowerLegがそれぞれ45度ぐらいづつ回転してつま先を外側に向けている。