Създаване на собствен .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