self.restitution=restitution\r
self.friction=friction\r
\r
+\r
class RigidBody(object):\r
"""pmx rigidbody\r
\r
self.mode=mode\r
\r
\r
+class Joint(object):\r
+ """pmx joint\r
+\r
+ Attributes:\r
+ name: \r
+ english_name: \r
+ joint_type:\r
+ rigidbody_index_a:\r
+ rigidbody_index_b:\r
+ position: Vector3\r
+ rotation: Vector3\r
+ translation_limit_min: Vector3\r
+ translation_limit_max: Vector3\r
+ rotation_limit_min: Vector3\r
+ rotation_limit_max: Vector3\r
+ spring_constant_translation: Vector3\r
+ spring_constant_rotation: Vector3\r
+ """\r
+ __slots__=[\r
+ 'name',\r
+ 'english_name',\r
+ 'joint_type',\r
+ 'rigidbody_index_a',\r
+ 'rigidbody_index_b',\r
+ 'position',\r
+ 'rotation',\r
+ 'translation_limit_min',\r
+ 'translation_limit_max',\r
+ 'rotation_limit_min',\r
+ 'rotation_limit_max',\r
+ 'spring_constant_translation',\r
+ 'spring_constant_rotation',\r
+ ]\r
+ def __init__(self, name, english_name,\r
+ joint_type,\r
+ rigidbody_index_a,\r
+ rigidbody_index_b,\r
+ position,\r
+ rotation,\r
+ translation_limit_min,\r
+ translation_limit_max,\r
+ rotation_limit_min,\r
+ rotation_limit_max,\r
+ spring_constant_translation,\r
+ spring_constant_rotation\r
+ ):\r
+ self.name=name\r
+ self.english_name=english_name\r
+ self.joint_type=joint_type\r
+ self.rigidbody_index_a=rigidbody_index_a\r
+ self.rigidbody_index_b=rigidbody_index_b\r
+ self.position=position\r
+ self.rotation=rotation\r
+ self.translation_limit_min=translation_limit_min\r
+ self.translation_limit_max=translation_limit_max\r
+ self.rotation_limit_min=rotation_limit_min\r
+ self.rotation_limit_max=rotation_limit_max\r
+ self.spring_constant_translation=spring_constant_translation\r
+ self.spring_constant_rotation=spring_constant_rotation\r
+\r
+\r
class Model(object):\r
"""pmx data representation\r
\r
morph:\r
display_slots:\r
rigidbodies:\r
+ joints:\r
"""\r
__slots__=[\r
'version', # pmx version\r
'morphs',\r
'display_slots',\r
'rigidbodies',\r
+ 'joints',\r
]\r
def __init__(self, version):\r
self.version=version\r
self.materials=[]\r
self.bones=[]\r
self.rigidbodies=[]\r
+ self.joints=[]\r
\r
mode=self.read_uint(1)\r
)\r
\r
+ def read_joint(self):\r
+ return pymeshio.pmx.Joint(\r
+ name=self.read_text(),\r
+ english_name=self.read_text(),\r
+ joint_type=self.read_uint(1),\r
+ rigidbody_index_a=self.read_rigidbody_index(),\r
+ rigidbody_index_b=self.read_rigidbody_index(),\r
+ position=self.read_vector3(),\r
+ rotation=self.read_vector3(),\r
+ translation_limit_min=self.read_vector3(),\r
+ translation_limit_max=self.read_vector3(),\r
+ rotation_limit_min=self.read_vector3(),\r
+ rotation_limit_max=self.read_vector3(),\r
+ spring_constant_translation=self.read_vector3(),\r
+ spring_constant_rotation=self.read_vector3())\r
+\r
\r
def load(path: str) -> pymeshio.pmx.Model:\r
# general binary loader\r
for _ in range(loader.read_uint(4))]\r
model.rigidbodies=[loader.read_rigidbody()\r
for _ in range(loader.read_uint(4))]\r
+ model.joints=[loader.read_joint()\r
+ for _ in range(loader.read_uint(4))]\r
\r
return model\r
\r
\r
assert len(model.vertices)==12354\r
assert len(model.indices)==22961 * 3\r
- # texture\r
+ print("{0} textures".format(len(model.textures)))\r
assert len(model.materials)==17\r
assert len(model.bones)==140\r
assert len(model.morphs)==30\r
assert len(model.display_slots)==9\r
assert len(model.rigidbodies)==45\r
+ assert len(model.joints)==27\r