我希望能够找到一个三角形是否在碰撞所有的球,在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