OSDN Git Service

implement vertex attributes
authorousttrue <ousttrue@gmail.com>
Thu, 13 Oct 2011 13:27:46 +0000 (22:27 +0900)
committerousttrue <ousttrue@gmail.com>
Thu, 13 Oct 2011 13:27:46 +0000 (22:27 +0900)
blender26-meshio/bl.py
blender26-meshio/import_pmx.py

index 4d5afde..c668fa0 100644 (file)
@@ -242,6 +242,8 @@ class object:
 
     @staticmethod
     def assignVertexGroup(o, name, index, weight):
+        if name not in o.vertex_groups:
+            o.vertex_groups.new(name)
         o.vertex_groups[name].add([index], weight, 'ADD')
 
     @staticmethod
index 8ffe81c..8b13d9e 100644 (file)
@@ -6,6 +6,8 @@ PMXモデルをインポートする。
 """
 import os
 from . import bl
+from .pymeshio import pmx
+from .pymeshio.pmx import reader
 
 
 def convert_coord(pos):
@@ -127,7 +129,6 @@ def _execute(filepath):
     bl.progress_set('load %s' % filepath, 0.0)
     print(filepath)
 
-    from .pymeshio.pmx import reader
     model=reader.read_from_file(filepath)
     if not model:
         print("fail to load %s" % filepath)
@@ -181,6 +182,23 @@ def _execute(filepath):
         bl.mesh.addGeometry(mesh, vertices,
                 [(indices[i], indices[i+1], indices[i+2])
                     for i in range(0, len(indices), 3)])
+        assert(len(model.vertices), len(mesh.vertices))
+        # set vertex attributes(normal, bone weights)
+        bl.mesh.useVertexUV(mesh)
+        for i, (v,  mvert) in enumerate(zip(model.vertices, mesh.vertices)):
+            bl.vertex.setNormal(mvert, convert_coord(v.normal))
+            if isinstance(v.deform, pmx.Bdef1):
+                bl.object.assignVertexGroup(mesh_object,
+                        model.bones[v.deform.index0].name, i, 1.0)
+            elif isinstance(v.deform, pmx.Bdef2):
+                bl.object.assignVertexGroup(mesh_object,
+                        model.bones[v.deform.index0].name, i, v.deform.weight0)
+                bl.object.assignVertexGroup(mesh_object,
+                        model.bones[v.deform.index1].name, i, 1.0-v.deform.weight0)
+            else:
+                raise Exception("unknown deform: %s" % v.deform)
+
+
         if armature_object:
             # armature modifirer
             bl.modifier.addArmature(mesh_object, armature_object)