Blender2pmd.zip
(17.71 KB, 下载次数: 141)
安裝方法:解壓後直接把 import / export.py 、pmd_2.py 和 Jpanese.xml檔放在
Program Files\Blender Foundation\Blender\.blender\scripts 內就可以了..
至於 VMDMotionImporter 依個人理解這玩兒大概是為那些想直接在 Blender 應用 MMD 動作舞步做動畫而特別編寫出來的東西 ,不下載也沒問題。
另附 Metasequoia > Blender 的script
下戴地址及說明:
http://luxla.net/project/mqo
-----------------------------------------------------------------------------
Metasequoia 用 PmdImporter
下戴地址及說明 ,請點擊右上方的 "ダウンロード" :
http://xelf.info/metasequoia/
------------------------------------------------------------------------------
LightWave 用 AS PMD Helper 、 Metasequoia > LightWave 之類的插件
下戴地址及說明:
http://www.neko.ne.jp/~asagi/P2P/Plugins/index.html
---------------------------------------------------------------------------------
3Ds max 相關插件幾個月前搜查過我記得是有的, 但現在已經找不回抱歉了..
不過這個英文論壇 2 樓的回覆有提及如何把PMD檔修改成可讀的文件 ,但他們討論的是與MMD無關的話題 ,
請自己衡量一下資料的實用性..
http://www.wildfiregames.com/forum/index.php?showtopic=12886
多數的3D程式都內置了3Ds max、Maya 之類的格式轉換工具 ,可考慮一下要不要先將pmd 導入Blender 再轉成其他格式呢?
--------------------------------- 參考資料 -----------------------------------
-----------------------------------------------------------------------------------
英 :
http://sites.google.com/site/mikumikubeat/makemodel
日:
http://www.geocities.jp/hatsune_no_mirai/#TechInfo
=========================================
另外是關於PMD EDITOR 無法正常運作的問題
其解決辦法請見:
http://bbs.ivocaloid.com/thread-64340-1-1.html
http://vmmd.wikia.com/wiki/Miku_ ... tor#Other_Downloads
基本上要你需要安裝Directx (9.0c 或以上版本) 和 .NET Framework (2.0或以上的版本) EDITOR才能正常運作 ,
根據連結所指如果閣下安裝DirectX 9.0c Redistributable 後依然無法除錯的話便要安裝DirectX SDK了..
.NET Framework 2.0:
http://msdn.microsoft.com/en-ca/netframework/aa731542.aspx
Directx :
http://www.microsoft.com/downloa ... en&categoryid=2
※DirectX SDK:
http://www.microsoft.com/downloa ... &displaylang=en
=====================================================
※最後是在下收集的道具分享帖:
http://bbs.ivocaloid.com/thread-56702-1-4.html
※不負責任的物理演算設置教學:
http://bbs.ivocaloid.com/viewthr ... mp;page=1#pid537532
以上^

附件:
Blender2pmd.zip (2010/4/27 12:35, 17.71 KB) / 下载次数 141
http://bbs.ivocaloid.com/forum.php?mod=attachment&aid=MjM2ODJ8ZTMzZDVmZWN8MTc1MDIwNTEyMHwwfDA%3D

图片附件:
Ble_S1.PNG (2010/4/27 12:36, 478.44 KB) / 下载次数 15
http://bbs.ivocaloid.com/forum.php?mod=attachment&aid=MjM2ODN8YzU4MGYwZmF8MTc1MDIwNTEyMHwwfDA%3D


图片附件:
G01.png (2010/4/27 12:37, 57.64 KB) / 下载次数 15
http://bbs.ivocaloid.com/forum.php?mod=attachment&aid=MjM2ODR8ZTc3YWJiNDR8MTc1MDIwNTEyMHwwfDA%3D

作者: 啖红
时间: 2010/4/27 19:01
555,楼主谢谢你= =求交往
作者: 啖红
时间: 2010/4/27 20:07
5555,千辛万苦终于能使用了,但是却提示一下内容……
Compiled with Python version 2.6.2.
Checking for installed Python... got it!
vert = 9036
poly = 44991
material = 17
Bone = 122
IK = 7
Skin = 16
SkinIndex = 15
DispName = 7
BoneIndex = 81
Title = 弶壒儈僋
XML Create...
D:\Blender Foundation\Blender\.blender\scripts/japanese.xml
Traceback (most recent call last):
File "D:\Blender Foundation\Blender\.blender\scripts\import_2_pmd.py", line 53
0, in import_pmd
b_bones = MakeXML(d_pmd,xmlPath)
File "D:\Blender Foundation\Blender\.blender\scripts\import_2_pmd.py", line 44
7, in MakeXML
print " %s => %s " % (pmdBoneName,blenderBoneName)
UnicodeEncodeError: 'gbk' codec can't encode character u'\uff88' in position 1:
illegal multibyte sequence
楼主可以帮帮我么……

作者: 月迷枫
时间: 2010/4/27 20:34
在我千辛万苦花费了500MB的流量解决了这个问题以后,看到了你发的这个帖子……orz 不过还是谢谢你了……以后请多多关照……
作者: yxmline
时间: 2010/4/27 21:09
本帖最后由 yxmline 于 2010-4-27 21:10 编辑
5555,千辛万苦终于能使用了,但是却提示一下内容……
Compiled with Python version 2.6.2.
Checking for ...
啖红 发表于 2010-4-27 20:07 

语言问题
作者: 啖红
时间: 2010/4/27 21:28
请问怎么解决……
作者: dgsrz
时间: 2010/4/27 22:54
本帖最后由 dgsrz 于 2010-4-27 23:28 编辑
问题出在字符串的转换上。要把程序语言转成日文。或者可以试试在出错的代码页中申明默认字符集。
PYTHON平台我不熟悉,论坛里有研究这个的,可以再深入讲解下。
作者: 啖红
时间: 2010/4/28 11:29
我试了下在代码前面加上
#!/usr/bin/env python
# -*- coding: utf-8 -*-
但是还是不能…………………………想哭了……help me~~~~~~
作者: ※紡紅
时间: 2010/4/28 12:47
本帖最后由 ※紡紅 于 2010-4-28 13:50 编辑
代碼什麼的恕我無能為力啦 ,
不過那個 UnicodeEncodeError 問題倒是在我轉了區後就再沒出現過 ,
mmm..
還是說其實是我害了你 (´・∀・` ;;) ,
因為原file內還有個叫做 Japanese.xml 的檔案是要放進blender的 scripts file內..
我見那個mikumikubeat 的指引是說把 import /export 、pmd_2.py 放上去再轉語言就可了,
但查閱檔案本身的使用說明時找到這句:
・import_2_pmd.py,export_2_pmd.py,pmd_2.py,Jpanese.xmlをblenderのスクリプトフォルダに入れ、Blenderを起動します。
也許啖红醬先把那個檔案踹到scripts file 看看,
不行的話轉一轉區再試試吧..
p.s.
為什麼我下載自己放上來的東西都要扣茄子啊啊啊~
作者: MI
时间: 2010/4/28 19:04
本帖最后由 MI 于 2010-4-28 19:09 编辑
多數的3D程式都內置了3Ds max、Maya 之類的格式轉換工具 ,可考慮一下要不要先將pmd 導入Blender 再轉成其他格式呢?
这句是重点 Blender 其实最主要的作用就是扩展转换 当个接口!
话说~~ 还有事情要说下 ~ 那就是请不要用photobucket来外联图片 因为很多北方的网通用户是看不到的…… 因为都被网通(联通)盾了……
mmd区貌似没有什么像调教区那样的资料整理贴…… 谁有兴趣的话做个我给奖励……
MMD相关内容索引 [6.3 更新] 到时我把这帖子撤了……
作者: 啖红
时间: 2010/4/28 20:32
谢谢楼上各位大大,不够我自己很暴力的搞定了……
如果出现以上这个问题的朋友,你可以用记事本打开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'))
作者: admin
时间: 2010/4/28 22:53
LS的请编辑成代码段……
作者: dgsrz
时间: 2010/4/28 23:18
本帖最后由 dgsrz 于 2010-4-28 23:33 编辑
资料整理贴星期天可以搞个
还有某代码君…运行稳定否?
作者: xxyo
时间: 2010/4/28 23:44

膜拜一下
作者: dgsrz
时间: 2010/4/28 23:52
回复 14# xxyo
然后乃会发现这里技术宅灰常多…
作者: ※紡紅
时间: 2010/4/29 09:19
剛才對比過啖红桑修改的腳本 ,大概明白了改動的地方..
如果測試後沒什麼大問題的話我可以把這個修改本放上主樓的資料中嗎?
另外不知各位代碼君有沒有興趣也研究一下關於匯出的問題?
因為從blender 匯出的pmd改裝模型可能又是語言問題表示枠之類的會被清空而不能正常導入動作.
沒錯這些問題是可以用PMD Editor來修正 ,但變相會令製作步驟變得更繁複和費時..
先謝過各位了.
作者: ※紡紅
时间: 2010/4/29 09:30
回复 10# MI
喔原來國內不是所有地區都用到photobucket , 我會多加注意了.
資料整理的工作看來dgsrz 先生?小姐?? 會負責的那我就不跟他搶生意了呵呵..
作者: yxmline
时间: 2010/5/2 12:26
对11楼 代码显示
- #!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'))
复制代码
作者: soulhack
时间: 2010/5/31 02:59
本帖最后由 soulhack 于 2010-5-31 03:02 编辑
blender 装好 py装好 ,导入py脚本后 导入多了一个pmd 格式导入,一点就报脚本出错是啥情况啊。。lz求解
想要lat式2.2的模型。。。obj就行了。。
作者: soulhack
时间: 2010/5/31 16:11
用了11楼的代码
。。。还是悲剧

图片附件:
77.jpg (2010/5/31 16:10, 67.7 KB) / 下载次数 12
http://bbs.ivocaloid.com/forum.php?mod=attachment&aid=MjYzNzV8ZmZiM2QxM2F8MTc1MDIwNTEyMHwwfDA%3D

作者: soulhack
时间: 2010/5/31 21:12
解决了。在vm虚拟机里面装xp日本版 就正常了
作者: ※紡紅
时间: 2010/6/1 13:31
soulhack自己解決就好, 幫不上忙了

作者: lastdemon
时间: 2010/6/3 12:21
好东西……永远顶置吧,先收藏,以后慢慢看……
作者: 和平行者
时间: 2010/6/30 14:05
回复 3# 啖红
好东西!
作者: 和平行者
时间: 2010/6/30 16:16
把MAX文件转换为PMD文件,用哪个?
作者: 5026162
时间: 2010/7/5 06:46
路过。。。。。。。。。。。。。
作者: 5026162
时间: 2010/7/5 06:47
求解怎么弄回PMD
作者: lastdemon
时间: 2010/7/21 09:41
-w-!导入六角大王的KAITO模型进MMD去~
希望能成功……
(其实您说了很多我都不是很懂……我是3D白痴)
作者: 甩葱的女孩
时间: 2010/7/27 19:44
茫然。。。。。。
什么都没看懂。。。。。
作者: crazytsui
时间: 2013/5/9 14:10
平日用開3ds max
開不了.pmd
所以,謝了喔~
欢迎光临 iVocaloid论坛 (http://bbs.ivocaloid.com/) |
Powered by Discuz! X2 |