Переместите каждую вершину UV по смещению/вектору

Я хочу создать второй набор UV, а затем переместить каждую вершину UV в объекте по вектору u=0, v=1.0/number of vertices. Новые координаты вершин 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) и т. д.

У меня есть исходный код на С#:

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 будет оценено по достоинству.


person Sup    schedule 02.08.2017    source источник


Ответы (1)


В Maya pyhon по умолчанию нет векторов.

Если вам нужно ванильное решение только для Python, этот проект представляет собой однофайловую векторную библиотеку.

Вы также можете получить 3-вектора от Maya напрямую, используя API:

from maya.api.OpenMaya import MVector

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

Это трехмерные векторы, но вы можете просто игнорировать трехмерный компонент.

Для фактического создания и редактирования набора UV необходимо учитывать несколько сложностей.

  1. Простое создание нового набора UV дает вам пустой набор; набор существует, но он не будет содержать UV. Соотношение между вершинами и UV не всегда 1:1, у вас может быть более одной UV для физической вершины, и у вас могут быть неотображенные вершины. Чтобы создать отображение 1 uv на вершину, проще всего просто применить простую планарную или сферическую карту.
  2. Вам нужно будет установить «текущий набор uv», чтобы Maya знала, над каким набором вы хотите работать. К сожалению, когда вы запрашиваете у Maya имена наборов UV, он дает вам юникод, но когда вы их устанавливаете, он ожидает строки (по крайней мере, в 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)
person theodox    schedule 02.08.2017