Вопрос или проблема
Я пытаюсь экспортировать дельты из всех блендшейпов (и промежуточных кадров) из Maya и найти способ использовать эти данные в Unity. Я нашел способ получить дельты на этом сайте https://www.tech-artists.org/t/maya-blendshape-delta/12641.
pt = cmds.getAttr('blendShape1.inputTarget[0].inputTargetGroup[0].inputTargetItem[6000].inputPointsTarget')
ct = cmds.getAttr('blendShape1.inputTarget[0].inputTargetGroup[0].inputTargetItem[6000].inputComponentsTarget')
pt count: 1054 data: [dt.Point([0.21583744883537292, -0.02462431788444519, 0.5327363014221191]),...
ct count: 242 data: ['vtx[0:45]', 'vtx[56:85]', 'vtx[88]', 'vtx[91:96]',...
pt содержит все дельты, а ct содержит индексы вершин, которые получают каждую дельту. Я просто не уверен, как понять эти данные. Массив pt длиннее, чем ct, поэтому я не могу просто сопоставить их 1 к 1.
Кто-нибудь знает, как интерпретировать два массива?
Я ничего не пробовал, так как не понимаю возвращаемые данные.
Ответ или решение
Для интерпретации данных blendshape в Maya и эффективного использования их в Unity, необходимо четко понять, как работают массивы, содержащие дельты и индексы вершин.
Шаг 1: Понимание структуры данных
Данные, возвращаемые с помощью Maya команд getAttr
, содержат две ключевые части:
-
pt (point data) – Массив, содержащий все дельты (изменения позиций вершин) для конкретного blendshape. Каждая дельта представляет собой вектор, указывающий, как изменяется позиция одной или нескольких вершин модели.
-
ct (component data) – Массив, который содержит индексы вершин, связанных с каждой дельтой. Это массив строк, которые указывают, какие именно вершины должны быть изменены с помощью соответствующей дельты.
Шаг 2: Соответствие между dельтами и индексами вершин
Важно осознать, что не все дельты в массиве pt
могут соответствовать одному индексу в массиве ct
. Это объясняется тем, что некоторые дельты могут применять изменения к нескольким вершинам одновременно. Вот как можно разобрать данные:
-
pt
: Например, еслиpt
содержит 1054 элемента, это означает, что у вас есть 1054 дельты. Каждая дельта указывает, на сколько нужно изменить позицию вершины. -
ct
: Еслиct
указывает 242 элемента, это значит, что всего 242 набора индексов вершин были определены. Каждый набор индексов вct
может соответствовать одной или нескольким дельтам изpt
.
Шаг 3: Процесс интерпретации
-
Работа с массивом
ct
: Для каждого элемента вct
, например,vtx[0:45]
, вы знаете, что позиции вершин от 0 до 45 должны быть изменены. Это означает, что соответствующая дельта изpt
применяется ко всем вершинам, указанным в этом диапазоне. -
Индексирование изменений: Чтобы понять, какую дельту применить к наборам индексов, вам нужно будет сопоставить каждый индекс
vtx
с соответствующей дельтой. Вы можете создать цикл, который будет проходить по элементам массиваct
и применять изменения изpt
к вершинам, которые указаны вct
.
Шаг 4: Пример кода
Вот простой пример Python-скрипта, который показывает, как применять дельты к вершинам:
import maya.cmds as cmds
# Получение данных дельт и индексов вершин
pt = cmds.getAttr('blendShape1.inputTarget[0].inputTargetGroup[0].inputTargetItem[6000].inputPointsTarget')
ct = cmds.getAttr('blendShape1.inputTarget[0].inputTargetGroup[0].inputTargetItem[6000].inputComponentsTarget')
# Применение дельт к вершинам
for index, vertex_indices in enumerate(ct):
for vertex_index in vertex_indices:
# Здесь `pt[index]` содержит дельту, соответствующую текущему набору индексов
delta = pt[index]
# Применяем изменения
cmds.move(delta[0], delta[1], delta[2], vertex_index, relative=True)
Шаг 5: Экспорт в Unity
После того как вы сможете правильно интерпретировать и применять данные дельт, вы можете экспортировать эти значения в Unity, обычно в формате JSON или через другие подходящие форматы, совместимые с Unity, такие как FBX.
Заключение
Понимание и интерпретация данных blendshape в Maya — это ключевой шаг для их успешного использования в Unity. Четкое понимание структуры массивов дельт и индексов вершин позволит вам правильно манипулировать данными и достичь ожидаемых результатов в вашей 3D-модели.