接触のブロック
このモジュールは、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