空间线段与三角网格交点求解思路:
1.空间线段和三角面片求交点的思路是先用线段的向量和三角形所在平面的法矢点乘求解是否和面片平行,需要排除线段所在直线和三角形所在平面平行的情况。
2.其实只要两者不平行,直线三角形所在面片的平面肯定会有交点,所以这边需要判断交点是否在线段上。
3.最后还得判断算出来的交点是否落在三角平面的内部,这边可以用面积法或者向量法求解。
情况一,直线和三角形平行或者共面的情况

情况二,直线和平面相交,交点M在直线和平面上,但是并不在线段上

情况三,线段和平面相交,交点M在线段和平面上,但是并不在三角形内部

情况四,线段和平面相交,交点M在线段和平面上,并在三角形内部

附上代码:
bool intersectSegmentTriangle(vec sp, vec sq, vec a, vec b, vec c, float t)
{
vec qp = sp - sq;
vec ab = b - a;
vec ac = c - a;
vec norm = ab CROSS ac;
float d = qp DOT norm;
if (d==0.0f)
{
return false;
}
if (d>0)
{
vec ap = sp - a;
t = ap DOT norm;
if (t < 0.0f)
{
return false;
}
if (t > d)
{
return false;
}
vec e = qp CROSS ap;
float v = ac DOT e;
if (v<0.0f || v>d)
{
return false;
}
float w = -1 * (ab DOT e);
if (w<0.0f || v + w>d)
{
return false;
}
}
else
{
vec ap = sp - a;
t =-( ap DOT norm);
if (t < 0.0f)
{
return false;
}
if (t > -d)
{
return false;
}
vec e = qp CROSS ap;
float v = -(ac DOT e);
if (v<0.0f || v>-d)
{
return false;
}
float w = 1 * (ab DOT e);
if (w<0.0f || v + w>-d)
{
return false;
}
d = -d;
}
t /= d;
float x = sp[0] + t*(sq[0]- sp[0]);
float y = sp[1] + t*(sq[1] - sp[1]);
float z = sp[2] + t*(sq[2] - sp[2]);
saveIntersectPlane.push_back(vec(x, y, z));
return true;
}
最后附上测试之后的案例:效果还是挺鲁棒,交点确实都找到了
