位置: 首页 > 动态 > 正文

13.Mesh切割原理分析

2023-05-03 02:00:13 来源:哔哩哔哩

对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的部分还过于复杂...

关键词:

上一篇:陆婷婷宋晓义 环球今日讯
下一篇:最后一页