搜索

iVocaloid论坛

查看: 34235|回复: 29
打印 上一主题 下一主题

PMD格式轉換工具 + EDITOR 除錯方法補充 [复制链接]

根本就是個變態紳士

Lv.4-触手吸盘

Rank: 4Rank: 4

0
0
0


UID: 61004
权限: 30
发帖: 139 (0精)
积分: 272
章鱼: 5
大葱: 4
茄子: 1744
注册:2009/12/21
存在感:111

茄子饲养者

跳转到指定楼层
[1L]楼主
※紡紅 发表于 2010/4/27 12:44:12 |只看该作者 |倒序浏览
本帖最后由 ※紡紅 于 2010-6-14 15:28 编辑

因為已經收到好幾位同學就MMD話題的查詢所以我直接開一帖來回覆好了..
如果發現有什麼錯誤或需要補充的地方請加以指正 ..



先聲明本人對3D軟件的認知和應用技巧都是從網上的英文教材中吸取 ,未曾受過任何專業指導 ,所以一切關於建模或者匯出pmd之類的問題請不要問我( 拖走.. )。路過的同學可能會有個疑問就是明明都有EDITOR啦為什麼還要搞那麼多事把模型轉來轉去貪好玩嗎= =



G01.png
答案就是有很多編輯模型的工序比如說補洞都不能用 EDITOR 來完成,
而且所有的 PMD 模型都是用3D軟件如3Ds max、六角大王、 Metasequoia之類的製作出來 ,
所以你也可以利用這些軟件來製作屬於自己的模型/道具 ..



Ble_S1.PNG
※咱家的Blender 界面是這樣子的..    (某不要面茄废:這個才是茄子殿下的裸體吧..XDDD)  




======================================

廢話講完了 ,以下為在下整理出來關於PMD格式轉換工具的資料 ,
國內的同學可能需要翻牆才能造訪部份網站 :






PMD格式轉換


Blender 用 PMD2Blender

注意一點 PMD2Blender 這個script需要用到相同版本的Blender程式和Python ,同時亦需要把程式的語言轉成日文。( 於是某笨蛋之前就是一直卡在Python的關卡上.. )



下戴地址( 版本需求為 blender2.49b / Python2.62):
http://jbbs.livedoor.jp/bbs/read.cgi/music/23040/1243770114/113

Blender2pmd.zip (17.71 KB, 下载次数: 140)


安裝方法:解壓後直接把 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



以上^
1

查看全部评分


知识共享许可协议 除非另有声明,本帖内容采用 署名-非商业-相同方式共享 3.0 许可协议 授权,且需注明出处,所有权利归发帖人。

使用道具 举报

Rank: 1

0
0
0


UID: 64014
权限: 5
发帖: 7 (0精)
积分: 7
章鱼: 0
大葱: 0
茄子: 46
注册:2010/4/26
存在感:99
[2L]沙发
啖红 发表于 2010/4/27 19:01:54 |只看该作者
555,楼主谢谢你= =求交往

使用道具 举报

Rank: 1

0
0
0


UID: 64014
权限: 5
发帖: 7 (0精)
积分: 7
章鱼: 0
大葱: 0
茄子: 46
注册:2010/4/26
存在感:99
[3L]板凳
啖红 发表于 2010/4/27 20:07:59 |只看该作者
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

楼主可以帮帮我么……

使用道具 举报

Rank: 2Rank: 2

0
0
0


UID: 64012
权限: 10
发帖: 7 (0精)
积分: 13
章鱼: 0
大葱: 0
茄子: 92
注册:2010/4/26
存在感:100
[4L]地板
月迷枫 发表于 2010/4/27 20:34:44 |只看该作者
在我千辛万苦花费了500MB的流量解决了这个问题以后,看到了你发的这个帖子……orz 不过还是谢谢你了……以后请多多关照……

使用道具 举报

Rank: 3

0
9
0


UID: 10859
权限: 20
发帖: 164 (0精)
积分: 184
章鱼: 0
大葱: 10
茄子: 886
注册:2008/6/15
存在感:108
[5L]萝莉
yxmline 发表于 2010/4/27 21:09:20 |只看该作者
本帖最后由 yxmline 于 2010-4-27 21:10 编辑
5555,千辛万苦终于能使用了,但是却提示一下内容……
Compiled with Python version 2.6.2.
Checking for  ...
啖红 发表于 2010-4-27 20:07


语言问题
死人

使用道具 举报

Rank: 1

0
0
0


UID: 64014
权限: 5
发帖: 7 (0精)
积分: 7
章鱼: 0
大葱: 0
茄子: 46
注册:2010/4/26
存在感:99
啖红 发表于 2010/4/27 21:28:09 |只看该作者
请问怎么解决……

使用道具 举报

不是米库

Lv.4-触手吸盘

Rank: 4Rank: 4

0
3
0


UID: 62132
权限: 30
发帖: 244 (1精)
积分: 488
章鱼: 5
大葱: 22
茄子: 1350
注册:2010/2/27
存在感:104

创作者

[7L]大姐姐
dgsrz 发表于 2010/4/27 22:54:49 |只看该作者
本帖最后由 dgsrz 于 2010-4-27 23:28 编辑

问题出在字符串的转换上。要把程序语言转成日文。或者可以试试在出错的代码页中申明默认字符集。
PYTHON平台我不熟悉,论坛里有研究这个的,可以再深入讲解下。

使用道具 举报

Rank: 1

0
0
0


UID: 64014
权限: 5
发帖: 7 (0精)
积分: 7
章鱼: 0
大葱: 0
茄子: 46
注册:2010/4/26
存在感:99
[8L]实妹
啖红 发表于 2010/4/28 11:29:00 |只看该作者
我试了下在代码前面加上
#!/usr/bin/env python
# -*- coding: utf-8 -*-
但是还是不能…………………………想哭了……help me~~~~~~

使用道具 举报

根本就是個變態紳士

Lv.4-触手吸盘

Rank: 4Rank: 4

0
0
0


UID: 61004
权限: 30
发帖: 139 (0精)
积分: 272
章鱼: 5
大葱: 4
茄子: 1744
注册:2009/12/21
存在感:111

茄子饲养者

※紡紅 发表于 2010/4/28 12:47:18 |只看该作者
本帖最后由 ※紡紅 于 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.
為什麼我下載自己放上來的東西都要扣茄子啊啊啊~

使用道具 举报

MyImagination

Lv.255-超级版主

Rank: 11Rank: 11Rank: 11

0
401
3


UID: 4130
权限: 150
属性: 弾性
发帖: 3887 (1精)
积分: 8046
章鱼: 127
大葱: 154
茄子: 10594
注册:2008/2/12
存在感:1103
[10L]幼驯染
 MI  发表于 2010/4/28 19:04:14 |只看该作者
本帖最后由  MI  于 2010-4-28 19:09 编辑
多數的3D程式都內置了3Ds max、Maya 之類的格式轉換工具 ,可考慮一下要不要先將pmd 導入Blender 再轉成其他格式呢?

这句是重点 Blender 其实最主要的作用就是扩展转换 当个接口!

话说~~ 还有事情要说下 ~  那就是请不要用photobucket来外联图片 因为很多北方的网通用户是看不到的…… 因为都被网通(联通)盾了……

mmd区貌似没有什么像调教区那样的资料整理贴…… 谁有兴趣的话做个我给奖励……
MMD相关内容索引 [6.3 更新] 到时我把这帖子撤了……

使用道具 举报

Rank: 1

0
0
0


UID: 64014
权限: 5
发帖: 7 (0精)
积分: 7
章鱼: 0
大葱: 0
茄子: 46
注册:2010/4/26
存在感:99
[11L]怪蜀黍
啖红 发表于 2010/4/28 20:32:31 |只看该作者
谢谢楼上各位大大,不够我自己很暴力的搞定了……
如果出现以上这个问题的朋友,你可以用记事本打开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

估计患拖延症了

~论坛管理员~

Rank: 15Rank: 15Rank: 15

-84
-87
-99


UID: 1
权限: 200
属性: 不明
发帖: 1596 (0精)
积分: 746
章鱼: -91
大葱: 499
茄子: 4814
注册:1970/1/1
存在感:3478
12#
admin 发表于 2010/4/28 22:53:58 |只看该作者
复制代码
LS的请编辑成代码段……
怪淫们~ 一起征服世界吧~ ( ̄y▽ ̄)╭ Ohohoho....

使用道具 举报

不是米库

Lv.4-触手吸盘

Rank: 4Rank: 4

0
3
0


UID: 62132
权限: 30
发帖: 244 (1精)
积分: 488
章鱼: 5
大葱: 22
茄子: 1350
注册:2010/2/27
存在感:104

创作者

13#
dgsrz 发表于 2010/4/28 23:18:34 |只看该作者
本帖最后由 dgsrz 于 2010-4-28 23:33 编辑

资料整理贴星期天可以搞个
还有某代码君…运行稳定否?

使用道具 举报

Rank: 2Rank: 2

0
0
0


UID: 62281
权限: 10
发帖: 28 (0精)
积分: 23
章鱼: 0
大葱: 0
茄子: 60
注册:2010/3/8
存在感:100
14#
xxyo 发表于 2010/4/28 23:44:28 |只看该作者
膜拜一下

使用道具 举报

不是米库

Lv.4-触手吸盘

Rank: 4Rank: 4

0
3
0


UID: 62132
权限: 30
发帖: 244 (1精)
积分: 488
章鱼: 5
大葱: 22
茄子: 1350
注册:2010/2/27
存在感:104

创作者

15#
dgsrz 发表于 2010/4/28 23:52:20 |只看该作者
回复 14# xxyo


    然后乃会发现这里技术宅灰常多…

使用道具 举报

根本就是個變態紳士

Lv.4-触手吸盘

Rank: 4Rank: 4

0
0
0


UID: 61004
权限: 30
发帖: 139 (0精)
积分: 272
章鱼: 5
大葱: 4
茄子: 1744
注册:2009/12/21
存在感:111

茄子饲养者

16#
※紡紅 发表于 2010/4/29 09:19:38 |只看该作者
剛才對比過啖红桑修改的腳本 ,大概明白了改動的地方..
如果測試後沒什麼大問題的話我可以把這個修改本放上主樓的資料中嗎?


另外不知各位代碼君有沒有興趣也研究一下關於匯出的問題?
因為從blender 匯出的pmd改裝模型可能又是語言問題表示枠之類的會被清空而不能正常導入動作.
沒錯這些問題是可以用PMD Editor來修正 ,但變相會令製作步驟變得更繁複和費時..

先謝過各位了.

使用道具 举报

根本就是個變態紳士

Lv.4-触手吸盘

Rank: 4Rank: 4

0
0
0


UID: 61004
权限: 30
发帖: 139 (0精)
积分: 272
章鱼: 5
大葱: 4
茄子: 1744
注册:2009/12/21
存在感:111

茄子饲养者

17#
※紡紅 发表于 2010/4/29 09:30:58 |只看该作者
回复 10#  MI 

喔原來國內不是所有地區都用到photobucket , 我會多加注意了.
資料整理的工作看來dgsrz 先生?小姐?? 會負責的那我就不跟他搶生意了呵呵..

使用道具 举报

Rank: 3

0
9
0


UID: 10859
权限: 20
发帖: 164 (0精)
积分: 184
章鱼: 0
大葱: 10
茄子: 886
注册:2008/6/15
存在感:108
18#
yxmline 发表于 2010/5/2 12:26:24 |只看该作者
对11楼 代码显示
  1. #!BPY

  2. """
  3. Name: 'PMD file for MMD(.pmd) ...'
  4. Blender: 248a
  5. Group: 'Import'
  6. Tooltip: 'Import PMD file for MikuMikuDance.'
  7. """

  8. __author__= "BouKiCHi_&NANAshi"
  9. __version__= "2.12"

  10. __bpydoc__=""

  11. from Blender import *
  12. import os
  13. import re

  14. #from struct import *
  15. from xml.dom.minidom import *

  16. import pmd_2


  17. CHENGE_MATRIX = Mathutils.Matrix([1,0,0,0],[0,1,0,0],[0,0,-1,0],[0,0,0,1])

  18. DEBUG = True

  19. #
  20. # Object
  21. #
  22. #
  23. #
  24. #
  25. def MakeObject(d_pmd,b_bones,filename):

  26.         scn = Scene.GetCurrent()
  27.         title = d_pmd["Header"][2]        # Get title

  28.         #Armture  [ ( name, parent , to , kind , knum, x,y,z ) ]
  29.         arm_data = Armature.New("%s_armdata" % title)
  30.         arm_obj = scn.objects.new(arm_data,"%s_arm" % title )
  31.         arm_data.makeEditable()        
  32.         
  33.         arm_dic = {}
  34.         
  35.         Bones = d_pmd["Bone"]
  36.         IKs = d_pmd["IK"]

  37.         for BoneIndex in range(len(Bones)):
  38.                 Bone = Bones[BoneIndex]
  39.                 BoneState = Bone[3]        #kind               
  40.                 if BoneState not in (6,7) and BoneState < 10 :               
  41.                         NewArm = Armature.Editbone()
  42.                         #Name
  43.                         NewArm.name = b_bones.get(BoneIndex,Bone[0])
  44.                         #ToBone
  45.                         if Bone[3] == 9:
  46.                                 ToBone = Bones[Bones[Bone[2]][2]]                        
  47.                         elif Bone[2] == 0:
  48.                                 ToBone =(Bone[0],Bone[1],Bone[2],Bone[3],Bone[4],Bone[5],Bone[6],Bone[7]+1)
  49.                         else:        
  50.                                 ToBone = Bones[Bone[2]]
  51.                         #        
  52.                         NewArm.head = Mathutils.Vector(Bone[5],Bone[6],Bone[7]) * CHENGE_MATRIX
  53.                         NewArm.tail = Mathutils.Vector(ToBone[5],ToBone[6],ToBone[7]) * CHENGE_MATRIX
  54.                         if Bone[1] != 65535:                                
  55.                                 NewArm.parent = arm_dic.get(Bone[1],None)
  56.                                 if BoneIndex == Bones[Bone[1]][2] and Bones[Bone[1]][3] != 6 and Bones[Bone[1]][3] != 7 :
  57.                                         NewArm.options = [Armature.CONNECTED] #Connect                                       
  58.                         arm_data.bones[NewArm.name] = NewArm
  59.                         arm_dic[BoneIndex] = NewArm
  60.                 else:
  61.                         arm_dic[BoneIndex] = arm_dic[Bone[1]]

  62.         arm_data.update()
  63.         arm_data.drawType = Armature.STICK
  64.         arm_data.mirrorEdit = True
  65.         arm_data.envelopes = False
  66.         arm_obj.xRay = True
  67.         
  68.         
  69.         #IK [ ( ik,target,p1,p2,[node]) ]
  70.         pose = arm_obj.getPose()
  71.         for IK in IKs:
  72.                 IK_Terget = arm_dic[IK[0]]
  73.                 ChainLastArm = arm_dic[IK[4][0]]
  74.                 #IKArm.parent = ChainLastArm
  75.                 IK_Bone = pose.bones[ChainLastArm.name]
  76.                
  77.                 IK_Const = IK_Bone.constraints.append(Constraint.Type.IKSOLVER)
  78.                 IK_Const[Constraint.Settings.CHAINLEN] = len(IK[4])
  79.                 IK_Const[Constraint.Settings.TARGET] = arm_obj
  80.                 IK_Const[Constraint.Settings.BONE] = IK_Terget.name
  81.                
  82.                 #IKConst[Constraint.Settings.USETIP] = False
  83.                         

  84.         pose.update()
  85.         #Mesh
  86.         #Vertex [ ( x,y,z,nx,ny,nz,u,v) ]
  87.         Vertices = d_pmd["Vertex"]
  88.                
  89.         mesh = Mesh.New("Mesh")
  90.         mesh_obj = scn.objects.new(mesh)               
  91.         mesh.vertexUV = 1 #Use Vertex UV
  92.         
  93.         vertex_list = []
  94.         for vertex in Vertices:
  95.                 vertex_list.append(vertex[0:3])

  96.         mesh.verts.extend(vertex_list) #Set Vertex
  97.         
  98.         for mv,lv in zip(mesh.verts,Vertices):
  99.                 mv.co[0:3] = lv[0:3]
  100.                 mv.no[0:3] = lv[3:6]
  101.                 mv.uvco[0:] = lv[6:]
  102.                 #CHENGE_MATRIX
  103.                 mv.co = mv.co * CHENGE_MATRIX
  104.                 mv.no = mv.no * CHENGE_MATRIX
  105.                 #if mv.uvco[0] != 0:
  106.                         #print lv[6:]
  107.                 mv.uvco[1] = 1 - mv.uvco[1] #inverse v
  108.                
  109.         del vertex_list
  110.         mesh.update()

  111.         #Face         
  112.         face_TMP = []
  113.         face_list = []
  114.         
  115.         Faces = d_pmd["Poly"]
  116.         if DEBUG:
  117.                 print "ADD FACES %d" % len(Faces)
  118.         for face in Faces:
  119.                 face_TMP.append(face)
  120.                 if len(face_TMP) > 2: #length == 3                        
  121.                         face_list.append([face_TMP[0],face_TMP[2],face_TMP[1]]) #inverse nomal
  122.                         face_TMP = []
  123.         FaceList =  mesh.faces.extend(face_list,ignoreDups=True,indexList = True)
  124.         
  125.         del face_list
  126.         del face_TMP
  127.         
  128.         mesh.update()

  129.         #Material  [ ( r,g,b,a, shininess, specular(r,g,b), ambient(r,g,b) , toon, toon_edge , edges, file ) ]
  130.         Materials = d_pmd["Material"]
  131.         
  132.         material_list =[]        # New Materials
  133.         material_index = {} # Dec material_index[oldListNo] = newNum

  134.         for i in range(len(Materials)):
  135.                 if  len(material_list) > 15:
  136.                         print "Mat%d Removed" % i
  137.                         material_index[i] = 16
  138.                         continue
  139.                
  140.                 if not material_index.has_key(i):
  141.                         # Create Material
  142.                         data = Materials[i]
  143.                         material = Material.New("mat%02d" % i)
  144.                         material.setRGBCol (data[0],data[1],data[2])
  145.                         material.setAlpha (data[3])
  146.                         material.setHardness(int(data[4]))
  147.                         material.setSpecCol(data[5],data[6],data[7])
  148.                         material.setMirCol(data[8],data[9],data[10])
  149.                         material.emit = 0.6
  150.                         ## SET Texture        
  151.                         tex_fn = data[14]
  152.                         if len(tex_fn) > 0:
  153.                                 if DEBUG:
  154.                                         print "File = %s" % tex_fn
  155.                                 tex_path = sys.join(sys.dirname(filename),tex_fn)
  156.                                 if DEBUG:
  157.                                         print "Path = %s" % tex_path
  158.                                 img = Image.Load(tex_path)
  159.                                 tex = Texture.New("tex%02d" % i)
  160.                                 tex.setType("Image")                                
  161.                                 tex.image = img
  162.                                 material.setTexture(0,tex,Texture.TexCo.UV,Texture.MapTo.COL)
  163.                                 mtex = material.getTextures()[0]
  164.                                 mtex.blendmode = Texture.BlendModes.MULTIPLY
  165.                                 mtex.mapto |= Texture.MapTo.ALPHA
  166.                                 material.mode |= Material.Modes.ZTRANSP
  167.                                 #img[premul] = True;
  168.                                 
  169.                         # Set material_index
  170.                         material_index[i] = len(material_list)
  171.                         for j in range(i + 1,len(Materials)):
  172.                                 if data[0:12] == Materials[j][0:12] and (data[14] == Materials[j][14] or len(Materials[j][14]) == 0 ):
  173.                                         print "Mat%d Joined Mat%d" % (j,i)
  174.                                         material_index[j] = len(material_list)
  175.                
  176.                         material_list.append(material)
  177.                
  178.         mesh.materials = material_list
  179.         mesh.update()

  180.         #Set Material
  181.         face_index = 0
  182.         if DEBUG:
  183.                 print "Total Faces %d" % len(mesh.faces)
  184.         for i in range(len(Materials)):
  185.                 data = Materials[i]               
  186.                 if DEBUG:
  187.                         print "Material %d Faces %d" % (i,data[13]/3)
  188.                         
  189.                 if  material_index[i] > 15:
  190.                         face_index += data[13]/3
  191.                         continue
  192.                         
  193.                 tex = mesh.materials[material_index[i]].getTextures()
  194.                 for local_face_index in range(data[13]/3):
  195.                         if FaceList[local_face_index + face_index] != None:
  196.                                 face = mesh.faces[FaceList[local_face_index + face_index]]
  197.                                 face.mat = material_index[i]
  198.                                 temp_uv = []                                
  199.                                 for vert in face.verts:
  200.                                         temp_uv.append(vert.uvco)
  201.                                 face.uv = temp_uv
  202.                                 if tex[0] != None:
  203.                                         face.image = tex[0].tex.image
  204.                 face_index += data[13]/3
  205.                
  206.         mesh.update()
  207.         
  208.         arm_obj.makeParentDeform([mesh_obj])
  209.         scn.update(0)
  210.         
  211.         #Set Weight
  212.         Weight = d_pmd["Weight"]
  213.         dic_vertgroup = {}
  214.         if len(arm_dic) > 0:
  215.                 for wait_index in range(len(Weight)):
  216.                         t_weight = Weight[wait_index]                        
  217.                         b1 = t_weight[0]
  218.                         b2 = t_weight[1]
  219.                         bw = t_weight[2]
  220.                         
  221.                         #Err Bone Wait (ID(6,7,10-) and over Index)
  222.                         if b1 > len(Bones):
  223.                                 b1 = 0
  224.                         if b2 > len(Bones):
  225.                                 b2 = 0                                                               
  226.                         bone1 = Bones[b1]
  227.                         bone2 = Bones[b2]                                       
  228.                         if bone1[3] == 6 or bone1[3] == 7 or bone1[3] > 9:
  229.                                 b1 = bone1[1]                                                
  230.                                 bone1 = Bones[b1]
  231.                         if bone2[3] == 6 or bone2[3] == 7 or bone2[3] > 9:
  232.                                 b2 = bone2[1]
  233.                                 bone2 = Bones[b2]
  234.                                 
  235.                         b1_name = b_bones.get(b1,bone1[0])
  236.                         b2_name = b_bones.get(b2,bone2[0])
  237.                                 
  238.                         if not dic_vertgroup.has_key(b1):
  239.                                 mesh.addVertGroup(b1_name)
  240.                                 dic_vertgroup[b1] = 1
  241.         
  242.                         if not dic_vertgroup.has_key(b2):
  243.                                 mesh.addVertGroup(b2_name)
  244.                                 dic_vertgroup[b2] = 1
  245.                         
  246.                         b1_w = float(bw) / 100
  247.                         b2_w = float(100 - bw) / 100
  248.                                                 
  249.                         mesh.assignVertsToGroup(b1_name,[wait_index],b1_w,Mesh.AssignModes.ADD)
  250.                         mesh.assignVertsToGroup(b2_name,[wait_index],b2_w,Mesh.AssignModes.ADD)
  251.                
  252.                 mesh.update()
  253.                                 
  254.         #Shapes Key(Face)
  255.         Skins = d_pmd["Skin"]
  256.         skinbase = []
  257.                
  258.         for skin in Skins:
  259.                 if skin[1] == 0:
  260.                         if DEBUG:
  261.                                 print "SkinBase = [%s]" % skin[0]
  262.                         skinbase = skin[2]
  263.                         mesh.insertKey()
  264.                         break
  265.                                 
  266.         for skin_index in range(len(Skins)):
  267.                 skin = Skins[skin_index]
  268.                 if skin[1] == 0:
  269.                         continue
  270.                 if DEBUG:
  271.                         print "Skin %d..." % skin_index

  272.                 skindataList = skin[2]               
  273.                 #Create patch_dic
  274.                 patch_dic = {}
  275.                 for skindata in skindataList:
  276.                         patch_dic[skindata[0]] = skindata
  277.                
  278.                 for skindata_index in range(len(skinbase)):
  279.                         if patch_dic.has_key(skindata_index):
  280.                                 vertex_patch = patch_dic[skindata_index]
  281.                                 vertex_orignal_no = skinbase[skindata_index][0]
  282.                                 mesh.verts[vertex_orignal_no].co[0] = Vertices[vertex_orignal_no][0] + vertex_patch[1]
  283.                                 mesh.verts[vertex_orignal_no].co[1] = Vertices[vertex_orignal_no][1] + vertex_patch[2]
  284.                                 mesh.verts[vertex_orignal_no].co[2] = Vertices[vertex_orignal_no][2] + vertex_patch[3]
  285.                                 
  286.                                 mesh.verts[vertex_orignal_no].co = mesh.verts[vertex_orignal_no].co * CHENGE_MATRIX
  287.                                 
  288.                 # Set patch data                                
  289.                 #mesh.calcNormals()
  290.                 mesh.update()
  291.                 mesh.insertKey()
  292.                 obj = mesh.key.blocks.pop()
  293.                 obj.name = skin[0]
  294.                 mesh.key.blocks.append(obj)
  295.                
  296.                 # Restore               
  297.                 for skindata_index in range(len(Vertices)):
  298.                         mesh.verts[skindata_index].co[0] = Vertices[skindata_index][0]
  299.                         mesh.verts[skindata_index].co[1] = Vertices[skindata_index][1]
  300.                         mesh.verts[skindata_index].co[2] = Vertices[skindata_index][2]
  301.                         
  302.                         mesh.verts[skindata_index].co = mesh.verts[skindata_index].co * CHENGE_MATRIX
  303.                 mesh.update()

  304. #
  305. # XML
  306. #
  307. # PMD<>Blender StatusFile
  308. #
  309. def getXMLText(basenode):
  310.         nodelist = basenode.childNodes
  311.         for node in nodelist:
  312.                 if node.nodeType == node.TEXT_NODE:
  313.                         return node.data
  314.         return ""

  315. def MakeXML(d_pmd,filename):
  316.         #
  317.         # XML
  318.         #
  319.                
  320.         J_Face_Comment = ""
  321.         J_Right = ""
  322.         J_Left = ""               
  323.         xmlPath = Get('scriptsdir') + "/japanese.xml"        
  324.         print xmlPath
  325.         if os.access(xmlPath, os.F_OK):                                
  326.                 japan_dom = parse(xmlPath)        
  327.         node_list = japan_dom.getElementsByTagName("J_Face_Comment")
  328.         for node in node_list:
  329.                 J_Face_Comment = getXMLText(node)
  330.         node_list = japan_dom.getElementsByTagName("J_Right")
  331.         for node in node_list:
  332.                 J_Right = getXMLText(node)
  333.         node_list = japan_dom.getElementsByTagName("J_Left")
  334.         for node in node_list:
  335.                 J_Left = getXMLText(node)
  336.         
  337.         #impl = getDOMImplementation()
  338.         #dom = impl.createDocument("","pmdstatus ", "")
  339.         tempXML = """<?xml version="1.0" encoding="UTF-8"?>
  340.         <pmdstatus>
  341.         </pmdstatus>
  342.         """
  343.         dom = parseString(tempXML)
  344.         domroot = dom.documentElement
  345.         
  346.         #
  347.         # Header        
  348.         #         d_pmd["Header"] = (hdr_string , hdr_version , model_name, comment)
  349.         #        
  350.         PMD_HEADER = d_pmd["Header"]               
  351.         #Add Info
  352.         infonode = dom.createElement("pmdinfo")
  353.         domroot.appendChild(infonode)
  354.         # Add Title
  355.         titlenode = dom.createElement("title")
  356.         titletext = dom.createTextNode(PMD_HEADER[2].rstrip())
  357.         titlenode.appendChild(titletext)
  358.         infonode.appendChild(titlenode)
  359.         # Add Comment
  360.         commentnode = dom.createElement("comment")
  361.         commenttext = dom.createTextNode(PMD_HEADER[3].rstrip())
  362.         commentnode.appendChild(commenttext)
  363.         infonode.appendChild(commentnode)
  364.         
  365.         #
  366.         # Face
  367.         #        d_pmd["Skin"] =List((name,) + t_parm + (l_vert,))
  368.         #
  369.         PMD_FACES = d_pmd["Skin"]
  370.         #Add Expression
  371.         expressionNode = dom.createElement("expression")
  372.         domroot.appendChild(expressionNode)
  373.         expressionComment = dom.createComment(J_Face_Comment.encode("UTF-8"))
  374.         expressionNode.appendChild(expressionComment)
  375.         index = 1
  376.         # Add Faces        
  377.         for PMD_FACE in PMD_FACES:
  378.                 facenode = dom.createElement("face")
  379.                 facenode.setAttribute("index",str(index))
  380.                 facenode.setAttribute("group",str(PMD_FACE[1]))
  381.                 faceText = dom.createTextNode(PMD_FACE[0].rstrip())
  382.                 facenode.appendChild(faceText)
  383.                 expressionNode.appendChild(facenode)
  384.                 index += 1
  385.                
  386.         #
  387.         # Labels
  388.         #        d_pmd["SkinIndex"] = list(skin_index)
  389.         #        d_pmd["DispName"] = list(name)        
  390.         #        d_pmd["BoneIndex"] = list(bone,type)        
  391.         #        d_pmd["Bone"] = list((name,) + t_data)
  392.         #
  393.         SKININDEX = d_pmd["SkinIndex"]
  394.         DISPNAME = d_pmd["DispName"]
  395.         BONEINDEX = d_pmd["BoneIndex"]
  396.         BONE = d_pmd["Bone"]
  397.         IKBONES = d_pmd["IK"]
  398.         BlenderBone = {}
  399.         
  400.         findR = re.compile(J_Right)
  401.         findL = re.compile(J_Left)
  402.         
  403.         # Add Labels
  404.         labelsnode = dom.createElement("labels")
  405.         domroot.appendChild(labelsnode)
  406.         # Add Label
  407.         for Label_Index in range(len(DISPNAME)):
  408.                 labelnode = dom.createElement("label")
  409.                 labelnode.setAttribute("name",DISPNAME[Label_Index].rstrip())
  410.                 labelnode.setAttribute("index",str(Label_Index))
  411.                 labelsnode.appendChild(labelnode)
  412.                 index = 0                                
  413.                 for BONE_ID in BONEINDEX:
  414.                         if BONE_ID[1] == Label_Index +1 :
  415.                                 #  Add Bone
  416.                                 bonenode = dom.createElement("bone")
  417.                                 pmdBoneName = BONE[BONE_ID[0]][0].decode('UTF-8')
  418.                                 blenderBoneName = pmdBoneName
  419.                                 if (findR.search(pmdBoneName)):
  420.                                         blenderBoneName = findR.sub("",pmdBoneName) + "_R"
  421.                                 elif(findL.search(pmdBoneName)):
  422.                                         blenderBoneName = findL.sub("",pmdBoneName) + "_L"                                       
  423.                                 BlenderBone[BONE_ID[0]] = (blenderBoneName.encode('UTF-8'))                                
  424.                                 boneText = dom.createTextNode(pmdBoneName.encode('UTF-8'))
  425.                                 bonenode.setAttribute("index",str(index))
  426.                                 bonenode.setAttribute("blenderName",blenderBoneName.encode('UTF-8'))
  427.                                 bonenode.setAttribute("kind",str(BONE[BONE_ID[0]][3]))
  428.                                 index += 1
  429.                                 bonenode.appendChild(boneText)
  430.                                 labelnode.appendChild(bonenode)
  431.                                 
  432.         # Add Hidden Bones               
  433.         labelnode =  dom.createElement("label")
  434.         labelnode.setAttribute("name","Hidden")
  435.         labelnode.setAttribute("index",str(len(DISPNAME)))
  436.         labelsnode.appendChild(labelnode)
  437.         index = 0
  438.         for bone_index in range(len(BONE)):
  439.                 bone_Item = BONE[bone_index]
  440.                 if bone_index not in BlenderBone.keys() and bone_Item[3] not in (6,7) :
  441.                         #  Add Bone
  442.                         bonenode = dom.createElement("bone")
  443.                         pmdBoneName = bone_Item[0].decode('UTF-8')
  444.                         blenderBoneName = pmdBoneName                                
  445.                         boneText = dom.createTextNode(pmdBoneName.encode('UTF-8'))
  446.                         bonenode.setAttribute("index",str(index))
  447.                         bonenode.setAttribute("blenderName",blenderBoneName.encode('UTF-8'))
  448.                         bonenode.setAttribute("kind",str(bone_Item[3]))
  449.                         index += 1
  450.                         bonenode.appendChild(boneText)
  451.                         labelnode.appendChild(bonenode)
  452.                         
  453.                
  454.         # ADD IKs        
  455.         IKbonesnode = dom.createElement("IKbones")
  456.         domroot.appendChild(IKbonesnode)
  457.         index = 0
  458.         for IKBONE in IKBONES:
  459.                 IKbonenode = dom.createElement("IKbone")
  460.                 parent_id = BONE[IKBONE[0]][1]
  461.                 if parent_id == 65535:
  462.                         parent_name = "World"
  463.                 else:
  464.                         parent_name = BlenderBone.get(parent_id,BONE[parent_id][0])
  465.                 IKbonenode.setAttribute("index",str(index))                        
  466.                 IKbonenode.setAttribute("parent",parent_name)
  467.                 IKbonenode.setAttribute("IK1",str(IKBONE[2]))
  468.                 IKbonenode.setAttribute("IK2",str(IKBONE[3]))
  469.                 IKboneText = dom.createTextNode(BlenderBone.get(IKBONE[0],BONE[IKBONE[0]][0]))
  470.                 IKbonenode.appendChild(IKboneText)
  471.                 IKbonesnode.appendChild(IKbonenode)
  472.                 index += 1
  473.         

  474.         #print dom.toxml()        
  475.         f=open(filename, 'w')
  476.         dom.writexml(f)
  477.         f.close()
  478.         
  479.         dom.unlink()

  480.         return BlenderBone
  481. #
  482. #Inport PMD
  483. #

  484. def import_pmd(filename):

  485.         # Load PMD Model
  486.         d_pmd = pmd_2.ReadFile(filename)
  487.         
  488.         # Title
  489.         title = d_pmd["Header"][2]        # Get title

  490.         # EditModeCheck
  491.         mode_edit = Window.EditMode()
  492.         if mode_edit: Window.EditMode(0)

  493.         # XML
  494.         print "XML Create..."
  495.         xmlPath = os.path.splitext(filename)[0] + '.xml'
  496.         b_bones =  MakeXML(d_pmd,xmlPath)

  497.         # ADD Model
  498.         print "Model Loading..."        
  499.         MakeObject(d_pmd,b_bones,filename)
  500.         
  501.         #Set EditMode
  502.         if mode_edit: Window.EditMode(1)

  503.         print "done."

  504. # main
  505. if __name__=='__main__':
  506.         Window.FileSelector(import_pmd, 'Import PMD file',sys.makename(ext='.pmd'))
复制代码
1

查看全部评分

死人

使用道具 举报

Rank: 1

0
0
0


UID: 65687
权限: 5
发帖: 4 (0精)
积分: 2
章鱼: 0
大葱: 0
茄子: 25
注册:2010/5/31
存在感:100
19#
soulhack 发表于 2010/5/31 02:59:01 |只看该作者
本帖最后由 soulhack 于 2010-5-31 03:02 编辑

blender 装好 py装好 ,导入py脚本后 导入多了一个pmd 格式导入,一点就报脚本出错是啥情况啊。。lz求解
想要lat式2.2的模型。。。obj就行了。。

使用道具 举报

Rank: 1

0
0
0


UID: 65687
权限: 5
发帖: 4 (0精)
积分: 2
章鱼: 0
大葱: 0
茄子: 25
注册:2010/5/31
存在感:100
20#
soulhack 发表于 2010/5/31 16:11:02 |只看该作者
用了11楼的代码 77.jpg 。。。还是悲剧

使用道具 举报

Rank: 1

0
0
0


UID: 65687
权限: 5
发帖: 4 (0精)
积分: 2
章鱼: 0
大葱: 0
茄子: 25
注册:2010/5/31
存在感:100
21#
soulhack 发表于 2010/5/31 21:12:29 |只看该作者
解决了。在vm虚拟机里面装xp日本版 就正常了

使用道具 举报

根本就是個變態紳士

Lv.4-触手吸盘

Rank: 4Rank: 4

0
0
0


UID: 61004
权限: 30
发帖: 139 (0精)
积分: 272
章鱼: 5
大葱: 4
茄子: 1744
注册:2009/12/21
存在感:111

茄子饲养者

22#
※紡紅 发表于 2010/6/1 13:31:16 |只看该作者
soulhack自己解決就好, 幫不上忙了

使用道具 举报

Rank: 4Rank: 4

3
2
0


UID: 24502
权限: 30
属性: 不明
发帖: 115 (0精)
积分: 284
章鱼: 3
大葱: 22
茄子: 1467
注册:2008/11/7
存在感:61
23#
lastdemon 发表于 2010/6/3 12:21:55 |只看该作者
好东西……永远顶置吧,先收藏,以后慢慢看……

使用道具 举报

Rank: 2Rank: 2

0
0
0


UID: 66264
权限: 10
发帖: 7 (0精)
积分: 10
章鱼: 0
大葱: 0
茄子: 98
注册:2010/6/15
存在感:100
24#
和平行者 发表于 2010/6/30 14:05:50 |只看该作者
回复 3# 啖红
好东西!

使用道具 举报

Rank: 2Rank: 2

0
0
0


UID: 66264
权限: 10
发帖: 7 (0精)
积分: 10
章鱼: 0
大葱: 0
茄子: 98
注册:2010/6/15
存在感:100
25#
和平行者 发表于 2010/6/30 16:16:26 |只看该作者
把MAX文件转换为PMD文件,用哪个?

使用道具 举报

Rank: 1

0
0
0


UID: 34753
权限: 5
发帖: 2 (0精)
积分: 1
章鱼: 0
大葱: 0
茄子: 6
注册:2009/2/27
存在感:100
26#
5026162 发表于 2010/7/5 06:46:57 |只看该作者
路过。。。。。。。。。。。。。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册/sign up

申请友链|Archiver|iVocaloid - 自由,开放,合作,共享    | 版权持有者点击这里进行举报

GMT+8, 2025/6/17 13:53

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部