前言:最近想把尼尔机械纪元的2B导入到UE中看看效果,可不知道是不是我解包的过程有问题,2B模型的裙子部分的发现有问题,而且裙子的模型还被拆分为了3个部分,直接软边是不管用的,而且已经绑定的模型就算修改了法线导出之后也没有效果,
本文分为两个部分,分别是翻译的一篇artstation上的文章和我自己的做法
一.如何在maya中给已经绑定的物体传递UV
文章出处:Transferring UVs AFTER rigging in Maya
第一段作者表示,他这篇文章也不是原创的,他在他的博客备份的主要原因是怕这个文章会消失,就像是他以前收藏的那些资源一样.并且他新添加了一些图片,他觉得一图胜千言.
然后作者讲解了为什么在绑定之后传递UV不起效果,原因就是你在绑定之后所做的操作在maya的节点堆栈中都会排在绑定节点的后面.等于并没有对原模型做出修改,不理解的话可以看下图.
可以看到,我们所做的操作都在绑定节点之后(说实话我也不知道为什么在绑定后的节点对mesh节点所做的操作在导出之后会不起作用)
那么该怎么做呢
作者说每个物体都有一个 shape orig节点,他代表了每一个模型在绑定之前原始的模型,我们可以在这个原始的模型上应用UV传递,就可以了
步骤
- 选择你已经绑定好的模型,(在窗口中找到Hypergraph Hierarchy),然后在菜单中找到options|display|Shape Nodes和Hidden Nodes
- 你会看到一个隐藏的节点,它是你的原点节点,或者说这是你的模型在绑定前的样子
- 选择那个原始的shape在Object Display 中找到并取消勾选Intermediate Object,然后为了方便选择,可以再选中绑定后的shape在Obejct Display中取消勾选Visibility,不然在视口中会显示两个模型
- 接着将UV传递给你的原始的模型,然后清除历史就可以了(这点,存疑我在实际操作中没有清除历史导出后也可以继承-至少法线ok)
二.如何处理法线
解决了如何修改绑定后模型属性的问题,接下来就该讨论如何修改法线了.
首要问题是,如何平滑两个物体间的法线,这里我想的是计算物体交界处点的法线取平均,实测下来效果还OK
# 定义获取顶点法线的函数
def getNormal(vertName):normTemp = cmds.polyNormalPerVertex(vertName, query=True, xyz=True)xAve = normTemp[0]yAve = normTemp[1] zAve = normTemp[2] aveList = [xAve, yAve, zAve]return aveList# 简单的写一个归一化的函数
def normalize(vec):import mathlength = math.sqrt(vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2])return(vec[0]/length,vec[1]/length,vec[2]/length)
selectPoints = cmds.ls(selection=True)
if len(selectPoints) == 2:normal_1 = getNormal(selectPoints[0])normal_2 = getNormal(selectPoints[1])normal = normalize([normal_1[0]+normal_2[0],normal_1[1]+normal_2[1],normal_1[2]+normal_2[2]]) #相加并归一化两个顶点的法线cmds.polyNormalPerVertex(selectPoints[0],xyz=(normal[0],normal[1],normal[2]))cmds.polyNormalPerVertex(selectPoints[1],xyz=(normal[0],normal[1],normal[2]))
接下来只需要一对一对的选择交接出的点,然后应用这个脚本即可,需要注意的是一定要应用在原始模型上面
可以看到在交界区的法线已经被平滑了.