13.Mesh切割原理分析
對(duì)ezy-slice源碼的分析
參考:
https://github.com/DavidArayan/ezy-slice
https://blog.csdn.net/llsansun/article/details/114984084

Mesh切割需要解決哪幾個(gè)問(wèn)題?
1.如何確定一個(gè)平面?
2.如何判斷點(diǎn)在平面的上方 還是下方?
3.如何確定三角面與切面的交點(diǎn)?
4.切割后新的面是什么?
1.如何確定一個(gè)平面?
法線向量norm + 原點(diǎn)到面的距離 dist = |OX| (與法線向量同向?yàn)檎?br>
法線向量垂直于平面, 法線向量相同的面互相平行

1.法線向量+平面上的一個(gè)點(diǎn)P
法線norm已知, 求原點(diǎn)到面的距離

原點(diǎn)到面的距離 =? OP在法線上的投影
由于norm長(zhǎng)度為1, 在公式中直接化簡(jiǎn)掉了。
m_dist =? |OP| *? cosθ = norm * OP
2,平面上的三個(gè)點(diǎn) (不共線)
三個(gè)點(diǎn)->兩個(gè)向量ab, ac
ab叉乘ab->面的法線向量???
再由其中一個(gè)點(diǎn) 和 法線 得出距離
2.如何判斷點(diǎn)P在平面的上方 還是下方?
計(jì)算OP法線上的投影 = dp =?Vector3.Dot(m_normal, pt)
如果dp > dist ,在上方,反之在下方
Epsilon 為0.0001, 如果兩者相差不超過(guò)Epsilon,則判定點(diǎn)在面上。
3.如何確定三角面與切面的交點(diǎn)?
先將問(wèn)題分解為, 如何確定AB線段與平面的交點(diǎn)x

計(jì)算出AX和AB的比例即可推出點(diǎn)X

|AB'| = 向量BA法線上的投影 (后面簡(jiǎn)稱投影)
? ? ? ?=? 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'|兩個(gè)值同時(shí)取反, 則剛好抵消
計(jì)算切點(diǎn)q的代碼 :
切割后新的面?
得知三角面的切點(diǎn)后, 便可以將mesh分為上下兩個(gè)部分.
切割分兩種大情況 , 一是切割兩條邊, 二是只切割一條邊
兩條邊: 可以是a+b,b+c,c+a , 有3種情況
一條邊: 可以是a,b,c ,? 也有3種情況
所以一共是有6種情況

見(jiàn)ezy-slice源碼的Intersect.Intersect()
先是獲取三個(gè)點(diǎn)與平面的位置關(guān)系
進(jìn)行各種情況的窮舉
排除三個(gè)點(diǎn)同方位的情況
排除兩個(gè)點(diǎn)都處于ON的情況
排除一點(diǎn)在ON,其他兩點(diǎn)同方位的情況
切割一條邊的情況
切割兩條邊的情況
其他
使用ezy-slice切割的示例
UV的部分還過(guò)于復(fù)雜...