![uv重叠(uv overlap)_第1张图片](http1://img.it610.com/image/product/b7abdc2bb93b491eab28a30c7623f778.jpg)
两年多前我需要解决uv重叠的问题,当时觉得是一个挺有挑战的问题,很兴奋。
为什么兴奋?因为对于当时的我来说还是很难实现的,第一眼看到这个问题,就不停的问自己这么解决。
当然第一步就是分析uv,uv是模型的2d投影,它只是一堆2d数据,不像多边形有线、面,最多只有点而已。所以一开始看上面的图时没任何思绪。
那我们换一种视觉显示
![uv重叠(uv overlap)_第2张图片](http1://img.it610.com/image/product/5f19f8fa44bc47bea4cd5a8359929333.jpg)
第一眼的差距只是没了填充色而已,再分析,如果我们假设它有边,就像上面显示的一样,那我们就能发现有两个相交点
![uv重叠(uv overlap)_第3张图片](http1://img.it610.com/image/product/e3cdffe64a32476da29793097b69000a.jpg)
这意味着如果我们能找到一个交点,那它就是重叠的,继续分析,如果我们把这几条边独立出来
![uv重叠(uv overlap)_第4张图片](http1://img.it610.com/image/product/47333b217e2341c29b65477b6a2abee9.jpg)
这就清晰多了,我们可以看到P0P1分别跟PSP2、PSP3都有一个交点,而P0P1、PSP2、PSP3都是线段,于是我的出了解决方案:判断两条线段是否相交的算法,就是我解决这个问题的算法。于是马上问google,然后开始写代码。
但是这真的就这么简单吗?
当我实现了判断两条线段是否相交的算法后,发现没这么简单。
我们先来看最简单的四边面
![uv重叠(uv overlap)_第5张图片](http1://img.it610.com/image/product/579ed787960f426bb06671f6e143cfc8.jpg)
如果我们对它使用判断两条线段是否相交的算法,就会得到所有4个点
![uv重叠(uv overlap)_第6张图片](http1://img.it610.com/image/product/4d3af505283b4ece9d0ece53b0325e9f.jpg)
这很明显不是我需要的结果,我需要的结果应该是这样的
![uv重叠(uv overlap)_第7张图片](http1://img.it610.com/image/product/8a50575fdd7d40c3b2afe908a2f3e9ee.jpg)
所以我还需要去解决除去共同点边的问题,如果两条边有一个共同点就应该忽略。具体怎么实现的我已经不记得了,因为当我完成了之后做了点测试发现能正常工作就提交了。直到好几个月后一同事跟我说还是有共同点边的问题的bug存在,他还对我说要么我修复这个bug,要么去把maya提供的插件范例里面的一个插件用python API重写一遍(这个范例是C++写的,因为他看不懂Maya API,可是他却知道里面有个做类似的事情的范例,我至今也不知道他是怎么知道的),我果断的把那个范例用python API写了一遍,而且使用的是C++的代码模式。问题解决。
(为什么要用C++的代码模式,我的理由有两个,第一是大部分的代码都是直接搬过来,为了防止出现隐藏的bug,以及加快代码写编写速度;第二是为了方便同事学习API,如果他们有兴趣的话就可以通过对比两个版本的区别来学习Maya API,因为所有的函数名称、参数变量都一样,基本上就是把语法改了一下,其它基本一致)
感兴趣的可以看看Python API 2.0的版本
uvOverlap.py
https://github.com/mackst/myRandomStuff