This script imports a pmd into Blender for editing.
-0.1: 20091126: first implement.
-0.2: 20091209: implement IK.
-0.3: 20091210: implement morph target.
-0.4: 20100305: use english name.
-0.5: 20100408: cleanup not used vertices.
-0.6: 20100416: fix fornt face. texture load fail safe. add progress.
-0.7: 20100506: C extension.
-0.8: 20100521: add shape_key group.
-1.0: 20100530: add invisilbe bone tail(armature layer 2).
-1.1: 20100608: integrate 2.4 and 2.5.
-1.2: 20100616: implement rigid body.
-1.3: 20100619: fix for various models.
-1.4: 20100623: fix constraint name.
-1.5: 20100626: refactoring.
+0.1 20091126: first implement.
+0.2 20091209: implement IK.
+0.3 20091210: implement morph target.
+0.4 20100305: use english name.
+0.5 20100408: cleanup not used vertices.
+0.6 20100416: fix fornt face. texture load fail safe. add progress.
+0.7 20100506: C extension.
+0.8 20100521: add shape_key group.
+1.0 20100530: add invisilbe bone tail(armature layer 2).
+1.1 20100608: integrate 2.4 and 2.5.
+1.2 20100616: implement rigid body.
+1.3 20100619: fix for various models.
+1.4 20100623: fix constraint name.
+1.5 20100626: refactoring.
+1.6 20100629: sphere map.
"""
MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
#material.setSpecSize(0)
#material.setSpec(0)
# shader
- material.setDiffuseShader(Blender.Material.Shaders.DIFFUSE_TOON)
- material.setSpecShader(Blender.Material.Shaders.SPEC_TOON)
# diffuse
+ material.setDiffuseShader(Blender.Material.Shaders.DIFFUSE_TOON)
material.setRGBCol([m.diffuse.r, m.diffuse.g, m.diffuse.b])
material.setAlpha(m.diffuse.a)
# specular
+ material.setSpecShader(Blender.Material.Shaders.SPEC_TOON)
material.setSpec(m.shinness*0.1)
material.setSpecCol([m.specular.r, m.specular.g, m.specular.b])
# ambient
elif n.startswith("ankle_"):
b.lockYRot=True
+ def setSphereMap(material, index, blende_type=None):
+ pass
+
else:
# for 2.5
import bpy
def createPmdMaterial(m, index):
material = bpy.data.materials.new("Material")
- # set shader
- material.diffuse_shader='FRESNEL'
- material.specular_shader='TOON'
# diffuse
+ material.diffuse_shader='FRESNEL'
material.diffuse_color=([m.diffuse.r, m.diffuse.g, m.diffuse.b])
material.alpha=m.diffuse.a
# specular
- material.specular_hardness=int(m.shinness)
+ material.specular_shader='TOON'
material.specular_color=([m.specular.r, m.specular.g, m.specular.b])
+ material.specular_toon_size=int(m.shinness)
# ambient
material.mirror_color=([m.ambient.r, m.ambient.g, m.ambient.b])
# flag
material.subsurface_scattering.enabled=True if m.flag==1 else False
- # name
+ # other
material.name="m_%02d" % index
+ material.preview_render_type='FLAT'
+ material.transparency=True
return material
def poseBoneLimit(n, b):
#b.ik_dof_y=False
pass
+ def setSphereMap(material, index, blend_type=None):
+ slot=material.texture_slots[index]
+ slot.texture_coordinates='REFLECTION'
+ slot.mapping='SPHERE'
+ if blend_type:
+ slot.blend_type=blend_type
+
###############################################################################
def VtoV(v):
return (pos.x, pos.z, pos.y)
-def convert_uv(uv):
- return (uv.x, 1.0 - uv.y)
-
-
def to_radian(degree):
return math.pi * degree / 180
texture_name=m.getTexture()
if texture_name!='':
- if texture_name in textureMap:
- texture=textureMap[texture_name]
- else:
- try:
- texture, image=bl.texture.create(
- os.path.join(tex_dir, texture_name))
+ for i, t in enumerate(texture_name.split('*')):
+ if t in textureMap:
+ texture=textureMap[t]
+ else:
+ path=os.path.join(tex_dir, t)
+ texture, image=bl.texture.create(path)
textureMap[texture_name]=texture
imageMap[material_index]=image
- except:
- continue
- bl.material.addTexture(material, texture)
+ bl.material.addTexture(material, texture)
+ if t.endswith('sph'):
+ # sphere map
+ setSphereMap(material, i)
+ elif t.endswith('spa'):
+ # sphere map
+ setSphereMap(material, i, 'ADD')
+
bl.mesh.addMaterial(mesh, material)
index+=1
if io.indices[i] in shape_key_used_vertices:
return True
- # shapeキーで使われるマテリアルを記録する
- shape_key_materials=set()
+ material_with_shape=set()
+
# 各マテリアルの開始頂点インデックスを記録する
face_map={}
face_count=0
for i, m in enumerate(io.materials):
face_map[i]=face_count
if isMaterialUsedInShape(face_count, m):
- shape_key_materials.add(i)
+ material_with_shape.add(i)
face_count+=m.vertex_count
- # list化
- material_order=list(shape_key_materials)
+ # shapeキーで使われる頂点のあるマテリアル
+ material_with_shape=list(material_with_shape)
+ material_with_shape.sort()
- # shapeキーに使われていないマテリアルを後ろに追加
+ # shapeキーに使われていないマテリアル
+ material_without_shape=[]
for i in range(len(io.materials)):
- if not i in material_order:
- material_order.append(i)
+ if not i in material_with_shape:
+ material_without_shape.append(i)
- # ã\83\9eã\83\86ã\83ªã\82¢ã\83«16å\80\8bã\81\94ã\81¨ã\81«å\88\86å\89²ã\81\97ã\81\9fã\83¡ã\83\83ã\82·ã\83¥ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8b
- material_offset=0
- mesh_objects=[]
- while material_offset<len(io.materials):
- mesh, meshObject=bl.mesh.create('mesh')
- # create object
- mesh_objects.append(meshObject)
+ # ã\83¡ã\83\83ã\82·ã\83¥ã\81®ç\94\9fæ\88\90
+ def __splitList(l, length):
+ for i in range(0, len(l), length):
+ yield l[i:i+length]
+
+ def __importMeshAndShape(material16, name):
+ mesh, meshObject=bl.mesh.create(name)
# activate object
bl.object.deselectAll()
# shapeキーで使われる順に並べなおしたマテリアル16個分の
# メッシュを作成する
vertex_map=__import16MaerialAndMesh(
- meshObject, io,
- material_order[material_offset:material_offset+16],
- face_map, tex_dir)
+ meshObject, io, material16, face_map, tex_dir)
# crete shape key
__importShape(meshObject, io, vertex_map)
mesh.update()
- material_offset+=16
-
+ return meshObject
+
+ mesh_objects=[__importMeshAndShape(material16, 'with_shape')
+ for material16 in __splitList(material_with_shape, 16)]
+
+ mesh_objects+=[__importMeshAndShape(material16, 'mesh')
+ for material16 in __splitList(material_without_shape, 16)]
+
return mesh_objects