Javascript 基于边界球的碰撞检测
对于每个网格(Javascript 基于边界球的碰撞检测,javascript,three.js,collision-detection,bounding-volume,Javascript,Three.js,Collision Detection,Bounding Volume,对于每个网格(THREE.Object3D),THREE.js提供了一个非常方便的属性-boundingSphere和boundingSphere,它们具有IntersectionSphere和isIntersectionBox方法 有了这些,我想我可以使用它来进行简单的碰撞检测,但当我尝试时,冲突似乎一直在发生,因为(我尝试了boundingSphere)boundingSphere.center始终位于(0,0,0)因此,如果我想检查两个网格之间的碰撞,我应该为每个对象克隆boundingS
THREE.Object3D
),THREE.js提供了一个非常方便的属性-boundingSphere
和boundingSphere
,它们具有IntersectionSphere
和isIntersectionBox
方法
有了这些,我想我可以使用它来进行简单的碰撞检测,但当我尝试时,冲突似乎一直在发生,因为(我尝试了boundingSphere
)boundingSphere.center始终位于(0,0,0)
因此,如果我想检查两个网格之间的碰撞,我应该为每个对象克隆boundingSphere
对象,然后获取它的世界坐标,然后才使用intersectsSphere
大概是这样的:
var bs = component.object.geometry.boundingSphere.clone();
bs.center.setFromMatrixPosition(component.object.matrixWorld);
...
if (_bs.intersectsSphere(bs)){
是这样使用的,还是我遗漏了什么,还有更方便的基于boundingBox/boundingSphere的碰撞检测方法?如果要使用边界框进行碰撞检测,需要世界坐标系中的框。网格的
相交球体
和isIntersectionBox
属性中的边界体积位于对象的局部坐标系中
您可以像以前那样操作:克隆卷并将其移动到世界坐标系中的正确位置,这是一个很好的解决方案
否则,也可以从网格中设置新长方体,并使用这些长方体进行碰撞。假设您有一个名为Mesh
的THREE.Mesh,那么您可以执行以下操作:
sphere = new THREE.Sphere.setFromPoints( mesh.vertices );
box = new THREE.Box3.setFromObject( mesh );
一点小费。在开发过程中,可以很好地看到场景中的边界框,为此,您可以使用:
如果要使用边界框执行碰撞检测,则需要世界坐标系中的框。网格的相交球体
和isIntersectionBox
属性中的边界体积位于对象的局部坐标系中
您可以像以前那样操作:克隆卷并将其移动到世界坐标系中的正确位置,这是一个很好的解决方案
否则,也可以从网格中设置新长方体,并使用这些长方体进行碰撞。假设您有一个名为Mesh
的THREE.Mesh,那么您可以执行以下操作:
sphere = new THREE.Sphere.setFromPoints( mesh.vertices );
box = new THREE.Box3.setFromObject( mesh );
一点小费。在开发过程中,可以很好地看到场景中的边界框,为此,您可以使用:
但是为什么相交球体中的坐标是局部坐标?这使得isIntersectionBox
毫无用处,除非有人想检查与本地对象的交集…@SET这可能是一个很好的理由。就像我说的,要得到世界坐标系中某个物体的边界框,只需执行box=new THREE.Box3.setFromObject(mesh)代码>。这也是我的答案。我想说它包含了您所需要的一切……但是为什么intersectsSphere
中的坐标是局部坐标呢?这使得isIntersectionBox
毫无用处,除非有人想检查与本地对象的交集…@SET这可能是一个很好的理由。就像我说的,要得到世界坐标系中某个物体的边界框,只需执行box=new THREE.Box3.setFromObject(mesh)代码>。这也是我的答案。我想说它包含了你所需要的一切。。。