欢迎光临散文网 会员登陆 & 注册

13.Mesh切割原理分析

2023-05-03 01:25 作者:机智的小草yns  | 我要投稿

对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已知, 求原点到面的距离


Dot公式

原点到面的距离 =  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的部分还过于复杂...



13.Mesh切割原理分析的评论 (共 条)

分享到微博请遵守国家法律