下载 / Download

/// Procedure Name : UVTexEditor.mel V1.51
/// Updated : 17th. May. 2006
/// Author : T.G.Jay
/// Attention : The Model Should be fit in the Grids.
/// All Rights Reserved .
/// All the Vars begin with "$TGJ_MUV_"
/// The Model Scale should less than 9999

工具名称:UVs & Textures Editor
版本:0.9

>>>实现功能:

1) 在模型形状相同的情况下(允许Vertex Index不同)传递UV(Transfer UVs);
2) 在模型左右对称的情况下镜像UV(Mirror UVs);
3) 如果以上条件满足,可以顺带传递材质(Pass Shader)。
(Ps.模型面必需是有理面)

 

>>>工具介绍:

注:以下把来源物体称为Source,目标物体称为Target。
Component:UVs/Textures
选择对对象进行何种操作。传递UV或传递Shader或两者同时进项。
Operaton:Mirror/Tansfer
如果选择了传递UV,这里将确定对UV进行何种操作,镜像亦或拷贝。
Mirror Along:X/Y/Z
如果选择了镜像UV,请选择镜像的轴向。
注:这里的坐标轴是局部(Local)坐标轴。大部分情况下,模型面向Z轴正方向,所以选X即可。
Quadrant 1/2/3/4
如果Source的UV Shells在第一象限里,这个选项将决定传递完毕的UV Shell置于哪一个象限。

如果确认以上设置无误(如果有错误的选择,程序会在执行后产生相应的错误提示)
选择来源物体的“面”,在选择目标物体的“面”,
选择的元素会列在两个列表中。
最终按下下方的确认按钮即可。
注:程序只能对“面”进行操作,也就是说可以对物体的局部进行操作。

 

>>>测试心得:

目前这个工具还有不完善的地方,比如速度还未像飞一般的舒畅,
比如遇到特殊情况仍然会出错。(这些特殊情况我目前还未考虑到)
另外,这个程序存在一定得不稳定性,如果某一次执行失败,用同样的设置再执行一遍即可成功。
程序执行的结果不可Undo,没有历史,所以执行程序前请先备份好数据。
如果遇到点数多的模型(2w以上),建议多次执行程序,每一只选择部分面进行操作,这样效率更高。

 

>>>技术细节:

UV的传递通过三个步骤实现。
1) 找到Source和Target种对应的Vertexs、Edges、Faces,建立数据库;
2) 分割Target UV Shell,使得Target UV Shell与Source UV Shell具有同样的拓扑结构;
3) 移动UV点。

实现三个步骤的过程中都走过许多弯路,
第一步中,考虑过用八叉树或者儿叉空间分割树对空间数据的计算优化,这样做的效率只提升了300%~600%,
但仍然不能在很短的时间内处理完数据,最后通过对字符串简单排序实现了功能。
第二步中,考虑过把每片UV Shell单独处理,并单独传递每片UV Shell,其实是把问题复杂化了。
最后找到一个全局切割的办法。
第三步的计算是用时最长的,关键使用了polyEditUV的命令,目前未找到更有效的命令移动UV点。
这一步中还处理了个别比较恶心的点。(如下图)

>>>版本更新

工具名称:UVs & Textures Editor
版本:0.99

>>>使用说明:

打开Mel面板->
设置参数->
选择来源面(Source faces),按Set Source Faces添加到列表->
选择目标面(Target faces),按Set Target Faces添加到列表->
按执行按钮,如果没有错误,程序将执行。

 

>>>功能改进:

1) 修正了Transfer拼写错误;
2) Mirror Along选项改称Mirror Plane(Object坐标系),更直观;
3) 修正各项界面运行错误,主要包括:
Mirror/Transfer来回切换时的错误;
第一次启动时,初始化的错误。
4) 更多错误提示,主要包括:
选择非面元素的错误提示;
Source/Target面数不等的错误提示;
浮点计算精度不准确的提示,并提示对应错误面。
5) 开放浮点精度(Precision)设置,用于设置浮点计算保留的小数精度。默认数值为4,表示保留4位小数。提示:
如果模型的点分布很密,Precison需要一个较大的值。
有时,在Maya中移动点,然后进行Undo操作,点能回到原来的位置,但有一个很小的偏差,
减小Precison能包容这种偏差,但降低了计算精确性,可能造成错误。
6) 增加Get Source/Target Faces的功能,能选中列表中的面,方便选择对象。
7) 增加Auto Select功能。
如果Operation为Transfer,先选中Source再选中Target,按Auto Select,Source Faces和Target Faces将自动添加到列表。
如果Operation为Mirror,选中物体,按Auto Select,程序将根据Mirror Plane自动选择半边的面,并添加入Source Faces列表。
8) 程序结构优化,运行更稳定,多次执行效率保持不变。

 

>>>版本更新

工具名称:UVs & Textures Editor
版本:1.0

>>>功能改进:

1) 更正算法,避免了重复执行mel的不稳定;
2) 加入更多报错提示,修正强行关闭Undo的硬伤;
3) 优化算法,使得复杂模型的计算更稳定(测试结果:7万面/25分钟);
最终在稳定性上做了很大改进,略微牺牲了一点效率,Mel已经可以投入使用。

 

>>>版本更新

工具名称:UVs & Textures Editor
版本:1.5

>>>修正错误:

1) 修正YZ XZ不能镜像的错误;
2) 修正单一材质不能传递的错误;

 

>>>增加功能:

3) 如果编辑好的UV超出指定坐标范围,出现用户提示;
4) Auto Select Mirror Faces更加方便,单键高定;
5) Source与Target的自动转化;
6) 新的同化机制Assimilate Points(下详细说明);

 

>>>算法改进:

7) 98舍99如算法,使得Sort算法能有容差;
8) Corresponding Face(Transfer)算法效率提升8倍;
9) Cut edge与Correspoinding Edge算法整合,效率提升两倍以上;
10) 独特属性算法(下详细说明)。

 

>>>技术细节:

Assimilate Points是新加入的同化机制,这种机制能包容形状略微不同的物体,
使得这些物体仍然能够传递或者镜像UV,具体做法如下:
如果用户要Mirror UV,而模型左右形状略微有所不同,则选择物体,设置好Source/Target Faces,
点选Assimilate Points按钮,程序将生成一个左右形状一样的模型,这个模型和原来模型拓扑相同;
对新物体进行Mirror操作,完成后将新物体的UV传递transfer(maya命令)给原来的物体即可。
Transfer的操作方法类似,Assimilate Points将生成一个和Source有相同形状的Target物体。
所谓独特属性算法,就是将点的空间坐标转化成相关的更多属性,好比点和原点围成的立方体的体积,
好比点到原点的距离等等,保留这些属性的前三位有效数字,由这些数字来表征点,
可想而知,属性越多,这个表征就越独特,越能够成为一个点的特征。
同时,程序只考察着这些属性的前三位有效数字,这样就增加的容差范围,
通过这种机制,来使得Corresponding Vertex的算法在更精确的前提下,包容性更大。
目前程序能精确算出在2cm*2cm*2cm范围内含有10万点的情况。

 

>>程序缺陷:

TexUVEditor的初衷就是为了解决在物体形状一样的情况下传递UV,
所以程序不能处理模型拓扑一样但形状不一样的情况,后来提出Assimilate Points方案只是一种小小的改进,还不能根本解决拓扑问题。
目前我把对应点的算法单独处整合成了Correspoinding Vertex模块,日后若有了解决拓扑的方案,修改这个模块即可。

Copyright T.G.Jay © 2004-2006. All rights reserved.