はじめに
今回はPhysBoneのComponentについて紹介。
VRC Phys BoneとVRC Phys Bone Colliderの2つについて解説。
最新版:2023年5月4日_アップデート対応(もちもちPB追加アプデ対応(β版))
【注意点】
本記事はオープンβ版の際に書いた記事を現時点のアップデートまで継ぎ足して更新したものです。
写真の一部はバージョン差で実際と異なること場合があります。
※説明の辻褄は合うようになってます。
VRC Phys Bone(簡易)
Version
・Version 1.1 = 2023年5月4日に「Stretch Motion」追加が反映される。
・Version 1.0 = 2023年5月4日以前のモデルの設定。
※1,Stretch Motion=通称ましゅまろPB。
※2,基本的にVersion1.1を使う事をおすすめします。(新規でモデルを作る場合)
Transform
・Root Transform = どのボーンを動かすか。
・Ignore Transforms = 動かすボーンの中からPhysBoneを無効化する設定。
・Endpoint Position = X,Y,Zが0以外の時に終了地点にボーンを作成。
・Multi Child Type = 複数の子を持つボーンの挙動調整。
→ Ignore = 親ボーンが回転しない
→ Average = 親ボーンが回転する+良く動く+動作が安定やや不安定。
→ First = 親ボーンが回転する+抑えめな動きになる+動作が安定している。
Force
・Integation Type = 揺れ方の計算方法の選択。
→ Simplfied = 安定性が高く構成が簡単。しかし外部の影響で動く力が弱く反応速度が遅い。
→ Advanced = 外部の影響で動く力が大きくと反応速度が速い。しかし安定性が低く構成が複雑。
※1,DBの自動変換はAdvancedに設定されます。
※2,内容的にAdvancedを使う事をおすすめします。
▶Force – Simplfied
・Pull = 影響の受けやすさ、どのように元の状態に戻るか(減衰)
・Spring = 揺れやすさ、バネっぽさ、数値が低いと重く感じる(弾力性)
・immobile Type = 不動性の設定方法を変更できます
→ All Motion = 全ての動作に対して不動性を割り当てる
→ World(Experimental) = VRChat上のジョイスティック移動の動作に不動性を与える
・Immobile = 動かなさ、元の動きがどれぐらい影響受けないか(不動性)
・Gravity = 重力の影響、下方向への加速度(重力)
・Gravity Falloff = 体などが傾いてない時の重力影響の無効化(回転角度による重力相殺)
※Cを押すとカーブで細かく動きを設定可能。
▶Force – Advanced
・Pull = 影響の受けやすさ、どのように元の状態に戻るか(減衰)
・Momentum = 動きのバネっぽさ。(弾力性)
・Stiffness = 元の形の保ち具合。(剛性)
・Immobile = 動かなさ、元の動きがどれぐらい影響受けないか(不動性)
・Gravity = 重力の影響、下方向への加速度(重力)
・Gravity Falloff = 体などが傾いてない時の重力影響の無効化。(回転角度による重力相殺)
※Cを押すとカーブで細かく動きを設定可能。
Limits
・Limits Type = ボーンの動作範囲の形を方法
→ None = 動作範囲の指定なし
→ Angle = 軸を中心に円錐状に動作範囲を指定する方法(2軸)
→ Hinge = 平面に沿って動作範囲を指定する方法(1軸)
→ Polar = 球面上に沿って動作範囲を指定する方法(極座標)
※Polarは重いです。可能なら避けてください。64個以上使うと不具合が起こる可能性があります。
▶Limits – Angle/Hinge
・Max Angle = ボーンが曲がれる最大角度
・Rotation = 回転軸の向きを調整(Pitch、Roll、Yawの3つの軸で制御)
▶Limits – Polar
・Max Angle = ボーンが曲がれる最大角度(Hingeと同じ挙動の1軸)
・Max Yaw = Max Angleから直角方向の最大幅を調整(前後に展開)
・Rotation = 回転軸の向きを調整(Pitch、Roll、Yawの3つの軸で制御)
Collision
・Radius = VRChatで触れる範囲(水色の円で表されるもの)
・Allow Collision = デフォルトの衝突判定(手、頭、体)の影響を受けるかどうか
・Collider = どの衝突判定の影響を受けるか(Sizeで影響を受けるコライダーの数を設定)
※ここは衝突判定の”受け方”の設定です。
Stretch Motion(通称:もちもちPB)
・Stretch Motion = ボーンの伸びと縮みの有効度合い
・Max Stretch = ボーン伸びの最大量
・Max Squish = ボーン縮みの最大量
※Cを押すとカーブで細かく動きを設定可能。
Grab & Pose
・Allow Grabbing = VRChatで掴めるかどうか
・Allow Posing = 掴んで位置固定ができるかどうか
・Grab Movement = 手に引っ付く速度
・Max Stretch = 掴みによるボーンの伸び具合
※Cを押すとカーブで細かく動きを設定可能。
Options
・Parameter = Avatar Controllerに影響を与える(俗にいうAvatar3.0が使える)
・Is Animated = アニメーション再生中でもPhysBoneを動作させるかどうか
※Is Animatedはオフの方が動作が軽くなります。
Gismos
・Show Gismos = UnityのシーンでPhysBoneをプレビューするかどうか
・Bone Opacity = ボーンプレビューの透明度調整
・Limit Opacity = ボーン可動範囲の透明度調整(Freeze Axisを有効にすると出現)
VRC Phys Bone Collider(簡易)
Root Transform = どのボーンに衝突判定を入れるか。
Shape
・Shape Type = 衝突判定の形
→ Sphere= 球状
→ Capsule = カプセル状、高さの変えれる球。
→ Plane = プレビューの板を元に水平方向に無限に広がる形。(見えてる板の外側もある)
▶Shape-Sphere
・Inside Bounds = 衝突判定の形の外から出ようとした際にボーンを引き戻す。
・Radius = 衝突判定の大きさ
・Position = 衝突判定の位置
・Rotation = 衝突判定の回転角度
・Inside Bounds = 衝突判定の外にボーンを出さない機能
▶Shape- Capsule
・Radius = 衝突判定の大きさ
・Height = 衝突判定の高さ
・Position = 衝突判定の位置
・Rotation = 衝突判定の回転角度
・Inside Bounds = 衝突判定の外にボーンを出さない機能
・BonesAsSpheres = 衝突した際のボーンの動きが綺麗になる
▶Shape-Plane
・Position = 衝突判定の位置
・Rotation = 衝突判定の回転角度
簡易説明一覧表
こちらよりご覧ください。
※ブログだと画像圧縮の影響で細かい文字がつぶれるためTwitterでの紹介です。
※2022年5月5日_アップデートには非対応です。
CapsuleのHeightの設定項目が消えるなどの不具合がある為、様子見中。
詳細説明
説明のための用意
Blenderでこのようなモデルを作成して保存。

.blendファイルをUnityに読み込み。
SenceのGizmos表示をオンに変更。

この状態で説明していきます。
PhysBoneの導入
VRChatのホームページにアクセス。
Downloadを選択。
Download SDK3 – Avatarsを選択。

ダウンロードした.unitypackageをProjectにドラッグ&ドロップ。

Importを押します。

これでPhysBoneの導入が完了です。
PhysBoneの割り当て
HierarchyでPhysBoneを入れたい“ボーン”を選択。
InspectorでAdd Componentをクリック。
検索欄にVRC phと打ち込み。
VRC Phys Boneを選択。

これでPhysBoneの割り当てが完了です。
PhysBoneの動作確認
掴み系以外の動作はUnityのPlayモードで確認できます。
Armatureの1つ前のモデルを選択。
Wキーで移動。
※Playモード中に行ったComponentの編集は記録されないので注意してください。

掴み系の動作の確認の場合はVRChatにアバターをアップロード。
その後、VRC上で動作を確認してください。

VRChat上でのPhysBoneの動作方法についてはこちらをご確認ください。
VRC Phys Bone(詳細)
ここからはPhysBoneのパラメーターについて詳しく解説していきます。
長いです。
PCで見ている方は右側の目次やCtrl+Fで検索などを使うことをおすすめします。
Transform
Root Transform
どのボーンを動かすかの設定です。
設定してない場合はComponentを割り当てたBone以下の階層がすべて有効化されます。

ボーンの指定はHierarchyよりドラッグ&ドロップ。

指定したボーンの中にあるすべてにPhsBoneが有効になります。

枝分かれしたボーンにも対応してます。
Ignore Transforms
指定したボーンの中からPhysBoneの設定を無効化する設定。

Sizeで無効化するボーンの数を変更。

Erement 0~ で無効化するボーンを指定。

Sizeを0にすることで無効化するボーンを削除。

Endpoint Position
X,Y,Zが0以外の時に終了地点にボーンを作成。
Blenderの.fbx書き出しのエンドボーンのような効果です。

X,y,Z=0,0,0に設定するとボーンの生成が無くなります。

リーフボーンが無くても9割上手く行きます。
しかし、枝分かれした構造のボーンの場合たまに上手くいきません。
その時はこちらをお試しください。
Multi Child Type
複数の子を持つボーンの挙動を調整する機能です。
違いが分かりにくくVRChat公式ドキュメントに現時点(2022/04/27 112:17)で詳細が載ってない機能。
『選択肢は3つなので、基本的にはIgnore → 問題が起こればAverage → それでもだめならFirstという順番に調節ガチャしてください。』
4面図での挙動比較。(左=Ignore、中央=First、右=Avarage)

若干ですがこの3つの動きが異なってる事が確認できます。

また、Limitsを入れると2つ目の動作範囲が変わるという事が起こります。

Avarageが一番思った通りの動きになってくれそうです。
Ignore
複数の子ボーンの開始位置が違う場合に使用。
髪の毛やスカートなどは基本こちらに設定。
問題が起こらない限りIgnoreで大丈夫です。
時々、胸などのボーンが動作しない等の問題が起こります。
First
Averageより動く。
左右にしか動かしてない動きでも前後に動く。
自然な動きが作れる。
Average
胸などのボーンが動作しない等の問題が起こった時に設定。
Limitsの範囲などを見る限り一番動作が安定していそうな設定。
Firstよりは抑えめな動きになります。
Forces
Integation Type
揺れ方の計算方法の選択。
SimplfiedとAdvancedの2通りが選べる。
この2つは表示される内容が異なる。

基本的にAdvancedを使います。
DynamicBoneの自動変換はAdvancedに設定されます。
Simplfied
メリット:安定性が高い。構成が簡単。
デメリット:外部の影響で動く力が弱い。反応速度が遅い。
Advanced
メリット:外部の影響で動く力が大きい。反応速度が速い。
デメリット:安定性が低い。構成が複雑。
Forces一覧
SimplfiedとAdvancedで重複するところがあるのでまとめて紹介します。
Pull
動きの影響の受けやすさです。(減衰)
数値が大きいと動きがまっすぐ伝わり動きの遅れが無くなります。
数値が小さすぎると動かなくなります。

C ボタンを押すことでカーブを使いより細かく設定できます。
Spring
Simplfied限定の機能です。
動きのバネっぽさです。(弾力性)
数値が低いと重く感じます

C ボタンを押すことでカーブを使いより細かく設定できます。
Momentum
Advanced限定の機能です。
動きのバネっぽさです。(弾力性)
数値高いとバネっぽさが上がります=説明は同じですがSpringと挙動は異なります。

またSpringとTypeを変えた際の数値が連動しています。
※挙動は別の物になるので注意してください。

Stiffness
Advanced限定の機能です。
元の形の保ち具合です。(剛性)
数値高いほど元の形が保たれます。
※Momentumの数値を上げて実験すると挙動が分かりやすいです。

immobile Type
不動性は2つのタイプから選べます。
・All Motion
・World(Experimental)
この2つについて解説します。
All Motion
これまで通りのimmobileの挙動です。

World(Experimental)
World(Experimental) はVRChat上のジョイスティック移動の動作に不動性を与える機能です。

移動の際の形の崩れ対策になります。
ですが、既存のimmobileの数値設定が使えなくなるので現状は使えません。
(Experimental)と実験段階という表記があるように公式にも『このモードは将来変更される可能性があります!』と書かれています。
現状はAll Motionを使ことになります。
immobile
元の動きがどれぐらい影響受けないか(不動性)です。
数値が大きいとPhysBoneの動きが無くなります。
Transformによる変形は残ります。

C ボタンを押すことでカーブを使いより細かく設定できます。
Gravity
重力の影響です(重力)
0以外の数値にするとGravity Falloffが調節できるようになります。
マイナスにすると浮きます。
数値の影響が大きく出ます。
±0,05付近の数値がおすすめ。

C ボタンを押すことでカーブを使いより細かく設定できます。
Gravity Falloff
回転角度による重力相殺です。
体などが傾いてない時の重力影響の無効化できます。
これはモデルの髪の毛の設定などに役立ちます。
通常、重力を入れると髪や耳の形が変わってしまします。

Gravity Falloffを1にすることで直立状態で重力の影響を受けなくなります。

上手く動かない場合はGravityの値を個別に調節してください。
ココアちゃんの耳はなぜかGravityをかなり弱くしないと動作しませんでした。

体全体を傾けると重力の影響が加わります。
これで頭が斜めに向くと重力の影響を受けるといった処理に活用できます。

Limits
Limits Type
ボーンの動作範囲の形を設定できます。
・None = なし
・Angle = 円錐状(2軸)
・Hinge = 平面の円(1軸)
・Polar = 球面(極座標)
下図のような形で動作範囲を指定できます。

Forces一覧
AngleとHingeとPolarで重複するところがあるのでまとめて紹介します。
Max Angle
ボーンが曲がれる最大角度です。
前後と左右の2方向に広がります。

Rotation
回転軸の向きを調整です。
Pitch、Roll、Yawの3つの軸で制御します。
それぞれの方向は下図の通り。

動かすとこのように動きます。

Max Yaw
Polar限定の機能です。
Max Angleから直角方向の最大角度を調整します。
角度は前後に展開します。

Radius
衝突判定を”受ける”の円の大きさです。

VRChat上だと水色の円で表現されます。

つかめるボーンの大きさという考え方もできます。
Allow Collision
デフォルトの衝突判定(手、頭、体)の影響を受けるかどうかです。

注意点は下記の3つ。
・揺れは有効のまま
・自力でCollisionを設定した場合は動く
・掴みが設定してある場合は掴める(Allow Grabbingをオン)
チェックを外した場合はデフォルトの衝突判定(手、頭、体)の影響が無効になります。
黄色く表示されているのがCllidersです。

揺れは残ります。

髪の毛(Allow Collisionオン)と比較すると手の衝突が無効化されたことが分かります。
※若干揺れてるのは手を動かした際の首の揺れです。

Collidersを使って自力で衝突判定を入れた場合は影響を受けます。
手に衝突範囲を設定。

Collidersの詳しい設定方法は次の項目で解説。

Collidersを入れたので動くようになりました。

掴みが有効な場合は掴めます。(Allow Grabbingをオン)

触れないですが掴める不思議な挙動になります。
弓の弦に使えそうです。
Colliders
衝突判定を”どう受けるか”という設定です。
Sizeでどの衝突判定を”受ける”数を設定。

1以上にするとElement 0~が生成されます。

確認の為に衝突判定を作ります。
Hierarchyを右クリック → Create Emptyを選択。

GameObjectを選択。
Add Componentをクリック。
検索欄にVRC phと入力。
VRC Phys Bone Colliderを選択。

Erement 0に衝突判定を入れたGameObjectを入れます。

動かしてPlayモード。
Radiusなどを調節してあたり方を調整。
すると衝突判定に当たり若干動きがカクっとなることが確認できます。

Sizeを0にすると影響を受ける衝突判定を削除できます。

Allow Grabbing
VRChatで掴めるかどうかです。

チェックがオフだと掴めなくなります。

当たってはいるのですが掴めません。
変わりに掴み判定に近い髪の毛が掴まれます。
Allow Posing
掴んで位置固定ができるかどうかです。

Phys Boneは下記の手順で位置固定できます。
掴む → 移動 → コントローラーのトリガーを押す → 離す → 形を固定。
固定された状態でも揺れ物ボーンの効果は残ります。

チェックを外した場合は下記の挙動になります。
掴む → 移動 → コントローラーのトリガーを押す → 元の形に戻る。

Grab Movement
手に引っ付く速度です。
Grab Movementを0に設定するとPullとSpringの値を元に引っ付く速度が決まります。

下図はこのような設定です。
・Grab Movement=0
・Pull=0.2
・Spring=0.2

PullとSptingを0に設定すると全く動きません。
・Grab Movement=0
・Pull=0
・Spring=0

PullとSptingを1に設定するとすぐに手に引っ付きます。
・Grab Movement=1
・Pull=0.2
・Spring=0.2

Max Stretch
掴みによるボーンの伸び具合です。

2.5に設定。掴むと伸びます。

Cを押すことでカーブの伸び具合を調節できます。

斜め上に向かうカーブは末端に向かうにつれて伸び具合が大きくなります。

※Allow Posingをオフにしても伸ばしたまま固定できませんでした。
Stretch & Squish(もちもちPB)
2023年5月4日のアップデートで追加された機能です。
これを使うにはPhys Bone v1.1に変更する必要があります。
VRC Phys Bone → Versionで「v1.1」に変更。

そして使えるようになる3つのパラメーターの意味は下記。
・Stretch Motion = ボーンの伸びと縮みの有効度合い
・Max Stretch = ボーン伸びの最大量
・Max Squish = ボーン縮みの最大量
右側のC=カーブで変化量調整(Xで元に戻す)
Stretch Motion
Max Stretchを5、Max Squishを1に設定。
Stretch Motionを0にすると、伸び縮みが無効化されます。
Stretch Motionを0に設定。
上下に動かした時の挙動がこちら。

Stretch Motionを1に設定。
すると、伸び縮みが入ります。

もう一度、Stretch Motionを0に設定。
前後に動かした時の挙動がこちら。

Stretch Motionを1に設定。
前後に移動。
前後の動きは変化が分かりやすいです。

Stretch Motionを0に設定。
当たった時の挙動確認。
ボーンの大きさが変わらずに、形が上に逃げてる事が分かります。

Stretch Motionを1に設定。
当たった時の挙動確認。
ボーンの大きさが変わった事が分かります。

今度はStretch Motionを1に設定。
Max StretchとMax Squishを0に設定。
すると、有効度が1でも、伸び縮みの値が0なので無効化と同じ挙動になります。

これが、Stretch Motionの挙動です。
Max Stretch(揺れ)
おもに、体の動きに合わせて自然に揺らす用パラメーターです。
自然に揺らす=揺れ物ボーン+伸びの効果で実現。
Stretch Motionを1に設定。
Max Stretchを5、Max Squishを0にして前後移動。
すると、ボーンが伸びることが分かります。

これで揺らすと、ぽよんぽよんします。

これが、Max Stretchの挙動です。
Max Squish(押し潰れ)
おもに、触る、押しつぶされた状態を自然に表現するパラメーターです。
自然に揺らす=揺れ物ボーン+縮みの効果で実現。
Stretch Motionを1に設定。
Max Stretchを0、Max Squishを5にして前後移動。
すると、ボーンが縮むことが分かります。

コライダーに当てた状態でMax Squishを変更。
すると、潰れ具合が変わる様子が確認できます。

これが、Max Squishの挙動です。
Parameter
Avatar Controllerに影響を与える機能です。
俗にいうAvatar3.0が使えます。

AnimatorのParametersで何かをすれば動くと思います。

申し訳ないですが私は未だにAvatar3.0と和解できて居ないので詳細は説明できません。
Is Animated
アニメーション再生中でもPhysBoneを動作させるかどうかです。

このようなアニメーションを入れました。

アニメーションが入っていても手などの衝突の影響を受けます。

掴んでる状態でもアニメーションが再生されます。

Show Gizmos
UnityのScene上でPhysBoneのプレビューを表示させるかどうかです。

Bone Opacity
PhysBoneプレビューのうちボーンの見え方を調節する機能です。

Limit Opacity
PhysBoneプレビューのうちボーンの可動範囲の見え方を調節する機能です。

VRC Phys Bone Collider(詳細)
衝突判定について詳しく解説します。
衝突判定の入れ方はこちらをご覧ください。
Root Transform

Shape Type
衝突判定の形です。
球、カプセル、平面(無限遠)の3つがあります。

Planeの大きさについて
Planeには大きさがありません。
表示されている四角形が当たり判定では無いからです。
表示されてる四角を無限遠まで引き延ばした範囲が衝突判定になってます。

なので表示される板から離れていても衝突します。

Radius
衝突判定の大きさです。

Height
衝突判定の高さです。
カプセル形状の時のみ編集できます。
1以下の数値になると球の状態で固定されます。

※2022年5月5日のアップデートでは不具合からか表示が消えました。
Inspectorを右クリック → Debugに切り替えると出てきます。
こちらでご対応ください。

Position
衝突判定の位置です。
X,Y,Zの3つの軸で位置を調節できます。

Rotation
衝突判定の回転角度です。
X,Y,Zの3つの軸で回せます。

Inbunds
衝突判定の外にボーンを出さない機能です。
チェックを入れると有効化されます。

BonesAsSpheres
衝突した際のボーンの動き変わります。
こちらはチェック無しの挙動です。

チェックを入れると挙動が少し綺麗になります。

まとめ
今回はPhysBoneのComponentについて紹介しました。
ほかにもPhysBone関係の解説記事を上げてます。
またValve Indexのレビュー記事とおすすめ補強方法について解説した記事もあります。
Indexデビューに興味がある方はこちらもご覧ください。
ぜひこちらもご覧ください。
コメント
素晴らしい!すごく分かりやすく纏まっていて助かります。
私が把握している情報も共有しますので、よければ参考にしてください。
> Radius
RadiusはTransform.Scaleの影響で大きさが変わります。
これを利用すると細いボーンの先端に、大きな触れる(掴める)領域を設定するといったことができます。
> Max Stretch
> Allow Posingをオフにしても伸ばしたまま固定できませんでした。
Allow Posingとは少し違いますが、Forcesをすべて0にすると、(元の位置に戻ろうとする力が無いので)伸ばしたままの状態が維持されるような動きになります。
> Parameter
https://www.youtube.com/watch?v=6eSHc0SL2Qg
パラメータを利用するとこんな感じで、離しているときと掴んでいるときでアニメーションを切り替えるといったことができます。
この例では Parameter に「Hoge」と設定することで掴んでいるときに「Hoge_IsGrabbed」が変化するようになっており、それを条件に再生するアニメーションを切り替えてます。
掴んでいるときに変化する「Hoge_IsGrabbed」の他に、
もとの位置からどれだけ揺れてているかで変化する「Hoge_Angle」、
もとの長さからどれだけ伸びているか(Max Stretchの設定が必要)で変化する「Hoge_Stretch」
が利用できます。
ありがとうございます~( ˇωˇ )