Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于边界球的碰撞检测_Javascript_Three.js_Collision Detection_Bounding Volume - Fatal编程技术网

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)。这也是我的答案。我想说它包含了你所需要的一切。。。