以下代码实现了判断线段和三角形是否相交的算法:
bool line_tri_intersection(vec3 p0, vec3 p1, vec3 v0, vec3 v1, vec3 v2)
{
vec3 u, v, n; // v0,v1,v2构成的平面的法向量,线段p0-p1的方向向量
vec3 dir, w0, w; // 平面上一点v0,线段起点到v0的向量,平面上线段与v0的交点
float r, a, b; // 线段与平面相交的参数r,平面上交点w的坐标a,b
u = v1 - v0;
v = v2 - v0;
n = cross(u, v);
if (length(n) < EPSILON) return false; // 三点共线
dir = p1 - p0;
w0 = p0 - v0;
a = -dot(n, w0);
b = dot(n, dir);
if (fabs(b) < EPSILON) {
if (a == 0) return true; // 线段与平面重合
else return false; // 线段平行于平面
}
r = a / b;
if (r < 0 || r > 1) return false; // 线段参数r不在[0,1]范围内
w = p0 + r * dir; // 线段与平面的交点
if (w.x < min(v0.x, v1.x, v2.x) || w.x > max(v0.x, v1.x, v2.x)) return false; // 交点不在三角形内
if (w.y < min(v0.y, v1.y, v2.y) || w.y > max(v0.y, v1.y, v2.y)) return false; // 交点不在三角形内
if (w.z < min(v0.z, v1.z, v