接触のブロック
このモジュールは、VRSharedサンプル で利用可能なハードウェアグラビングシステムを拡張し、サーフェスがペンなどの一部のオブジェクトをブロックしながら、それを掴む手もブロックできるようにします。
接触ロジック
BlockableTip
コンポーネントは、補間ターゲットの階層に存在することが期待される子トランスフォームである tip
を含んでおり、オブジェクトの位置の実際の先端(ブロッキング「ポイント」)を決定します。
BlockableTip
コンポーネントは、blockingLayers
マスク内のレイヤーを持つオブジェクトとのトリガー接触を検知し、BlockingSurface
コンポーネントを持つオブジェクトに対して機能します。
ここから、実際のサーフェスとの接触は、検出されたサーフェスの基準系における tip
のローカル座標により IsInContact
で確認されます。
BlockingSurface
のpositiveProximityThresholds
およびnegativeProximityThresholds
は、接触が有効となる条件を決定します。x
とy
の値はサーフェスのサイズを定義し、z
の値は接触の許容深さを定義します(ブロッキング効果はサーフェスのz
軸に沿って発生します)。BlockingSurface
の最大深さは、tip
(および掴む手)がブロックされるべきz
深さを決定します。
ティップと手のブロッキング
ブロッキング自体は FixContactPosition()
メソッド内で行われます。このコンポーネントは、深さ制約が遵守されるように、ティップのターゲット z
位置を定義します。
次に、実際の BlockableTip
ゲームオブジェクトの位置を決定し、ティップがこのターゲット位置に最終的に到達するようにします。
そして、最終的に、掴むための初期位置が守られるように手が移動されます。
Render()
と FixedUpdateNetwork()
のタイミングでは、移動の計算が異なることに注意してください。
Render()
の際には、補間ターゲットが移動します。ティップが補間ターゲットの一部であるため、計算は比較的単純です。FixedUpdateNetwork()
では、実際のオブジェクトが移動します(オプションchangeActualPosition
が true に設定されている場合)。そのため、最初にオブジェクト階層内でのティップの実際の位置を見つける必要があります。
デモ
デモシーンはAssets\Photon\FusionAddons\BlockingContact\Demo\Scenes\
フォルダにあります。
シーンには、BlockingSurface
コンポーネントを持つサーフェスと、BlockableTip
を持つグラブルペンが含まれています。このデモシーンでは、ペンは意図的に機能しないことに注意してください。
ダウンロード
こちらのアドオン最新バージョンはaddon projectにあります。
サポートされているトポロジ
- shared mode
Changelog
- Version 1.0.3: Improve demo scene
- Version 1.0.2: Fix because of feedback namespace modification
- Version 1.0.1: Add demo scene + add verification in BlockingContact to avoid error if feedback is not defined + add namespace
- Version 1.0.0: First release