2017-08-02 108 views
2

我想要创建第二个UV集,然后通过矢量u=0, v=1.0/number of vertices移动对象中的每个UV顶点。新的UV顶点坐标为4个顶点平面上创建应该是这样的:对于顶点0 (u=0,v=0),顶点1 (u=0,v=0.25),顶点2 (u=0,v=0.5),顶点3 (u=0,v=0.75)通过偏移/矢量移动每个UV顶点

我在C#源代码:

Vector2[] UV2 = new Vector2[m.vertexCount]; 

    float HalfTexelSize = (1f/ (float)m.vertexCount)/2f; 

    for (int i = 0; i < m.vertexCount; i++) { 

     UV2[i] = new Vector2(0f, (float)i/(float)m.vertexCount) + new Vector2(0f, HalfTexelSize); 
    } 

    m.uv2 = UV2; 
    meshFilter.mesh = m; 

据我的研究,在Python中没有矢量,现在我坚持使用解决方案。到目前为止,我想出了这一点:

import maya.cmds as cmds 

cmds.polyUVSet(create=True, uvSet='map2') 
vertexCount = cmds.polyEvaluate(v=True) 
vertexCount_float = float(vertexCount) 
HalfTextureSize = (1.0/vertexCount/2.0) 
x = 1.0/vertexCount 
sel = cmds.ls(sl=1, fl=1) 

for i in sel: 
    i=0, i<sel 
    cmds.polyEditUV(uValue=0.0, vValue=x) 

但输出我得到的是第二UV在(0,0)的UV坐标每个顶点设置。谁能帮我?任何MEL/Python解决方案,将不胜感激。

回答

0

默认maya pyhon中没有向量。

如果你想要一个只有香草python的解决方案this project是一个单文件矢量库。

您可以从玛雅直接使用API​​还可以获得3向量:

from maya.api.OpenMaya import MVector 

v1 = MVector(1,2,3) 
v2 = MVector(3,4,5) 
print v1 + v2 

这些三维矢量,但你可以忽略的3D组件

对于实际创建和编辑UV集,有一对夫妇的复杂性考虑

  1. 只需创建一个新的UV集给你一个集;该集合存在但它不包含任何UV。 vert与UV之间的关系并不总是1:1,对于物理垂直可以有多个UV,并且可以有未映射的顶点。要创建1-uv-vert-vertex映射,最简单的方法就是应用简单的平面或球体贴图。
  2. 你需要设置'当前uv设置',以便maya知道你想要工作的设置。不幸的是,当你问紫外线集名称的玛雅,它给你的Unicode,但是当你设置它们期望的字符串(至少在2016年 - 我认为这是一个错误)
  3. 你真的不需要一个向量来设置如果你现在的代码是一个指示。

最终的解决方案将是这个样子:

import maya.cmds as cmds 

# work on only one selected object at a time 
selected_object = cmds.ls(sl=1, fl=1)[0] 
vertexCount = cmds.polyEvaluate(selected_object, v=True) 

# add a projection so you have 1-1 vert:uv mapping 
cmds.polyPlanarProjection(selected_object, cm=True) 
# get the name of the current uv set 
latest_uvs = cmds.polyUVSet(selected_object, q=True, auv=True) 
# it's a unioode by default, has to be a string 
new_uv = str(latest_uvs[-1]) 
# set the current uv set to the newly created one 
cmds.polyUVSet(selected_object, e=True, cuv = True, uvs=new_uv) 
vert_interval = 1.0/vertexCount 

for vert in range (vertexCount): 
    uv_vert = "{}.map[{}]".format (selected_object, vert) 
    cmds.polyEditUV(uv_vert, u= 0, v = vert * vert_interval, relative=False, uvs=new_uv)