Обычно, когда люди говорят о «API» в майе они имеют в виду OpenMaya, который является Python оболочка для API C++, который Maya выставляет разработчикам плагинов. Есть на самом деле две версии этого в последней Mayas:
- OpenMaya 1.0
- OpenMaya 2.0
, где версия 2.0 является более «вещей», но и менее зрелым и менее полнофункциональным. Оба они включены в любую установку Maya - вы можете получить к ним доступ со стандартным импортом python из прослушивателя сценариев Maya.
Для задачи вы описываете вы можете использовать API вроде так:
def create(verts, faces, merge=True):
'''
Given a list of vertices (iterables of floats) and a list of faces (iterable of integer vert indices),
creates and returns a maya Mesh
'''
cmds.select(cl=True)
outputMesh = OpenMaya.MObject()
numFaces = len(faces)
numVertices = len(verts)
# point array of plane vertex local positions
points = OpenMaya.MFloatPointArray()
for eachVt in verts:
p = OpenMaya.MFloatPoint(eachVt[0], eachVt[1], eachVt[2])
points.append(p)
# vertex connections per poly face in one array of indexs into point array given above
faceConnects = OpenMaya.MIntArray()
for eachFace in faces:
for eachCorner in eachFace:
faceConnects.append(eachCorner)
# an array to hold the total number of vertices that each face has
faceCounts = OpenMaya.MIntArray()
for c in range(0, numFaces, 1):
faceCounts.append(3)
# create mesh object using arrays above and get name of new mesh
meshFS = OpenMaya.MFnMesh()
newMesh = meshFS.create(numVertices, numFaces, points, faceCounts, faceConnects, outputMesh)
nodeName = meshFS.name()
cmds.sets(nodeName, add='initialShadingGroup')
cmds.select(nodeName)
meshFS.updateSurface()
# this is useful because it deletes stray vertices (ie, those not used in any faces)
if merge:
cmds.polyMergeVertex(nodeName, ch=0)
meshFS.updateSurface()
return nodeName
Однако этот примере вызывается API непосредственно из питона без упаковки его в командной API оболочки, поэтому он не может быть отменен используя обычные методы отмены. Чтобы превратить его в полноценную операцию с поддержкой Undo, вам нужно сделать эту функцию частью MPXCommand. Как вы можете видеть, использование API OpenMaya от Python немного громоздко, потому что оно включает создание прокси для типов данных C++, которые Python не поддерживает изначально, поэтому это может быть очень сложно, если вы не знакомы с обоими языками и Maya. Мне не хватает опыта работы с API 2.0, чтобы узнать, является ли это значительным улучшением, но слово-на-улице говорит, что оно еще не очень полно.
Если вы не беспокоитесь о скорости, вы можете просто использовать обычный модуль maya.cmds
для создания геометрии с использованием тех же функций, которые художник использовал бы для создания геометрии вручную. Вот простой пример:
verts = [(0,0,0), (0,1,0), (1,0,0), (1,1,1)]
faces = [(0,1,2),(1,2,3)]
def create_geometry(verts, faces):
cmds.constructionHistory(tgl = 'off')
results = []
for f in faces:
points = [verts[i] for i in f]
results += cmds.polyCreateFacet(p = points, ch = 0)
cmds.polyUnite(results, ch=0)
cmds.polyMergeVertex(d=0, ch=0)
cmds.constructionHistory(tgl = 'on')
create_geometry(verts, faces)
Как вы можете видеть, этот метод значительно проще писать, но это также гораздо медленнее. Правильный способ зависит от ваших потребностей. Если вы можете просто распространять скрипт python, второй способ проще. Если вы хотите создать традиционный плагин, который создает полноценный переводчик майя-файла или новую команду MEL, вам придется использовать маршрут MPXCommand.
Привет, спасибо. Но я думал. Майя читать в файле и перебирать файл. Я думал о создании импортера .DXF, чтобы преобразовать линии в кривые, а затем в полигоны. поэтому я могу выдавить их. Поэтому он будет читать данные из файла, а затем я смогу создать 3D-мир из рисунков. Я знаю, что есть уже импортер для .DWG и .DXF, но я хотел бы создать свой собственный плагин. –
Основной вопрос стратегии один и тот же: вы можете сделать один и тот же алгоритм импорта и создания в простой maya.cmds или с помощью OpenMaya; первый легче и медленнее, последний сложнее и подвержен ошибкам, но быстрее. Создание кривых почти такое же, как создание полисов: команда API будет отличаться (в maya.cmds ее 'cmds.curve (p = ваш список-точек-здесь, d = кривая-градус). Повторное внедрение импортер DXF является значительным куском работы, поскольку DXF является старым и свободным стандартом .... Итерация по импортированной геометрии легко с помощью 'cmds.ls' или API – theodox
О, хорошо. Так что это первый пример чтения в файле данные и создание геометрии?В идеале я хотел создать импортер файлов .DWG. Итак, если я перебираю файл .dwg, могу ли я вызвать только строки из файла и нарисовать их в Maya? –