2015-12-02 88 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,該三角形不與球碰撞。

我的解決方案在我的項目中工作完美。

請告知您可能遇到的問題。