对ezy-slice源码的分析
参考:
https://github.com/DavidArayan/ezy-slice
(相关资料图)
https://blog.csdn.net/llsansun/article/details/114984084
Mesh切割需要解决哪几个问题?
1.如何确定一个平面?
2.如何判断点在平面的上方 还是下方?
3.如何确定三角面与切面的交点?
4.切割后新的面是什么?
1.如何确定一个平面?
法线向量 + 面与原点的距离dist = |OX|
法线向量垂直于平面, 法线向量相同的面互相平行
1,法线向量+平面上的一个点P
法线已知, 求距离
原点到面的距离=|OP'| =OP在法线上的投影
2,平面上的三个点 (不共线)
三个点->两个向量ab, ac
ab叉乘ab->面的法线向量
再由其中一个点 和 法线 得出距离
2.如何判断点P在平面的上方 还是下方?
计算OP法线上的投影 = dp如果dp > dist ,在上方 反之在下方
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切割的示例
UV的部分还过于复杂...
关键词: