13.Mesh切割原理分析
对ezy-slice源码的分析
参考:
https://github.com/DavidArayan/ezy-slice
https://blog.csdn.net/llsansun/article/details/114984084

Mesh切割需要解决哪几个问题?
1.如何确定一个平面?
2.如何判断点在平面的上方 还是下方?
3.如何确定三角面与切面的交点?
4.切割后新的面是什么?
1.如何确定一个平面?
法线向量norm + 原点到面的距离 dist = |OX| (与法线向量同向为正)
法线向量垂直于平面, 法线向量相同的面互相平行

1.法线向量+平面上的一个点P
法线norm已知, 求原点到面的距离

原点到面的距离 = OP在法线上的投影
由于norm长度为1, 在公式中直接化简掉了。
m_dist = |OP| * cosθ = norm * OP
2,平面上的三个点 (不共线)
三个点->两个向量ab, ac
ab叉乘ab->面的法线向量
再由其中一个点 和 法线 得出距离
2.如何判断点P在平面的上方 还是下方?
计算OP法线上的投影 = dp = Vector3.Dot(m_normal, pt)
如果dp > dist ,在上方,反之在下方
Epsilon 为0.0001, 如果两者相差不超过Epsilon,则判定点在面上。
3.如何确定三角面与切面的交点?
先将问题分解为, 如何确定AB线段与平面的交点x

计算出AX和AB的比例即可推出点X

|AB'| = 向量BA法线上的投影 (后面简称投影)
= Vector3.Dot(normal, BA) = - Vector3.Dot(normal, AB)
|AX'|= XA投影 = OA投影 - OX投影
= Vector3.Dot(normal, OA)) - Vector3.Dot(normal, OX))
= Vector3.Dot(normal, OA) - m_dist
t = |AX'| /|AB'| = (Vector3.Dot(normal, OA) - m_dist) / (- Vector3.Dot(normal, AB))
= (m_dist - Vector3.Dot(normal, OA) ) / Vector3.Dot(normal, AB)
以上是BA与法线同向的情况, 如果是反向的情况, |AX'| |AB'|两个值同时取反, 则刚好抵消
计算切点q的代码 :
切割后新的面?
得知三角面的切点后, 便可以将mesh分为上下两个部分.
切割分两种大情况 , 一是切割两条边, 二是只切割一条边
两条边: 可以是a+b,b+c,c+a , 有3种情况
一条边: 可以是a,b,c , 也有3种情况
所以一共是有6种情况

见ezy-slice源码的Intersect.Intersect()
先是获取三个点与平面的位置关系
进行各种情况的穷举
排除三个点同方位的情况
排除两个点都处于ON的情况
排除一点在ON,其他两点同方位的情况
切割一条边的情况
切割两条边的情况
其他
使用ezy-slice切割的示例
UV的部分还过于复杂...