VRコントローラを使用して多数の3Dオブジェクトとやり取りすることを可能にするWebVR-Vive-Draggingに似たVRアプリケーションを構築しました。これは、ユーザーがVRコントローラでオブジェクトをつかんで、移動または拡大縮小できることを意味します。ツリー構造を使用して複雑なジオメトリの衝突検出性能を向上させるにはどうすればよいですか?
私のアプリケーションでは、衝突検出メカニズムは、ユーザーが現在VRコントローラでタッチしている正しいTHREE.Mesh
オブジェクトを検出します。最初は、シーン内のすべての3Dオブジェクトを反復処理し、境界球とコントローラの境界球を比較します。重複するオブジェクトは、適切なオブジェクトを見つけるためにTHREE.Raycaster
でテストされます。これを実現するために各VRコントローラに3つのTHREE.Ray
オブジェクトをセットアップしました。
問題:複雑な3Dオブジェクトがシーン内に存在する頂点の非常に大きな数の幾何学的形状を有する、すなわちTHREE.Mesh
オブジェクトは、次いで、衝突検出時のレイキャスティングが非常に遅くなります。したがって、私の問題は、シーン内の3Dオブジェクトの数ではなく、1つのオブジェクトのジオメトリの複雑さです。
オブジェクトのジオメトリを、含まれている頂点を参照して一連の境界ボックスに分割する方法を探しました。これにより、ボックスを最初にテストすることができます。その後、含まれている頂点をレイキャスティングに使用することができます。
OctreeまたはR-Treeなど、高速空間検索のためのツリーデータ構造があります。私はthreeocttreeがジオメトリをより小さなチャンクに分割することを可能にしていますが、これは古くなっているようです(Three.js r60)。
私の質問:誰でも、私の現在のレイキャスティングの衝突検出アプローチよりも良い解決法を知っていますか?より速い衝突検出を実現するために、Three.jsで複雑なジオメトリ分割を構築する方法はありますか?そうでない場合は、将来のThree.jsバージョンで、より高速な検索を可能にするような内部ジオメトリ分解を行うことが役立つ可能性があります。