unity 网格切割

来源:互联网 发布:java框架cs通讯 编辑:程序博客网 时间:2024/05/17 09:30

      前一节讲到了如何绘制一个多变形网格。还是先给大家看效果图,博客的结尾最后贴出工具类。效果图如下:


大家看到的我用三种不同方向的切割方式,得出不同的子图和原图比较。下面具体分析其原理,给出分析图。


  先看这样一张图,我们黑色数字标记的是顶点的添加顺序,我前面说了我们统一讲顶点的顺序改成顺时针(如果是添加顺序为逆时针,我们将它数组倒置即可)白色的点为横着的一条线和改图形产生的交点,交点的计算采用2条线段的交点的算法(我们可以先把他们当成直线来计算,求得交点再来判断交点是否在线段内,如果2条直线平行,那么,我们是另做判断的。)求得交点后,同时交点存储了该交点前一个点和后一个点的信息,例如0号交点它的前一个点是6后一个点是0(我们这里采用顺时针来计算的),依次类推1号交点前一个点为0后一个点1后面的就不说了(这里面同时还有一些特殊情况,例如我们线段可能切到顶点了,例如如果我们的直线是0_6这条直线,那么切到的就是0,和6这两个点,对于0号交点那么我们定义其他的前一个点和后一个点为0,同时后面那个就都是6了)现在我们首先从0交点的后一个点访问,直到到1号交点的前一个点,这中间只有一个点,那就是0号节点,我们获得这一组点了,接下来我们开始找1号交点和2号交点之间的点了,我们又获得一组点(很显然的问题是,我们不应该把它绘制出来,这里是否绘制判断还是判断一组点的顺序,前面哪一组的顺序为顺时针,而这一组的顺序为逆时针,我们不予绘制)那最后就是访问2号交点和3号交点中间的点,方法都类似。我们还是找到了2,3,4号节点,同样这5个点的顺序是顺时针的,同样我们也需要将他们绘制出来了,最后就剩下了最大的一块了,就是我们统计切出去的部分,我们还是采用一种简单的办法,就是如果切出去的我们用一个标记数组,我们将它标记为true,我们最后一组还是从0号节点开始(而不是从交点开始数了),0号节点的mark[0]是·true了,我们不应该添加进来,然后我们知道0号节点是0号交点的后一个点,如果满足这个情况的话,我们把交点添加进来。(我们遍历所有的交点,判断是否有交点的后一个点是该节点,如果是就添加,不是的话就继续,当然这也不是完全对的,我们漏了一种情况,就是假如0号交点他的前一个点和后一个点都是0号节点,这时我们不予添加),访问完0号节点,接着访问1号节点,1号节点是2号交点的后一个点,我们添加进来,接着就访问2,3节点,这2个节点都不是所有交点的后一个点,接着访问4号节点,4号节点是3号交点的后一个点,我们应该把它添加到数组中来。知道0号交点添加进来,这所有的点都添加完了,然后根据所得到的数组进行绘制就可以了,说到这里我们是不是该结束了,然而并不是这样的,我们思维仿佛进入了一个误区,觉得理所当然的事情了。我们进入了我们人的思维,就比如说,上图左边的图,我们点的添加顺序依旧是顺时针,当我们从0号交点到1号交点一次遍历访问其他在其中间的点是,我们找到了1,2,3,4个节点,按理说我们确实该添加进来,但是按照人的思维,它添加进来很显然就是错误的,当我们的交点访问找其中间的节点是,我们访问到了其他的交点,就例如说我们访问0,1交点是,我们经过了3,2这2个交点,面对这种情况,我们的做法是我们改从由1号交点到0号交点开始访问即可,同样我们访问1,2号交点和2,3号交点时也会出现这种情况,下节讲一下具体这么使用该工具类,并贴出源码。







0 0
原创粉丝点击