`
schi
  • 浏览: 200991 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

uv重叠(uv overlap)

阅读更多


  两年多前我需要解决uv重叠的问题,当时觉得是一个挺有挑战的问题,很兴奋。
  为什么兴奋?因为对于当时的我来说还是很难实现的,第一眼看到这个问题,就不停的问自己这么解决。
  当然第一步就是分析uv,uv是模型的2d投影,它只是一堆2d数据,不像多边形有线、面,最多只有点而已。所以一开始看上面的图时没任何思绪。
  那我们换一种视觉显示



  第一眼的差距只是没了填充色而已,再分析,如果我们假设它有边,就像上面显示的一样,那我们就能发现有两个相交点



  这意味着如果我们能找到一个交点,那它就是重叠的,继续分析,如果我们把这几条边独立出来



  这就清晰多了,我们可以看到P0P1分别跟PSP2、PSP3都有一个交点,而P0P1、PSP2、PSP3都是线段,于是我的出了解决方案:判断两条线段是否相交的算法,就是我解决这个问题的算法。于是马上问google,然后开始写代码。
但是这真的就这么简单吗?
当我实现了判断两条线段是否相交的算法后,发现没这么简单。
我们先来看最简单的四边面



如果我们对它使用判断两条线段是否相交的算法,就会得到所有4个点



这很明显不是我需要的结果,我需要的结果应该是这样的



所以我还需要去解决除去共同点边的问题,如果两条边有一个共同点就应该忽略。具体怎么实现的我已经不记得了,因为当我完成了之后做了点测试发现能正常工作就提交了。直到好几个月后一同事跟我说还是有共同点边的问题的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
  • 大小: 82.2 KB
  • 大小: 78.8 KB
  • 大小: 78.1 KB
  • 大小: 82.2 KB
  • 大小: 72.7 KB
  • 大小: 75.3 KB
  • 大小: 79.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics