三维空间中三角面片碰撞检测TTI
空间中三角面片碰撞检测,本质上是检测其中一个三角形面片的边是否与另一个三角形面片发生碰撞——即线段与三角形面片碰撞(三角形1与三角形2以及三角形2与三角形1)。
相关代码打包:三角形碰撞检测TTI.zip
采用符号标记为:三角形t1(p1,p2,p3)与t2(p4,p5,p6)以及分别所在平面f1,f2。线段与平面交点p
首先,转换成线段所在直线与三角形面片所在平面的碰撞检测,当直线
因此,碰撞检测可以分为如下几种情况:
- 线段与平面平行,但不在平面内
- 线段与平面平行,且在平面内
- 线段与平面不平行,存在交点
1.线段与平面平行,但不在平面内

如上图所示,显而易见该线段与平面无交点,舍弃
2.线段与平面平行,但在平面内

如上图所示,当线段在三角形t1所在平面f1内,分为三种情况处理
- 线段与三角形面片无交点,舍弃
- 线段一个端点在三角形面片内,面片相交
- 线段两个端点都在三角形面片内,面片相交
3.线段与平面不平行,存在交点
对于线段与平面相交,采用如下流程判断:
按照上图流程图所示,对于空间中与平面发生相交的线段,首先求得交点p是否在线段内(包含端点),若不在,则返回无交点。若在,则继续判断交点p是否在三角形面片内(不包含边界),若不在则返回无交点,否则,存在交点。
如图所示,对于线段2,交点p2不在三角形面片内,因此无交点;对于线段3,交点p3不在线段内部,因此也无交点。
测试结果
sphere.m模型,无交点
test.m测试模型,存在交点。
部分函数代码
- 直线与平面交点,p1,p2,p3表示平面三点,p4,p5表示直线两点,p返回交点
int ESLib::getLinePlaneIntersection(CPoint p1, CPoint p2, CPoint p3, CPoint p4, CPoint p5, CPoint& p)
{
double a, b, c, d, t;
// 线段方向向量
CPoint n_line = p4 - p5;
CPoint n1 = p2 - p1;
CPoint n2 = p3 - p1;
CPoint n = n1 ^ n2;
a = n[0];
b = n[1];
c = n[2];
d = 0 - (a * p1[0] + b * p1[1] + c * p1[2]);
//std::cout << "plane: " << a << " " << b << " " << c << " " << d << std::endl;
//std::cout << "li