我希望能夠找到一個三角形是否在碰撞所有的球,在three.js所檢測領域和三角形之間的碰撞在three.js所
我已經實現並採用raycaster和球體的頂點的方法,但它並不總是工作,因爲三角形可能在球體頂點之間「2」之間,因此不能被檢測到。
我想要一個完美的數學算法。
我希望能夠找到一個三角形是否在碰撞所有的球,在three.js所檢測領域和三角形之間的碰撞在three.js所
我已經實現並採用raycaster和球體的頂點的方法,但它並不總是工作,因爲三角形可能在球體頂點之間「2」之間,因此不能被檢測到。
我想要一個完美的數學算法。
嘿,我已經找到了解決辦法:
算法在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,該三角形不與球碰撞。
我的解決方案在我的項目中工作完美。
請告知您可能遇到的問題。
而不是一個完美的數學算法,我可以推薦你在看下面的頁面中,據我瞭解它正好覆蓋您的問題:Three.js - Accurate ray casting for collision detection