2015-12-02 51 views
0

我希望能够找到一个三角形是否在碰撞所有的球,在three.js所检测领域和三角形之间的碰撞在three.js所

我已经实现并采用raycaster和球体的顶点的方法,但它并不总是工作,因为三角形可能在球体顶点之间“2”之间,因此不能被检测到。

我想要一个完美的数学算法。

回答

1

嘿,我已经找到了解决办法:

算法在2阶段工作:

1期

创建3升INES使用3点我已经从三角形:

var line1 = new THREE.Line3(a,b); 
var line2 = new THREE.Line3(a,c); 
var line3 = new THREE.Line3(b,c); 

then I find the closest point from each of these 3 lines, to the center of the sphere : 

var closestPoint1 = line1.closestPointToPoint(center, true); 
var closestPoint2 = line2.closestPointToPoint(center, true); 
var closestPoint3 = line3.closestPointToPoint(center, true); 

then I calculate the distance of that point to the center : 

// code for 1 line only 

var distToCenter = closestPoint.distanceTo(center); 
if(distToCenter <= radius){ 
    // we have a collision 
} 

,这就是它的三角线。使用3点SOF三角形

阶段2

我创建THREE.Triangle,然后I:如果没有线与球体相交,我将检查三角形的“体”,在第2阶段用这个三角形创建一个平面,最后我找到距离球体中心最近的点。如果该点“属于”的三角形,我们有一个碰撞:

var triangle = new THREE.Triangle(a,b,c); 
var plane = triangle.plane(); 
var pp, cp; 

var dp = Math.abs(plane.distanceToPoint(center)); 

if(dp <= radius){ 
    pp = plane.projectPoint(center); 
    cp = triangle.containsPoint(pp); 

    if(cp === true){ 
     // collision 
    } 
} 

如果检测到不碰撞既不阶段1或阶段2,该三角形不与球碰撞。

我的解决方案在我的项目中工作完美。

请告知您可能遇到的问题。