glTF exporter: Fix some inv bind matrix
This commit is contained in:
parent
2c8e27493f
commit
26330ab143
|
@ -669,12 +669,14 @@ def extract_primitives(glTF, blender_mesh, blender_vertex_groups, modifiers, exp
|
|||
if modifiers is not None:
|
||||
modifiers_dict = {m.type: m for m in modifiers}
|
||||
if "ARMATURE" in modifiers_dict:
|
||||
armature = modifiers_dict["ARMATURE"].object
|
||||
skin = gltf2_blender_gather_skins.gather_skin(armature, export_settings)
|
||||
for index, j in enumerate(skin.joints):
|
||||
if j.name == vertex_group_name:
|
||||
joint_index = index
|
||||
break
|
||||
modifier = modifiers_dict["ARMATURE"]
|
||||
armature = modifier.object
|
||||
if armature:
|
||||
skin = gltf2_blender_gather_skins.gather_skin(armature, modifier.id_data, export_settings)
|
||||
for index, j in enumerate(skin.joints):
|
||||
if j.name == vertex_group_name:
|
||||
joint_index = index
|
||||
break
|
||||
|
||||
#
|
||||
if joint_index is not None:
|
||||
|
|
|
@ -221,7 +221,7 @@ def __gather_trans_rot_scale(blender_object, export_settings):
|
|||
|
||||
def __gather_skin(blender_object, export_settings):
|
||||
modifiers = {m.type: m for m in blender_object.modifiers}
|
||||
if "ARMATURE" not in modifiers:
|
||||
if "ARMATURE" not in modifiers or modifiers["ARMATURE"].object is None:
|
||||
return None
|
||||
|
||||
# no skin needed when the modifier is linked without having a vertex group
|
||||
|
@ -235,7 +235,7 @@ def __gather_skin(blender_object, export_settings):
|
|||
return None
|
||||
|
||||
# Skins and meshes must be in the same glTF node, which is different from how blender handles armatures
|
||||
return gltf2_blender_gather_skins.gather_skin(modifiers["ARMATURE"].object, export_settings)
|
||||
return gltf2_blender_gather_skins.gather_skin(modifiers["ARMATURE"].object, blender_object, export_settings)
|
||||
|
||||
|
||||
def __gather_weights(blender_object, export_settings):
|
||||
|
|
|
@ -23,11 +23,12 @@ from io_scene_gltf2.blender.com import gltf2_blender_math
|
|||
|
||||
|
||||
@cached
|
||||
def gather_skin(blender_object, export_settings):
|
||||
def gather_skin(blender_object, mesh_object, export_settings):
|
||||
"""
|
||||
Gather armatures, bones etc into a glTF2 skin object.
|
||||
|
||||
:param blender_object: the object which may contain a skin
|
||||
:param mesh_object: the mesh object to be deformed
|
||||
:param export_settings:
|
||||
:return: a glTF2 skin object
|
||||
"""
|
||||
|
@ -37,7 +38,7 @@ def gather_skin(blender_object, export_settings):
|
|||
return gltf2_io.Skin(
|
||||
extensions=__gather_extensions(blender_object, export_settings),
|
||||
extras=__gather_extras(blender_object, export_settings),
|
||||
inverse_bind_matrices=__gather_inverse_bind_matrices(blender_object, export_settings),
|
||||
inverse_bind_matrices=__gather_inverse_bind_matrices(blender_object, mesh_object, export_settings),
|
||||
joints=__gather_joints(blender_object, export_settings),
|
||||
name=__gather_name(blender_object, export_settings),
|
||||
skeleton=__gather_skeleton(blender_object, export_settings)
|
||||
|
@ -60,8 +61,7 @@ def __gather_extensions(blender_object, export_settings):
|
|||
def __gather_extras(blender_object, export_settings):
|
||||
return None
|
||||
|
||||
|
||||
def __gather_inverse_bind_matrices(blender_object, export_settings):
|
||||
def __gather_inverse_bind_matrices(blender_object, mesh_object, export_settings):
|
||||
inverse_matrices = []
|
||||
|
||||
axis_basis_change = mathutils.Matrix.Identity(4)
|
||||
|
@ -77,11 +77,15 @@ def __gather_inverse_bind_matrices(blender_object, export_settings):
|
|||
|
||||
#
|
||||
for blender_bone in blender_object.pose.bones:
|
||||
inverse_bind_matrix = gltf2_blender_math.multiply(axis_basis_change, blender_bone.bone.matrix_local)
|
||||
bind_shape_matrix = gltf2_blender_math.multiply(gltf2_blender_math.multiply(
|
||||
axis_basis_change, blender_object.matrix_world.inverted()), axis_basis_change.inverted())
|
||||
matrix_world = gltf2_blender_math.multiply(blender_object.matrix_world, mesh_object.matrix_world.inverted())
|
||||
inverse_bind_matrix = gltf2_blender_math.multiply(
|
||||
axis_basis_change,
|
||||
gltf2_blender_math.multiply(
|
||||
matrix_world,
|
||||
blender_bone.bone.matrix_local
|
||||
)
|
||||
).inverted()
|
||||
|
||||
inverse_bind_matrix = gltf2_blender_math.multiply(inverse_bind_matrix.inverted(), bind_shape_matrix)
|
||||
for column in range(0, 4):
|
||||
for row in range(0, 4):
|
||||
inverse_matrices.append(inverse_bind_matrix[row][column])
|
||||
|
|
Loading…
Reference in New Issue