c# - 按偏移量/矢量移动每个 UV 顶点

标签 c# python maya mel

我想创建第二个 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 集,需要考虑几个复杂问题

  1. 只要创建一个新的 UV 集就可以得到一个集;该集存在但不包含任何 UV。顶点和 UV 之间的关系并不总是 1:1,一个物理顶点可以有多个 UV,并且可以有未映射的顶点。要创建一个 1-uv-per-vertex 贴图,最简单的方法是应用一个简单的平面贴图或球体贴图。
  2. 您需要设置“当前 uv 集”,以便 maya 知道您要处理哪个集。不幸的是,当您向 maya 询问 UV 集名称时,它会为您提供 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)

关于c# - 按偏移量/矢量移动每个 UV 顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459704/

相关文章:

c# - UWP 应用程序可以充当 SignalR 服务器吗?

c# - RESTful API 中的向后兼容性

C# 为什么我的 lock 语句挂起?

python - 在 Django 中注册后如何进行电子邮件确认?

python - 在 Maya 中打印动画定位器的 xyz 值

tensorflow - 我可以在 Maya 和 Blender 中导入 tensorflow 和 keras

c# - 如何在WP7上创建流畅的移动?

python - 如何修复破坏向后兼容性 python 3.5/3.6+ 的 f 弦

python - Webdriver.get(url) 打开 Firefox 但不打开 URL

python - 导入时对象的名称