Как импортировать группу файлов .obj из файла .csv, а затем перемещать, масштабировать и поворачивать их на место? - PullRequest
0 голосов
/ 09 февраля 2019

Мне нужно импортировать группу файлов .obj в сцену maya из папки, которая также содержит файл .csv с их именем, положением, wxyzrotation и масштабом.Каждая строка соответствует объекту.

CSV Пример строки: humanwings01.obj;-1.74366;9.68615;-0.017424690;0.9396926;0.0000;0.0000;-0.342020100;0.43248

Моя проблема заключается в том, что объекты не перемещаются и не масштабируются на месте.(мне еще предстоит сценарий поворота) Я думаю, что моя проблема возникает из-за того, что объекты не создаются в сцене до тех пор, пока не закончится цикл, но это всего лишь предположение.

Пока сценарий python выглядит так:

import maya.cmds as cmds

#CSV path: D:/environment/human/
#CSV format:  ModelFile;PositionX;PositionY;PositionZ;RotationW;RotationX;RotationY;RotationZ;ScaleFactor

pathOfFiles = "D:/environment/human/"                    #folder with all the files
fh = open("D:/environment/human/objectdata.csv", "r")    #open the csv file with all the data and save it
content = fh.readlines()[1:]                             #save all the lines of the file except the first one which contains the format for the csv
fh.close()
for line in content:         #for every line
    l = line.strip()         #remove whispace at start and end
    values = l.split(";")    #save the values that were separated by ;
    importedObj = cmds.file(pathOfFiles + values[0], i=True)                                 #import each file by reading the first value of each line and save the name
    cmds.move( values[1], values[2], values[3], importedObj, a=True )                        #move the object that was just imported by reading the values from the csv
    cmds.scale( float(values[8]), float(values[8]), float(values[8]), importedObj, a=True )  #scale the object that was just imported by reading the values from the csv.

1 Ответ

0 голосов
/ 09 февраля 2019

Похоже, что это может быть немного проще, используя классы из OpenMaya 2.0 (maya.api.OpenMaya Пока вы используете Maya 2016 +).

# standard
import os
from collections import namedtuple

# maya
import maya.cmds as cmds
from maya.api import OpenMaya

csv_path = "D:/dump/test.csv"
obj_dir = "D:/dump"
ObjModel = namedtuple("ModelRecord", "path tx ty tz rw rx ry rz s")

def get_models(csv_path):
    """Get list of ObjModel named-tuples from file"""
    models = []
    first_line = True
    with open(csv_path, "r") as csv_file:
        if first_line:
            first_line = False
            continue
        for line in csv_file:
            models.append(ObjModel(*line[:line.rfind("$")].split(";")))

def get_depend_node(node):
    """Get reference to maya node."""
    selection = OpenMaya.MSelectionList()
    selection.add(node)
    return selection.getDependNode(0)

for model in get_models(csv_path):
    namespace = model.path.rsplit(".",1)[0]
    # if namespace already exists, generate new namespace
    if cmds.namespace(exists=namespace):
        for i in xrange(1,500):
            new_namespace = namespace + str(i)
            if not cmds.namespace(exists=new_namespace):
                namespace = new_namespace
                break
    cmds.file(os.path.join(obj_dir, model.path), i=True,ns=namespace)
    # group members of new namespace
    ns_members = cmds.namespaceInfo(namespace, listNamespace=True)
    grp = cmds.group(ns_members, name=namespace+"_grp")
    # apply transformations to group
    grp_xform = OpenMaya.MFnTransform(get_depend_node(grp))
    grp_xform.setRotation(
        OpenMaya.MQuaternion.kIdentity, 
        OpenMaya.MSpace.kObject
    )
    # translate
    grp_xform.translateBy(
        OpenMaya.MVector([float(mag) for mag in (model.tx, model.ty, model.tz)]),
        OpenMaya.MSpace.kObject
    )
    # rotate
    quat = OpenMaya.MQuaternion(
        *(float(getattr(model, r_attr)) for r_attr in "rw rx ry rz".split())
    )
    grp_xform.setRotation(quat, OpenMaya.MSpace.kObject)
    # scale
    grp_xform.scaleBy([float(model.s)]*3)
...