Создание собственного экспортера .obj для Maya

Я создаю свой собственный экспортер .obj для Maya.

Когда я экспортирую только одну сетку, мой код работает нормально, но при экспорте нескольких сеток/объектов не удается создать полные сетки.

Я почти уверен, что проблема заключается в том, что я получаю face.getVertices(), face.getUVIndex() и face.normalIndex() и печатаю их в файл. Как я уже сказал, первая сетка работает нормально, но когда дело доходит до второй сетки, координаты становятся неправильными, они соединяются с неправильными треугольниками. Если у кого-то есть какие-либо идеи о том, как их зациклить по-другому или изменить значения на правильные, я буду всегда благодарен. Помощь была бы очень признательна!

Вот пример того, как заканчивается многообъектная сетка. http://postimg.org/image/rr0fvs0v7/

import pymel.core as pm
import pymel.core.nodetypes as nt

planes = pm.ls(sl=True)

def meshFile():    
    def myRound(n):
        return round(n, 6)

    file = open("C:/Users/Blondiegirls/Desktop/test2.obj", "wb")
    file.write("mtllib test2.mtl\r\n")
    for p in planes[:]:
        #pm.polyTriangulate(planes[0])
        file.write("\r\ng default")

        # Printa world kordinater
        for index, point in enumerate(p.vtx):
            temp = index,map(myRound, point.getPosition(space='world'))

            file.write("\r\nv ")
            file.write(str(' '.join(map(str, temp[1]))))

        # Printa texture kordinater
        mesh = pm.ls(g=True)[0]
        U,V = mesh.getUVs()
        UVs = zip(U,V)
        for uv in UVs:
            file.write("\r\nvt ")
            file.write(str(uv[0])+" "+str(uv[1]))

        #printa normals
        for n in p.getNormals():
            file.write("\r\nvn ")
            file.write(str(n[0])+" "+str(n[1])+" "+str(n[2]))

        file.write("\r\ns 1")    
        file.write("\r\ng ")
        file.write(str(p))
        file.write("\r\nusemtl test")
        for faceIndex, face in enumerate(p.faces):
            faceVertices = face.getVertices()
            faceUV0 = face.getUVIndex(0)+1
            faceUV1 = face.getUVIndex(1)+1
            faceUV2 = face.getUVIndex(2)+1

            faceNor0 = face.normalIndex(0)+1
            faceNor1 = face.normalIndex(1)+1
            faceNor2 = face.normalIndex(2)+1


            file.write("\r\nf ")
            faceVertices0 = int(faceVertices[0])+1
            faceVertices1 = int(faceVertices[1])+1
            faceVertices2 = int(faceVertices[2])+1
            temp3 = (str(faceVertices0)) + "/" + (str(faceUV0)) +"/" + (str(faceNor0)) + " " + (str(faceVertices1)) + "/" + (str(faceUV1)) +"/" + (str(faceNor1)) + " " + (str(faceVertices2)) + "/" + (str(faceUV2)) +"/" + (str(faceNor2))         
            file.write(str(temp3))
    file.close()

meshFile()   


def MTLFile():
    file2 = open("C:/Users/Blondiegirls/Desktop/test2.mtl", "wb")

    object = cmds.ls(sl=1)[0].split(':')[0]
    #print('object: '+object)

    shipTX = pm.PyNode(object)
    shadingGroups = shipTX.shadingGroups()
    sg1 = shadingGroups[0]

    material = sg1.listConnections(source=True, destination=False, type=nt.Lambert)[0]
    file = material.color.listConnections(type=nt.File)[0]
    filename = file.fileTextureName.get()

    materialColor = material.getColor() #for Kd
    materialAmbient = material.getAmbientColor() #for Ka
    materialSpecular = material.getSpecularColor() #for Ks
    refractiveIndex = material.getRefractiveIndex() #for Ni

    file2.write("newmtl "+"test"+"\r\n")
    file2.write("Ka "+str(materialAmbient[0])+" "+str(materialAmbient[1])+" "+str(materialAmbient[2])+"\r\n")
    file2.write("Kd "+str(materialColor[0])+" "+str(materialColor[1])+" "+str(materialColor[2])+"\r\n")
    file2.write("Ks "+str(materialSpecular[0])+" "+str(materialSpecular[1])+" "+str(materialSpecular[2])+"\r\n")

    file2.write("d 1.0\r\n")
    file2.write("Illum 2\r\n")
    file2.write("map_Kd "+filename+"\r\n") #for map_Kd



    file2.close()

MTLFile()

person Rickard    schedule 03.06.2015    source источник


Ответы (1)


Проблема в этой строке:

mesh = pm.ls(g=True)[0]
U,V = mesh.getUVs()

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

U,V = p.getUVs()

Кроме того, вам, вероятно, следует подумать о добавлении аргумента к meshFile(), а не полагаться на переменную в глобальной области.

person chadrik    schedule 26.10.2015