

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')) |
|