| 
 
   
 
0 
0 
0 
  
UID: 64014  
权限: 5  
发帖: 7  					
 
(0精)  					
 
积分: 7 
 
章鱼: 0  
大葱: 0  
茄子: 46  
注册:2010/4/26 
存在感:99 
 
 | 
谢谢楼上各位大大,不够我自己很暴力的搞定了…… 
如果出现以上这个问题的朋友,你可以用记事本打开import_2_pmd.py,将以下这段代码覆盖 
里面的内容就可以了= = 
主要是因为那些pmd模型是日本的= =所以命名用了日本的字符编码= =在生成xml的时候系统无法 
识别一些名字导致中断= =由于我找来找去实在不知道怎么让系统识别这些名字= =既然如此就只能 
把这些东西轰杀至渣了= =只是把相关的在xml写入部分节点名字的语句去掉= =就能继续运行了= = 
当然……这样的方法得到的xml文件时不完整的……可是人家只是要初音而已……所以xml什么的= = 
就让他去死两次吧!!!! 
以下是修改后的代码 
======================================================= 
#!BPY 
 
""" 
 Name: 'PMD file for MMD(.pmd) ...' 
 Blender: 248a 
 Group: 'Import' 
 Tooltip: 'Import PMD file for MikuMikuDance.' 
""" 
 
__author__= "BouKiCHi_&NANAshi" 
__version__= "2.12" 
 
__bpydoc__="" 
 
from Blender import * 
import os 
import re 
 
#from struct import * 
from xml.dom.minidom import * 
 
import pmd_2 
 
 
CHENGE_MATRIX = Mathutils.Matrix([1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1]) 
 
DEBUG = True 
 
# 
# Object 
# 
# 
# 
# 
def MakeObject(d_pmd,b_bones,filename): 
 
        scn = Scene.GetCurrent() 
        title = d_pmd["Header"][2]        # Get title 
 
        #Armture  [ ( name, parent , to , kind , knum, x,y,z ) ]  
        arm_data = Armature.New("%s_armdata" % title) 
        arm_obj = scn.objects.new(arm_data,"%s_arm" % title ) 
        arm_data.makeEditable()         
         
        arm_dic = {} 
         
        Bones = d_pmd["Bone"] 
        IKs = d_pmd["IK"] 
 
        for BoneIndex in range(len(Bones)): 
                Bone = Bones[BoneIndex] 
                BoneState = Bone[3]        #kind                 
                if BoneState not in (6,7) and BoneState < 10 :                 
                        NewArm = Armature.Editbone() 
                        #Name 
                        NewArm.name = b_bones.get(BoneIndex,Bone[0])  
                        #ToBone 
                        if Bone[3] == 9: 
                                ToBone = Bones[Bones[Bone[2]][2]]                         
                        elif Bone[2] == 0: 
                                ToBone =(Bone[0],Bone[1],Bone[2],Bone[3],Bone[4],Bone[5],Bone[6],Bone[7]+1) 
                        else:         
                                ToBone = Bones[Bone[2]] 
                        #         
                        NewArm.head = Mathutils.Vector(Bone[5],Bone[6],Bone[7]) * CHENGE_MATRIX  
                        NewArm.tail = Mathutils.Vector(ToBone[5],ToBone[6],ToBone[7]) * CHENGE_MATRIX  
                        if Bone[1] != 65535:                                 
                                NewArm.parent = arm_dic.get(Bone[1],None) 
                                if BoneIndex == Bones[Bone[1]][2] and Bones[Bone[1]][3] != 6 and Bones[Bone[1]][3] != 7 : 
                                        NewArm.options = [Armature.CONNECTED] #Connect                                         
                        arm_data.bones[NewArm.name] = NewArm 
                        arm_dic[BoneIndex] = NewArm 
                else: 
                        arm_dic[BoneIndex] = arm_dic[Bone[1]] 
 
        arm_data.update() 
        arm_data.drawType = Armature.STICK 
        arm_data.mirrorEdit = True 
        arm_data.envelopes = False 
        arm_obj.xRay = True 
         
         
        #IK [ ( ik,target,p1,p2,[node]) ] 
        pose = arm_obj.getPose() 
        for IK in IKs: 
                IK_Terget = arm_dic[IK[0]] 
                ChainLastArm = arm_dic[IK[4][0]] 
                #IKArm.parent = ChainLastArm 
                IK_Bone = pose.bones[ChainLastArm.name] 
                 
                IK_Const = IK_Bone.constraints.append(Constraint.Type.IKSOLVER) 
                IK_Const[Constraint.Settings.CHAINLEN] = len(IK[4]) 
                IK_Const[Constraint.Settings.TARGET] = arm_obj  
                IK_Const[Constraint.Settings.BONE] = IK_Terget.name 
                 
                #IKConst[Constraint.Settings.USETIP] = False 
                         
 
        pose.update() 
        #Mesh  
        #Vertex [ ( x,y,z,nx,ny,nz,u,v) ] 
        Vertices = d_pmd["Vertex"] 
                 
        mesh = Mesh.New("Mesh") 
        mesh_obj = scn.objects.new(mesh)                 
        mesh.vertexUV = 1 #Use Vertex UV 
         
        vertex_list = [] 
        for vertex in Vertices: 
                vertex_list.append(vertex[0:3]) 
 
        mesh.verts.extend(vertex_list) #Set Vertex 
         
        for mv,lv in zip(mesh.verts,Vertices): 
                mv.co[0:3] = lv[0:3] 
                mv.no[0:3] = lv[3:6] 
                mv.uvco[0:] = lv[6:] 
                #CHENGE_MATRIX 
                mv.co = mv.co * CHENGE_MATRIX 
                mv.no = mv.no * CHENGE_MATRIX 
                #if mv.uvco[0] != 0: 
                        #print lv[6:] 
                mv.uvco[1] = 1 - mv.uvco[1] #inverse v 
                 
        del vertex_list 
        mesh.update() 
 
        #Face          
        face_TMP = [] 
        face_list = [] 
         
        Faces = d_pmd["Poly"] 
        if DEBUG: 
                print "ADD FACES %d" % len(Faces) 
        for face in Faces: 
                face_TMP.append(face) 
                if len(face_TMP) > 2: #length == 3                         
                        face_list.append([face_TMP[0],face_TMP[2],face_TMP[1]]) #inverse nomal 
                        face_TMP = [] 
        FaceList =  mesh.faces.extend(face_list,ignoreDups=True,indexList = True) 
         
        del face_list 
        del face_TMP 
         
        mesh.update() 
 
        #Material  [ ( r,g,b,a, shininess, specular(r,g,b), ambient(r,g,b) , toon, toon_edge , edges, file ) ] 
        Materials = d_pmd["Material"] 
         
        material_list =[]        # New Materials 
        material_index = {} # Dec material_index[oldListNo] = newNum 
 
        for i in range(len(Materials)): 
                if  len(material_list) > 15: 
                        print "Mat%d Removed" % i 
                        material_index[i] = 16 
                        continue  
                 
                if not material_index.has_key(i): 
                        # Create Material 
                        data = Materials[i] 
                        material = Material.New("mat%02d" % i) 
                        material.setRGBCol (data[0],data[1],data[2]) 
                        material.setAlpha (data[3]) 
                        material.setHardness(int(data[4]))  
                        material.setSpecCol(data[5],data[6],data[7]) 
                        material.setMirCol(data[8],data[9],data[10]) 
                        material.emit = 0.6 
                        ## SET Texture         
                        tex_fn = data[14] 
                        if len(tex_fn) > 0: 
                                if DEBUG: 
                                        print "File = %s" % tex_fn 
                                tex_path = sys.join(sys.dirname(filename),tex_fn) 
                                if DEBUG: 
                                        print "Path = %s" % tex_path  
                                img = Image.Load(tex_path) 
                                tex = Texture.New("tex%02d" % i) 
                                tex.setType("Image")                                 
                                tex.image = img 
                                material.setTexture(0,tex,Texture.TexCo.UV,Texture.MapTo.COL) 
                                mtex = material.getTextures()[0] 
                                mtex.blendmode = Texture.BlendModes.MULTIPLY 
                                mtex.mapto |= Texture.MapTo.ALPHA 
                                material.mode |= Material.Modes.ZTRANSP 
                                #img[premul] = True; 
                                 
                        # Set material_index 
                        material_index[i] = len(material_list) 
                        for j in range(i + 1,len(Materials)): 
                                if data[0:12] == Materials[j][0:12] and (data[14] == Materials[j][14] or len(Materials[j][14]) == 0 ): 
                                        print "Mat%d Joined Mat%d" % (j,i) 
                                        material_index[j] = len(material_list) 
                 
                        material_list.append(material)  
                 
        mesh.materials = material_list 
        mesh.update() 
 
        #Set Material 
        face_index = 0 
        if DEBUG: 
                print "Total Faces %d" % len(mesh.faces) 
        for i in range(len(Materials)): 
                data = Materials[i]                 
                if DEBUG: 
                        print "Material %d Faces %d" % (i,data[13]/3) 
                         
                if  material_index[i] > 15: 
                        face_index += data[13]/3 
                        continue 
                         
                tex = mesh.materials[material_index[i]].getTextures() 
                for local_face_index in range(data[13]/3): 
                        if FaceList[local_face_index + face_index] != None:  
                                face = mesh.faces[FaceList[local_face_index + face_index]] 
                                face.mat = material_index[i] 
                                temp_uv = []                                 
                                for vert in face.verts: 
                                        temp_uv.append(vert.uvco) 
                                face.uv = temp_uv 
                                if tex[0] != None: 
                                        face.image = tex[0].tex.image 
                face_index += data[13]/3 
                 
        mesh.update() 
         
        arm_obj.makeParentDeform([mesh_obj]) 
        scn.update(0) 
         
        #Set Weight 
        Weight = d_pmd["Weight"] 
        dic_vertgroup = {} 
        if len(arm_dic) > 0: 
                for wait_index in range(len(Weight)): 
                        t_weight = Weight[wait_index]                         
                        b1 = t_weight[0] 
                        b2 = t_weight[1] 
                        bw = t_weight[2] 
                         
                        #Err Bone Wait (ID(6,7,10-) and over Index) 
                        if b1 > len(Bones): 
                                b1 = 0 
                        if b2 > len(Bones): 
                                b2 = 0                                                                 
                        bone1 = Bones[b1] 
                        bone2 = Bones[b2]                                         
                        if bone1[3] == 6 or bone1[3] == 7 or bone1[3] > 9: 
                                b1 = bone1[1]                                                 
                                bone1 = Bones[b1] 
                        if bone2[3] == 6 or bone2[3] == 7 or bone2[3] > 9: 
                                b2 = bone2[1] 
                                bone2 = Bones[b2] 
                                 
                        b1_name = b_bones.get(b1,bone1[0]) 
                        b2_name = b_bones.get(b2,bone2[0]) 
                                 
                        if not dic_vertgroup.has_key(b1): 
                                mesh.addVertGroup(b1_name) 
                                dic_vertgroup[b1] = 1  
         
                        if not dic_vertgroup.has_key(b2): 
                                mesh.addVertGroup(b2_name) 
                                dic_vertgroup[b2] = 1 
                         
                        b1_w = float(bw) / 100 
                        b2_w = float(100 - bw) / 100 
                                                 
                        mesh.assignVertsToGroup(b1_name,[wait_index],b1_w,Mesh.AssignModes.ADD) 
                        mesh.assignVertsToGroup(b2_name,[wait_index],b2_w,Mesh.AssignModes.ADD) 
                 
                mesh.update() 
                                 
        #Shapes Key(Face) 
        Skins = d_pmd["Skin"] 
        skinbase = [] 
                 
        for skin in Skins: 
                if skin[1] == 0: 
                        if DEBUG: 
                                print "SkinBase = [%s]" % skin[0] 
                        skinbase = skin[2] 
                        mesh.insertKey() 
                        break 
                                 
        for skin_index in range(len(Skins)): 
                skin = Skins[skin_index] 
                if skin[1] == 0: 
                        continue 
                if DEBUG: 
                        print "Skin %d..." % skin_index 
 
                skindataList = skin[2]                 
                #Create patch_dic 
                patch_dic = {} 
                for skindata in skindataList: 
                        patch_dic[skindata[0]] = skindata 
                 
                for skindata_index in range(len(skinbase)): 
                        if patch_dic.has_key(skindata_index): 
                                vertex_patch = patch_dic[skindata_index] 
                                vertex_orignal_no = skinbase[skindata_index][0] 
                                mesh.verts[vertex_orignal_no].co[0] = Vertices[vertex_orignal_no][0] + vertex_patch[1] 
                                mesh.verts[vertex_orignal_no].co[1] = Vertices[vertex_orignal_no][1] + vertex_patch[2] 
                                mesh.verts[vertex_orignal_no].co[2] = Vertices[vertex_orignal_no][2] + vertex_patch[3] 
                                 
                                mesh.verts[vertex_orignal_no].co = mesh.verts[vertex_orignal_no].co * CHENGE_MATRIX 
                                 
                # Set patch data                                 
                #mesh.calcNormals()  
                mesh.update() 
                mesh.insertKey() 
                obj = mesh.key.blocks.pop() 
                obj.name = skin[0] 
                mesh.key.blocks.append(obj) 
                 
                # Restore                 
                for skindata_index in range(len(Vertices)): 
                        mesh.verts[skindata_index].co[0] = Vertices[skindata_index][0] 
                        mesh.verts[skindata_index].co[1] = Vertices[skindata_index][1] 
                        mesh.verts[skindata_index].co[2] = Vertices[skindata_index][2] 
                         
                        mesh.verts[skindata_index].co = mesh.verts[skindata_index].co * CHENGE_MATRIX 
                mesh.update() 
 
# 
# XML 
# 
# PMD<>Blender StatusFile 
# 
def getXMLText(basenode): 
        nodelist = basenode.childNodes 
        for node in nodelist: 
                if node.nodeType == node.TEXT_NODE: 
                        return node.data 
        return "" 
 
def MakeXML(d_pmd,filename): 
        # 
        # XML 
        # 
                 
        J_Face_Comment = "" 
        J_Right = "" 
        J_Left = ""                 
        xmlPath = Get('scriptsdir') + "/japanese.xml"         
        print xmlPath 
        if os.access(xmlPath, os.F_OK):                                 
                japan_dom = parse(xmlPath)         
        node_list = japan_dom.getElementsByTagName("J_Face_Comment") 
        for node in node_list: 
                J_Face_Comment = getXMLText(node) 
        node_list = japan_dom.getElementsByTagName("J_Right") 
        for node in node_list: 
                J_Right = getXMLText(node) 
        node_list = japan_dom.getElementsByTagName("J_Left") 
        for node in node_list: 
                J_Left = getXMLText(node) 
         
        #impl = getDOMImplementation()  
        #dom = impl.createDocument("","pmdstatus ", "")  
        tempXML = """<?xml version="1.0" encoding="UTF-8"?> 
        <pmdstatus> 
        </pmdstatus> 
        """ 
        dom = parseString(tempXML) 
        domroot = dom.documentElement 
         
        # 
        # Header         
        #         d_pmd["Header"] = (hdr_string , hdr_version , model_name, comment) 
        #         
        PMD_HEADER = d_pmd["Header"]                 
        #Add Info 
        infonode = dom.createElement("pmdinfo") 
        domroot.appendChild(infonode) 
        # Add Title 
        titlenode = dom.createElement("title") 
        titletext = dom.createTextNode(PMD_HEADER[2].rstrip()) 
        titlenode.appendChild(titletext) 
        infonode.appendChild(titlenode) 
        # Add Comment 
        commentnode = dom.createElement("comment") 
        commenttext = dom.createTextNode(PMD_HEADER[3].rstrip()) 
        commentnode.appendChild(commenttext) 
        infonode.appendChild(commentnode) 
         
        # 
        # Face 
        #        d_pmd["Skin"] =List((name,) + t_parm + (l_vert,)) 
        # 
        PMD_FACES = d_pmd["Skin"] 
        #Add Expression 
        expressionNode = dom.createElement("expression") 
        domroot.appendChild(expressionNode) 
        expressionComment = dom.createComment(J_Face_Comment.encode("UTF-8")) 
        expressionNode.appendChild(expressionComment) 
        index = 1 
        # Add Faces         
        for PMD_FACE in PMD_FACES: 
                facenode = dom.createElement("face") 
                facenode.setAttribute("index",str(index)) 
                facenode.setAttribute("group",str(PMD_FACE[1])) 
                faceText = dom.createTextNode(PMD_FACE[0].rstrip()) 
                facenode.appendChild(faceText) 
                expressionNode.appendChild(facenode) 
                index += 1 
                 
        # 
        # Labels 
        #        d_pmd["SkinIndex"] = list(skin_index) 
        #        d_pmd["DispName"] = list(name)         
        #        d_pmd["BoneIndex"] = list(bone,type)         
        #        d_pmd["Bone"] = list((name,) + t_data) 
        # 
        SKININDEX = d_pmd["SkinIndex"] 
        DISPNAME = d_pmd["DispName"]  
        BONEINDEX = d_pmd["BoneIndex"] 
        BONE = d_pmd["Bone"] 
        IKBONES = d_pmd["IK"] 
        BlenderBone = {} 
         
        findR = re.compile(J_Right) 
        findL = re.compile(J_Left) 
         
        # Add Labels 
        labelsnode = dom.createElement("labels") 
        domroot.appendChild(labelsnode) 
        # Add Label 
        for Label_Index in range(len(DISPNAME)): 
                labelnode = dom.createElement("label") 
                labelnode.setAttribute("name",DISPNAME[Label_Index].rstrip()) 
                labelnode.setAttribute("index",str(Label_Index)) 
                labelsnode.appendChild(labelnode) 
                index = 0                                 
                for BONE_ID in BONEINDEX: 
                        if BONE_ID[1] == Label_Index +1 : 
                                #  Add Bone 
                                bonenode = dom.createElement("bone") 
                                pmdBoneName = BONE[BONE_ID[0]][0].decode('UTF-8') 
                                blenderBoneName = pmdBoneName 
                                if (findR.search(pmdBoneName)): 
                                        blenderBoneName = findR.sub("",pmdBoneName) + "_R" 
                                elif(findL.search(pmdBoneName)): 
                                        blenderBoneName = findL.sub("",pmdBoneName) + "_L"                                         
                                BlenderBone[BONE_ID[0]] = (blenderBoneName.encode('UTF-8'))                                 
                                boneText = dom.createTextNode(pmdBoneName.encode('UTF-8')) 
                                bonenode.setAttribute("index",str(index)) 
                                bonenode.setAttribute("blenderName",blenderBoneName.encode('UTF-8')) 
                                bonenode.setAttribute("kind",str(BONE[BONE_ID[0]][3])) 
                                index += 1 
                                bonenode.appendChild(boneText) 
                                labelnode.appendChild(bonenode) 
                                 
        # Add Hidden Bones                 
        labelnode =  dom.createElement("label") 
        labelnode.setAttribute("name","Hidden") 
        labelnode.setAttribute("index",str(len(DISPNAME))) 
        labelsnode.appendChild(labelnode) 
        index = 0 
        for bone_index in range(len(BONE)): 
                bone_Item = BONE[bone_index] 
                if bone_index not in BlenderBone.keys() and bone_Item[3] not in (6,7) : 
                        #  Add Bone 
                        bonenode = dom.createElement("bone") 
                        pmdBoneName = bone_Item[0].decode('UTF-8') 
                        blenderBoneName = pmdBoneName                                 
                        boneText = dom.createTextNode(pmdBoneName.encode('UTF-8')) 
                        bonenode.setAttribute("index",str(index)) 
                        bonenode.setAttribute("blenderName",blenderBoneName.encode('UTF-8')) 
                        bonenode.setAttribute("kind",str(bone_Item[3])) 
                        index += 1 
                        bonenode.appendChild(boneText) 
                        labelnode.appendChild(bonenode) 
                         
                 
        # ADD IKs         
        IKbonesnode = dom.createElement("IKbones") 
        domroot.appendChild(IKbonesnode) 
        index = 0 
        for IKBONE in IKBONES: 
                IKbonenode = dom.createElement("IKbone") 
                parent_id = BONE[IKBONE[0]][1] 
                if parent_id == 65535: 
                        parent_name = "World" 
                else: 
                        parent_name = BlenderBone.get(parent_id,BONE[parent_id][0]) 
                IKbonenode.setAttribute("index",str(index))                         
                IKbonenode.setAttribute("parent",parent_name) 
                IKbonenode.setAttribute("IK1",str(IKBONE[2])) 
                IKbonenode.setAttribute("IK2",str(IKBONE[3])) 
                IKboneText = dom.createTextNode(BlenderBone.get(IKBONE[0],BONE[IKBONE[0]][0])) 
                IKbonenode.appendChild(IKboneText) 
                IKbonesnode.appendChild(IKbonenode) 
                index += 1 
         
 
        #print dom.toxml()         
        f=open(filename, 'w') 
        dom.writexml(f) 
        f.close() 
         
        dom.unlink() 
 
        return BlenderBone 
# 
#Inport PMD 
# 
 
def import_pmd(filename): 
 
        # Load PMD Model 
        d_pmd = pmd_2.ReadFile(filename) 
         
        # Title 
        title = d_pmd["Header"][2]        # Get title 
 
        # EditModeCheck 
        mode_edit = Window.EditMode()  
        if mode_edit: Window.EditMode(0) 
 
        # XML 
        print "XML Create..." 
        xmlPath = os.path.splitext(filename)[0] + '.xml' 
        b_bones =  MakeXML(d_pmd,xmlPath) 
 
        # ADD Model 
        print "Model Loading..."         
        MakeObject(d_pmd,b_bones,filename) 
         
        #Set EditMode 
        if mode_edit: Window.EditMode(1) 
 
        print "done." 
 
# main 
if __name__=='__main__': 
        Window.FileSelector(import_pmd, 'Import PMD file',sys.makename(ext='.pmd')) |   
 
  
 |