Javascript 如何使用树状数据结构提高复杂几何体上的碰撞检测性能?
我已经构建了一个类似的VR应用程序,它允许使用VR控制器与许多3d对象交互。这意味着用户可以用VR控制器抓取一个对象,并可以移动或缩放它 在我的应用程序中,碰撞检测机制可以找到用户当前使用VR控制器触摸的正确的Javascript 如何使用树状数据结构提高复杂几何体上的碰撞检测性能?,javascript,three.js,binary-search-tree,collision-detection,Javascript,Three.js,Binary Search Tree,Collision Detection,我已经构建了一个类似的VR应用程序,它允许使用VR控制器与许多3d对象交互。这意味着用户可以用VR控制器抓取一个对象,并可以移动或缩放它 在我的应用程序中,碰撞检测机制可以找到用户当前使用VR控制器触摸的正确的THREE.Mesh对象。首先,它迭代场景中的所有3d对象,将其边界球体与控制器的边界球体进行比较。然后用THREE.Raycaster测试重叠对象,以找到合适的对象。我在每个VR控制器上设置了三个3.Ray对象来实现这一点 问题:当场景中存在复杂的3d对象时,即三个网格对象具有大量顶点的
THREE.Mesh
对象。首先,它迭代场景中的所有3d对象,将其边界球体与控制器的边界球体进行比较。然后用THREE.Raycaster
测试重叠对象,以找到合适的对象。我在每个VR控制器上设置了三个3.Ray
对象来实现这一点
问题:当场景中存在复杂的3d对象时,即三个网格
对象具有大量顶点的几何体,则碰撞检测期间的光线投射会变得非常缓慢。因此,我的问题不是场景中3d对象的数量,而是一个对象几何体的复杂性
我一直在寻找一种方法,将对象的几何体拆分为一组边界框,并引用包含的顶点。这将允许首先测试箱子。包含的顶点可用于随后的光线投射
有用于快速空间搜索的树数据结构,例如或。我发现它允许将几何体分割成更小的块,但它似乎有点过时了(Three.js r60)
我的问题:有人知道比我目前的光线投射碰撞检测方法更好的解决方案吗?是否有一种方法可以在Three.js中构建复杂的几何体拆分,以实现更快的碰撞检测?如果没有,那么在未来的Three.js版本中,使用这样的内部几何体分解以允许更快的搜索可能会有所帮助。八叉树是我个人为这些需要加速复杂网格光线投射的问题找到的最简单的解决方案。一些替代方案是BVH、K-D树和R-树 可以为每个非平凡网格存储单独的八叉树,这样就不必为整个场景更新八叉树。此外,如果您的对象只是被变换,而不是变形,那么您甚至不需要更新存储在网格中的八叉树。在测试与八叉树中的AABBs的交点之前,可以使用对象的变换矩阵的逆变换光线 我还按照您之前提出的方法分割了跨越数百万个多边形和顶点的网格,使用了从k均值聚类到八叉树(使用它们确定分割而不是加速空间查询)到基于连通性/邻接数据分割网格的多种技术。也就是说,我这样做是为了减少网格遍历、渲染时的缓存未命中,并允许“子网格LOD”的本地化形式。对于拾取、光线投射和碰撞检测,我建议使用八叉树或BVH等空间索引,这样就不必测试每个三角形,例如