0017加速UV检测的一种算法

加速UV检测的一种算法

需求:角色身上各UV块之间的间距不能小于30像素,距离UV边界([0,1])不能小于15像素,也就是要保证一定的UV出血量。

 

看起来挺简单,直接每个UV点计算距离对比就完了。然而现在每只角色平平常常都是几万面,拿到的测试文件UV顶点数50000左右。如果直接粗暴两两对比,那对比次数高达上亿,再加上存在多套UV,即使C++写插件计算时间也太慢,很可能就没法用了。

 

稍加分析都会想到,先取每块UV的边界点,再进行处理。这样需要处理的数据量就会减少很多了,通常也就勉强能用了。但其实仍然不少,而且大量的计算实际上都浪费了。理想情况下,每块UV应该只去查环绕在它周围最近一圈的其它UV块,与它们边界上的UV点进行对比。

 

现在的问题是几乎每块UV都弯弯扭扭,有的跨度长有的跨度短, 准确找出相邻UV块是个难题。也不知道有什么好算法,要精确查找带来的计算量也可能大得吓人,搞不好又跟最初的方案差不多耗费时间了。

 

怎么办?

直接说我的算法,如下:

计算每块UV的BondingBox,构建一个矩形;检测所有矩形的相交情况,根据这将UV块分组,也就是说找出每块UV及其周围一圈需要对比的那些UV Shell,最后根据这些分组计算各UV Shell边上的UV点间距。

 

到这一步问题似乎就解决了。但是且慢,由于模型的对称性,往往存在好些UV块是完全重叠的,经过上面的计算后你会发现,结果似乎不对头。为什么呢,因为重叠的UV块会被分到将要与之对比检查的组里面,显然它们是不可能有30像素间距的。这时就要把这种情况从分组中排除掉。

 

解决办法也很简单了,检测矩形是否重叠。(从这里引申出另一个问题的解决方案,那就是检测是否有UV重叠)简单的算法,对比Rectangle的topLeft与rightBottom坐标就行。

 

其实这种情形还有一些小意外,可能模型经过几次修改后,原本对称的部分有小幅度的改动,导致UV又不完全重叠了。这种根据实际情况加个对比的容差值也就好了。

 

至此,算是可以比较好的解决这个需求了。Python代码也就二三百行,不同复杂度模型检测速度在十秒左右(5万左右面, 2套UV)。如果按最初想法上来简单粗暴处理,那结果就是电脑直接死机了,永远没有结果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值