我想创建第二个 UV 集,然后通过向量 u=0, v=1.0/number of vertices
移动对象中的每个 UV 顶点。为 4 个顶点平面创建的新 UV 顶点坐标应如下所示:对于顶点 0 (u=0,v=0)
,对于顶点 1 (u=0,v=0.25)
,对于顶点 2 (u=0,v=0.5)
,对于顶点 3 (u=0,v=0.75)
,等等。
我有一个 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 解决方案将不胜感激。
最佳答案
默认的 maya pyhon 中没有矢量。
如果你想要一个纯 python 解决方案 this project是一个单文件矢量库。
您还可以直接使用 API 从 Maya 获取 3 向量:
from maya.api.OpenMaya import MVector
v1 = MVector(1,2,3)
v2 = MVector(3,4,5)
print v1 + v2
这些是 3d 向量,但您可以忽略 3d 分量
对于实际创建和编辑 UV 集,需要考虑几个复杂问题
- 只要创建一个新的 UV 集就可以得到一个空集;该集存在但不包含任何 UV。顶点和 UV 之间的关系并不总是 1:1,一个物理顶点可以有多个 UV,并且可以有未映射的顶点。要创建一个 1-uv-per-vertex 贴图,最简单的方法是应用一个简单的平面贴图或球体贴图。
- 您需要设置“当前 uv 集”,以便 maya 知道您要处理哪个集。不幸的是,当您向 maya 询问 UV 集名称时,它会为您提供 unicode,但当您设置它们时,它需要字符串(至少在 2016 年 - 我认为这是一个错误)
- 如果您当前的代码是一个指示,那么您真的不需要矢量来设置它。
最终的解决方案看起来像这样:
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)
关于c# - 按偏移量/矢量移动每个 UV 顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459704/