3D模型三角面片相交检测



图片是做的一些测试结果(相交面为红色标记的三角面)

感谢CSDN社区的冯玮提供的基础技术支持。相关链接

对空间中三角面的相交检测,基本思路是怎样确定,两个空间三角形,各个顶点间的关系。为了找到切入点,将问题转述为三角形与包含另一个Triangle所在的平面之间的关系。
要判断三角形与平面的关系,可以通过顶点与平面的关系来区分不同的情况,分别进行处理。
给定空间四个点:a(ax,ay,az),b=(bx,by,bz),c=(cx,cy,cz),d=(dx,dy,dz),定义行列式如下:

//线性变换
通过计算行列式的值来判断点与面的关系,行列式的值>0是在平面法向正方向的一侧,<0在平面的另一侧,=0则表示在平面上。
如此通过计算三顶点与平面的位置关系可以将空间中三角形与平面的关系粗分为三种,在平面上(行列式的值全 > 0),在平面下(行列式的值全 < 0),与平面有关联(行列式的值有异号)。

//思维导图
这样可以知道两三角面相交,只在满足“与平面有关联”的条件下。
在“有关联的条件下”,又存在“分居两侧”、“一点在面上”、“与平面重合(同一平面)”、“一边在面上的情况”(这里我们暂且先把一边在面上的情况归并到分居两侧的情况)。
一、针对“一点在面上”的情况,进行点在三角形内的判断(包含点在边上,点与顶点重合的情况(对3D模型上三角面的处理,要对这两种情况给出处理方法))
给出两种方法处理判断“点在三角形内”的情况
1.同向法(点与三边的关系)
2.重心法(向量法)
具体参考:这里

二、针对“同一平面”的情况,进行线段相交的检测,及完全重合情况的处理
空间中线段相交的处理,与平面上的线段相交处理没有关系。
1、做三个坐标面的投影,利用叉积去进行判断
2、可以进行坐标的仿射变换代替针对要做坐标面的投影,即平面的旋转(没有实现,有经验的话,望联系)

三、针对“分居两侧”的情况,上述参考博客的情况中,有些情况未能处理(未能检测面片(精度的问题?)文件会附文末github地址中)
1、采用上述博文中提到的方法
2、采用直线与平面的交点,判断交点是否在线段上、三角形内

上面简述了,空间中任意两个三角面的相交判定,针对3D模型并未涉及。因为3D模型中面与面间存在的大量相邻关系。就要针对这些情况写出处理方法。
首先针对“一点在面上”的情况,讨论了点在边上,点与其中的一个顶点重合的情况。这两种情况应做return NONINTERSECT;其他的都是一些细节编码。

相关参考文件地址


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM