VRChat 非公式日本語ドキュメント

PhysBones

PhysBonesは、アバターやワールド内のオブジェクトに二次的な動き(揺れもの)を追加できるコンポーネント群です。髪、尻尾、耳、衣服、ケーブル、植物などに動きを加えることができます。これらを適切に使用することで、アバターはよりダイナミックでリアルになり、ワールドはより没入感のあるものになります。

アバターでのPhysBonesの使用例は、Avatars SDKに含まれています。これを確認するには、Unityウィンドウ上部のメニューバーから VRChat SDK\Samples に進み、プラットフォームに適したサンプルアバターを選択してください。

VRCPhysBone

VRCPhysBoneは、PhysBonesを使用してアニメーション化するボーンの連鎖を定義します。これらは、髪、尻尾、垂れ耳などのソフトボディや二次的な動きをシミュレートするために使用できます!多くの設定オプションがあり、多様な方法でセットアップ可能です。

さらに、PhysBonesは自分や他のユーザーがインタラクションできます!PhysBonesをつかんで動かしたり、PhysBonesをつかんでいる間にトリガーを引くことで、その位置で固定する「ポーズ」をとらせたりすることができます。設定を変更して、ポージングを禁止したり、つかむことを禁止したり、衝突判定を完全に無効にしたりすることも可能です。アバターに設定されたPhysBonesは、インタラクション設定が許可されていれば、他のユーザーがつかんだりポーズをとらせたりすることもできます!

本来の用途ではありませんが、VRChat独自の布(Cloth)コンポーネントを実装するまでの間、PhysBonesは布の代用としても十分に機能します。

Versions

使用するVRCPhysBoneコンポーネントのバージョンは、コンポーネント上で直接選択できます。新しいコンポーネントを作成する際は、デフォルトで最新バージョンが選択されます。既存のPhysBonesは、手動で更新して再アップロードしない限り、以前のバージョンがそのまま使用されます。

Version 1.0:

Version 1.1:

Transforms

Root Transform - このコンポーネントが開始されるトランスフォームです。空欄の場合、このゲームオブジェクトから開始されると見なされます。

Ignore Transforms - このコンポーネントの影響を受けないようにするトランスフォームのリストです。ここで指定したトランスフォームの子要素も自動的に除外対象となります。

Ignore Other Phys Bones - 有効にすると、PhysBoneはシーン階層において自分より下位にある他のPhysBonesやその影響を受けるトランスフォームを無視します。このオプションはデフォルトで有効になっており、無効にすると予期しない挙動を引き起こす可能性があります。

Endpoint Position - チェーンの各終端に追加のボーンを作成するために使用されるベクトルです。ゼロ以外の値が設定されている場合のみ使用されます。通常は、ボーンの「上」方向を指す+Y軸に沿って値を大きくすることをお勧めします。

Multi-Child Type - 複数のボーンチェーンが存在する場合のルートボーンの挙動です。3つのモードがあります。

Ignoreに設定した場合、ルートボーンは動かず、物理演算も無視されます。ルートに1つのPhysBoneコンポーネントを配置するだけで、すべての髪の毛のボーンに影響を与えることができるため、アバターの髪の毛などに便利です!

Firstに設定した場合、ルートボーンは階層内の最初のボーンチェーンと連続した1つのチェーンを形成します。他のすべてのチェーンも機能しますが、最初のチェーンのようにルートからではなく、それぞれのチェーンの最初のボーンから開始されます。

Averageに設定した場合、ルートボーンの動きは他のすべてのチェーンの平均になります。つまり、各チェーンの基部が動くようになります。

caution

単一のルートボーン、または複数の子を持つ(しかし孫を持たない)単一のルートボーンを使用している場合は、必ずEndpoint Positionを定義してください!

例えば、以下のRootBoneにPhysBoneコンポーネントを配置する場合、PhysBonesを機能させるためにEndpoint Positionを定義する必要があります。これはDynamic Bonesとは異なる点です!

Single Bone

  • RootBone

Multiple Children, Single Root

  • RootBone
  • ChildBone1
  • ChildBone2
  • ChildBone3
  • ChildBone4

ChildBoneの後に「エンドボーン」を追加することでも対処できますが、それにはアーマチュアの編集が必要です。

Forces

Integration Typeは、このコンポーネントの影響を受けるトランスフォームの動きをシミュレートするために使用される計算方法を定義します。選択内容に応じて、Forcesセクションで利用可能なオプションが変化します。以下の2つから選択できます。

デフォルト設定では、これら2つのモードはかなり似た挙動をしますが、設定を調整して試してみると、それぞれの違いがすぐに分かるはずです。

info

以下のオプションのほとんど(すべてではないにしても)は、スライダーの横にあるCボタンを押すことでカーブ(Curves)を使用できます。カーブを使用すると、ボーンチェーンの長さに沿って値を調整できるため、ボーンチェーン内で非常に複雑なセットアップが可能になります!

実は、ほとんどの PhysBones 設定でカーブ(Curves)を使用できます!その使い方を学べば、PhysBones の見た目が驚くほど良くなります!

physbones-054e326-2022-04-19_11-32-12_Unity.png Pull - ボーンを休止位置に戻すために使用される力の強さです。 Spring - ボーンが休止位置に戻ろうとする際に揺れる量です。Simplified Integration Type でのみ使用可能です。 Momentum - ボーンが休止位置に戻ろうとする際に揺れる量です。Advanced Integration Type でのみ使用可能です。説明は同じですが、効果は Spring とはわずかに異なります。 Stiffness - ボーンが休止位置に留まろうとする強さです。Advanced Integration Type でのみ使用可能です。 Gravity - ボーンに適用される重力の強さです。正の値を指定するとボーンは下方に、負の値を指定すると上方に引っ張られます。 Gravity Falloff - Gravity がゼロ以外の値の時のみ使用可能です。休止位置にある間、どれだけ重力を無効化するかを制御します。1.0 に設定すると、休止位置にある間は重力がボーンに全く影響しなくなります。これにより、ボーンの休止状態に影響を与えることなく、初期位置から回転した際に重力の影響を得ることができます。

Gravity Falloff パラメータの使用例として、アバターの髪が直立した状態で理想のポーズになるようモデリングされている場合、Gravity Falloff を 1.0 に設定できます。こうすれば、ただ立っている間は重力の影響を受けず、髪はモデリングされた位置で静止します。もし髪が45度の角度で突き出すようにモデリングされており、きれいな曲線になるよう(完全な真っ直ぐや垂直にならない程度に)重力の影響を与えたい場合は、このスライダーを使って 0.5 〜 0.8 程度に調整することで、休止ポーズにおいて重力を部分的に適用させることができます。

Immobile Type は、Immobile の動作を変更します。 All Motion に設定すると、Immobile はルートトランスフォームの親から計算されるあらゆる動きを軽減します。これは新しい PhysBones や変換された Dynamic Bones のデフォルトモードです。このモードでは、シーン空間またはプレイスペースにおけるすべての PhysBone の動きが Immobile ファクターによって減衰されます。

World (Experimental) に設定すると、Immobile はシーンルートトランスフォームを基準とした位置の動きのみを無効化します。アニメーションや IK を通じた動きは、通常通りボーンに影響を与えます。このモードは将来的に変更される可能性があります!

使用しているアバターの文脈で言うと、これはプレイスペース内を歩き回る動作は通常通り PhysBones に影響を与える一方、移動(ジョイスティックを倒して移動する動作)については、Immobile ファクターによってその動きが減衰されることを意味します。

Limits

Limits を設定すると、PhysBone チェーンが動く範囲を制限できます。これはアバターの髪が頭にめり込むのを防ぐなどの状況で役立ち、コライダーを使用するよりもはるかに高いパフォーマンスを発揮します! さらに、Limits のオプションを設定する際、PhysBone チェーンを選択していると Scene ビューに制限の視覚化が表示されます。これは Limits を微調整する際に非常に便利です!

Limit Type には複数のモードがあります。すべてのモードで、PitchYawRoll (それぞれ X、Y、Z 軸に対応)の観点から Rotation を調整可能です。

None

None は、このボーンチェーンに制限が有効になっていないことを意味します。設定オプションはありません。

Angle

physbones-b7abe1f-2022-04-19_11-49-26_Unity.png Angle は、ボーンチェーンが Rotation によって定義された軸を中心として、ある Max Angle に制限されることを意味します。これは Scene ビューでは円錐として表示されます。

Hinge

physbones-b7723cc-2022-04-19_11-50-04_Unity.png Hinge は、ボーンチェーンが Rotation によって定義された平面に沿って、ある Max Angle に制限されることを意味します。これはピザやパイのような円形の一部として表示されます。

Polar

physbones-824db3c-2022-04-19_11-51-22_Unity.gif

Polar は少し複雑です。Hinge を取り、Yaw に沿って一定量スイープすると、Polar 座標系における球体のセグメントが得られます。Max PitchMax Yaw を設定してセグメントのサイズを調整し、Rotation を使用してそのセグメントが球体上のどこに位置するかを決定します。Polar の可視化機能は特に役立ちます。

Polar Limitsはゼロではないパフォーマンスコストがかかるため、使いすぎないでください。大量に使用すると(目安として64個以上)、何らかの問題を引き起こす可能性があります。Max PitchMax Yaw の値が同じか近い場合は、Angle を使用すれば十分であり、パフォーマンスへの負荷も抑えられます。

Collision

Radius - 各ボーン周辺の衝突半径(メートル単位)。衝突判定と掴み判定の両方に使用されます。 Allow Collision - このコンポーネントで指定されたもの以外のコライダーとの衝突を許可します。 Colliders - これらのボーンと特異的に衝突するコライダーのリストです。

Allow Collision には3つのオプションがあります: True に設定した場合、このPhysBoneはグローバルコライダーと衝突します。これには、アバターによって定義された各プレイヤーの手や、アバターまたはワールド上に定義されたカスタムグローバルコライダーが含まれます。 False に設定した場合、このPhysBoneは Colliders リストに記載されているコライダーとのみ衝突します。 Other に設定した場合、アバターかワールドかによって衝突の挙動を制御するための詳細なオプションが表示されます。アバター上のPhysBoneの場合は、そのアバター上のコライダーや、他のアバター/ワールド上のコライダーに対してフィルタリングを行えます。ワールド上のPhysBoneの場合は、ワールド、アバター、アイテム上のコライダーのどれに対して反応するかを設定できます。

Stretch & Squish

Stretch Motion - 動きがボーンの伸縮(Stretch/Squish)に与える影響量です。ゼロに設定すると、ボーンは掴んだり衝突したりした時のみ伸縮するようになります。 Max Stretch - ボーンが伸縮できる最大量です。この値は元のボーンの長さに対する倍率となります。注意: Maximum Bounds Max Squish - ボーンが収縮できる最大量です。この値は元のボーンの長さに対する倍率となります。

Grab & Pose

Allow Grabbing - プレイヤーがボーンを掴めるようにします。アバターの場合、そのアバターを着用しているユーザーと他のユーザーの間でフィルタリングするオプションがあります。 Allow Posing - プレイヤーがボーンを掴んだ後にポーズを取れるようにします。アバターの場合、そのアバターを着用しているユーザーと他のユーザーの間でフィルタリングするオプションがあります。 Grab Movement - 掴まれたボーンの移動を制御します。値をゼロにすると、PullとSpringを使用して掴んだ位置に到達しようとします。値を1にすると、掴んだ位置へ瞬時に移動します。 Snap To Hand - ボーンが掴まれた際、掴んでいるボーンの位置にスナップします。

Options

Parameter - アバター上のPhysBoneでのみ利用可能なオプションです(ワールド上のPhysBoneからこのデータを取得する方法については PhysBone Udon Access in Worlds を参照してください)。これはアバターコントローラーに複数のパラメータを提供するための接頭辞です。例えば、以下の項目において、Parameterを Tail に設定すると、{parameter}Tail に置換されます。

Parameter に何らかの値が設定されると、アバターのAnimatorに以下のパラメータが設定されます。

Is Animated - ボーンのトランスフォームをアニメーションできるようにします。各フレームのボーンのレスト位置(初期位置)は、アニメーションの内容に従って更新されます。PhysBoneチェーン内のいずれかのボーン(ルートボーンを含む!)に対して適用されたアニメーションを反映させるには、これを有効にする必要があります。 Reset When Disabled - このコンポーネントが無効になると、ボーンは自動的にデフォルトの位置へリセットされます。

Gizmos

これらの設定は、UnityエディタのシーンビューでのPhysBoneの表示方法を制御します。PhysBoneの動作自体には影響しません。

Show Gizmos - シーンビューでこのコンポーネントのGizmoを表示するかどうかを設定します。Gizmoが表示されない場合は、シーンビュー自体のGizmoが有効になっていることを確認してください。 Bone Opacity - ボーン自体を表すGizmoの不透明度を設定します。 Limit Opacity - ボーンに適用された移動制限を表すGizmoの不透明度を設定します。

重要な注意点、使用のヒントなど

ConstraintとPhysBoneのコンポーネントが同じゲームオブジェクトに影響を与えるような設定は避けてください。 実行順序の問題が発生する原因となります。 Constraintは親のゲームオブジェクトに適用してください。Constraintのソーストランスフォームは、元のゲームオブジェクトに設定したままでも問題ありません。

caution

Meta QuestのアバターにおけるPhysBonesには厳格な制限があります。 これは、すでにCPUリソースが不足しがちなMeta Questデバイスでのパフォーマンス低下を防ぐための措置です。 これらの制限については、Minimum Displayed Performance Rank ドキュメントにあるQuestのVery Poor制限を参照してください。 この厳格な制限はワールドには適用されませんが、モバイル対応のワールドを作成する場合は、プレイヤーがワールドから離脱するようなパフォーマンス低下を避けるため、PhysBonesの使用数を制限することを検討してください。

コンポーネントごとの制限

1つのPhysBoneコンポーネントが一度に影響を与えられるトランスフォームの数は最大256個までです。 これにはルートボーンおよびすべての子ボーンが含まれます。これはアバター上のDynamic Boneの変換にも影響します!

しかし、そもそもこれほど多くのトランスフォームをアニメーションさせるべきではありません。チェーン内のボーンを親ボーンに向かって統合するようにしてください。Cat's Blender Pluginなどのコミュニティツールでこれを行うことができます。

PhysBoneプロパティの変更

Spring、Pull、StiffnessなどのPhysBoneプロパティは初期化時に設定されます。 アバターにおいて、これらの値は定数であることを前提としており、アニメーションさせることはできません。ただし、PhysBoneコンポーネントのプロパティをアニメーションさせた後、そのコンポーネントを一度オフにしてから再度オンにすることで、意図した挙動が得られる可能性があります。これらはサポートされているアニメーション方法ではなく、将来的なアップデートでもサポートされません(つまり、壊れる可能性があり、その場合に修正されることはありません)。

ワールドでは、Udonスクリプトを介してPhysBoneのプロパティを変更する選択肢がありますが、頻繁な変更は控えるようにしてください。詳細は PhysBone Udon Access in Worlds を参照してください。

ヒューマノイドボーン

HumanoidのボーンをPhysBoneのルートボーンに設定しないでください。 つまり、Hip、Spine、Chest、Upper Chest、Neck、Head、または手足のボーンをルートに設定してはいけません。これにより重大な問題が発生します。 代わりに、ルートとして使用したいボーンを複製し、アニメーションさせたいすべての子ボーンをその新しい複製ルートの下に再配置してください。これはBlenderで行う必要があります。Cat's Blender Pluginなどのコミュニティツールを使用して行うことも可能です。

PhysBoneの回転

Dynamic Bonesとは異なり、PhysBoneチェーンのルートボーンは回転が許可されています。 ただし、移動(位置の変更)はできません。これは特定のセットアップで影響が出る可能性があるため、実際に試して挙動を確認してください。

PhysBone AV3 パラメータ

AV3アバターのパラメータに影響を与える際、VRCExpressionParameters オブジェクトで定義されるような同期パラメータを使用する必要はありません。これらのパラメータは、ローカルおよびリモートの両マシンでPhysBonesが実行されるため、既に双方で更新されています。

PhysBoneのImmobile(固定)挙動

Dynamic Bonesは、Inert の値をコンポーネントが配置された場所(ルートトランスフォームではなく)から算出します。これはおそらくDynamic Bonesのバグです。そのため、PhysBonesでは Immobile の値をルートトランスフォームから算出するようにしています。これにより、場合によっては挙動に影響が出る可能性があります。

コンポーネントの最適な使用方法

PhysBonesはマルチスレッド処理を行うため、すべてのボーンを1つのチェーンに入れるのが最も効率的とは限りません。複数のコンポーネントに分けることで、スレッド間で処理を分散させることができます。とはいえ、コンポーネントの数は少ない方が望ましいですが、Dynamic Bonesの頃と比べて、アバターやワールドオブジェクトにいくつかコンポーネントを配置してもそれほど大きな問題にはなりません。

どうしても数値が必要な場合は、1つのコンポーネントで128個を超えるトランスフォームに影響を与えるようなチェーンのセットは分割することを検討してください。例えば256個のボーンを持つドレスがあり、それがルートで分割されているなら、2つか3つのコンポーネントに分割すれば機能します。

しかし、32個程度のボーンを扱うだけであれば、気にする必要はありません。お察しの通り、これらは厳格なルールというわけではありません!将来的には、設定方法を改善すべき箇所が見つかった際に、ソフトな警告を表示する機能を導入する予定です。

Maximum Bounds

各 VRCPhysBone コンポーネントには、ボーンの動きに合わせて伸縮するバウンディングボックスがあります。このバウンディングボックスは、プレイヤーが PhysBone に触れたり掴んだりする際の当たり判定を補助するものです。効率化のため、バウンディングボックスは最大10×10×10メートルに制限されています。PhysBone がこの範囲外に出ても期待通りに動作し続けますが、その場所によってはプレイヤーがボーンに触れたり掴んだりできなくなる可能性があります。

バウンディングボックスは、当たり判定を持ち、半径が0より大きいボーンのみを考慮します。非常に長い伸縮を実現したい場合は、伸縮ポイントの先に当たり判定を持つボーンが存在する限り、この最大範囲の制限に抵触することを回避できます。

ワールドにおける PhysBone の Udon アクセス

PhysBone は本来アバター向けに設計されていますが、ワールドでも使用可能です。ワールド内で PhysBone を操作する場合、Animator を使うのではなく、Udon スクリプトを使用してください。ワールドで PhysBone を扱う際の主な違いは以下の通りです。

VRCPhysBoneCollider

適切に設定された PhysBone に影響を与えるコライダーを定義します。

Root Transform - このコライダーを配置する Transform です。空の場合、このゲームオブジェクトの Transform が使用されます。 Global Collision - 選択したコンテンツタイプ内のすべての PhysBone が、このコライダーを自身の Colliders リストの一部として扱います。衝突を実際に処理するかどうかを決定する際、PhysBone の Allow Collision(衝突を許可)ルールが引き続き適用されます。アバターの場合、Global Collision(グローバル衝突)を有効にできる PhysBone コライダーは最大4つまでという制限があります。ワールドにはグローバルコライダー数の制限はありません。 Shape Type - このコライダーで使用する衝突形状のタイプです。Sphere、Capsule、Plane コライダーから選択できます。Global Collision は Sphere と Capsule コライダーでのみサポートされています。 Radius - 原点から拡張するコライダーのサイズです。 Height - 各端の半球を含めた、Y 軸に沿ったカプセルの高さです。Shape Type が Capsule に設定されている場合のみ使用されます。 Position - ルート Transform からの配置オフセットです。 Rotation - ルート Transform からの回転オフセットです。 Inside Bounds - 有効にすると、このコライダーはボーンを外に出すのではなく、範囲内に保持するようになります。 Bones As Sphere - 有効にすると、このコライダーは PhysBone の衝突半径を、ボーンの長さに沿ったカプセルとしてではなく、ボーンの位置を中心とした球体として扱います。

Standard Colliders

アバターには、Avatar Descriptor の「Colliders」セクションに一連の「Standard Colliders」が定義されています。このセクションでは、すべてのアバターに存在する標準的なコライダーを定義できます。これらは何も変更しなければ自動的にセットアップされますが、アバターに合わせて正確に調整することも可能です。これらのコライダーはパフォーマンス評価には影響しません。

これらのコライダーは、主に Contact Sender として機能し、他の人が自分のアバターで検出できる 組み込みの身体部位タグ を使用します。ただし、指と手のコライダーは、他の人の PhysBone やワールド内の PhysBone に影響を与えるために使用できるグローバル PhysBone コライダーを作成するためにも使用されます。

ワールドにおける Collider の Udon アクセス

PhysBones と同様に、ワールドで作業する際には Udon を使用して PhysBone コライダーの主なプロパティにアクセスおよび変更することが可能です。ワールド内のコライダーを変更する場合は、Animator を使用するのではなく、Udon スクリプトを使用してください。

VRCPhysBoneRoot

このコンポーネントを使用すると、1つ以上のPhysBoneコンポーネントの移動ルートを定義し、移動時に固定時間(fixed time)とリアルタイム(real time)のどちらで更新するかを設定できます。このコンポーネントは任意であり、ワールドでのみ使用可能です。

Timing - このコンポーネントがアタッチされているGameObjectの子である、すべての VRCPhysBone チェーンで使用されるタイミングモードを設定します。

以下の3つのタイミングオプションから選択できます。

移動ルートが手動で定義されていない場合、PhysBone は使用すべき更新タイミングを自動的に判断しようとします。

Dynamic Boneの自動変換

note

ワールド内のDynamic Boneコンポーネントは、自動的にPhysBonesへ変換されることはありません。パフォーマンスを向上させ、プレイヤーがPhysBonesを掴んでインタラクションできるようにするため、PhysBonesの使用を推奨します。

VRChatクライアントは、アバターが読み込まれる際に、そのアバター上のDynamic Boneを常に自動でPhysBonesへと変換します。これは全体的なパフォーマンスを向上させるためであり、アバター間のインタラクションのためにも必要です。

Dynamic Boneの変換では、デフォルトでAdvancedモードが使用されます。これは、Advanced統合メソッドを用いることでDynamic Boneの挙動をより正確に再現できるためです。また、DB変換のMulti-ChildタイプにはIgnoreが使用されます。これにより、特殊なケースのDynamic Bone設定で問題が発生する可能性がありますが、FirstやAverageを使用すると、変換中にほぼすべての場合で望ましくない挙動を引き起こします。

Dynamic BoneとPhysBonesは同一ではないことに注意してください。 プログラム内での変換プロセスは可能な限り挙動を一致させるよう努めますが、決して完璧ではありません!自動変換の目的は、ほとんどの設定をうまく機能させて破綻させないことであり、挙動を完全に再現することではありません。VRChat向けのアバターを作成するすべてのユーザーは、Dynamic BoneではなくPhysBonesへ完全に移行しているものと想定されています。

Dynamic Boneの手動変換

SDKを使用して、アバターをDynamic BoneからPhysBonesへ手動で変換することも可能です。

このプロセスではアバターから以前のDynamic Boneコンポーネントが削除されるため、簡単には元に戻せません。そのため、変換を試みる前にアバターのバックアップを作成してください。

このツールには、SDKのBuild Control Panelからアクセスするか、Unityメニューの VRChat SDK/Utilities/Convert DynamicBones to PhysBones からアクセスできます。これを行うには、あらかじめアバターを選択しておく必要があります。

移行されないDynamic Boneコンポーネント

Dynamic Boneの一部の機能や挙動はPhysBonesに存在しないため、移行されません。

Force - Dynamic Boneの Gravity および Force の値は、PhysBonesに相当する機能がないため無視されます。

Dynamic Boneの非推奨化

アバターのコンテキストにおいて、Dynamic BoneはVRChatから完全に削除されました。つまり、Dynamic Boneを使用し続けているすべてのアバターは、現在自動生成されたPhysBonesを使用することになります。

Dynamic Boneは現在ワールド内ではまだ使用可能ですが、将来的にアバターと同様の方法で、ワールド読み込み時に自動的にPhysBonesへ変換する形で非推奨となる可能性があります。

最終更新: