diff options
author | Julien Duroure <julien.duroure@gmail.com> | 2020-02-23 14:01:16 +0300 |
---|---|---|
committer | Julien Duroure <julien.duroure@gmail.com> | 2020-02-23 14:01:16 +0300 |
commit | ec5ca6a6cb545bc965ebfe5661a0a4d7ecf57154 (patch) | |
tree | 17cd6c6a39bc8e2f7398c41d06a8b6014c5ffe1b /io_scene_gltf2 | |
parent | ee61a3a692d30bcb844901c87c9408db332f4265 (diff) |
glTF exporter: fix normals for skinned meshes
Diffstat (limited to 'io_scene_gltf2')
-rwxr-xr-x | io_scene_gltf2/__init__.py | 2 | ||||
-rwxr-xr-x | io_scene_gltf2/blender/exp/gltf2_blender_extract.py | 17 |
2 files changed, 10 insertions, 9 deletions
diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py index 3b586598..29856ca6 100755 --- a/io_scene_gltf2/__init__.py +++ b/io_scene_gltf2/__init__.py @@ -15,7 +15,7 @@ bl_info = { 'name': 'glTF 2.0 format', 'author': 'Julien Duroure, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors', - "version": (1, 2, 28), + "version": (1, 2, 29), 'blender': (2, 82, 7), 'location': 'File > Import-Export', 'description': 'Import-Export as glTF 2.0', diff --git a/io_scene_gltf2/blender/exp/gltf2_blender_extract.py b/io_scene_gltf2/blender/exp/gltf2_blender_extract.py index 5aef2ca9..762acbf3 100755 --- a/io_scene_gltf2/blender/exp/gltf2_blender_extract.py +++ b/io_scene_gltf2/blender/exp/gltf2_blender_extract.py @@ -64,7 +64,7 @@ class ShapeKey: # Functions # -def convert_swizzle_normal_and_tangent(loc, armature, blender_object, export_settings): +def convert_swizzle_normal(loc, armature, blender_object, export_settings): """Convert a normal data from Blender coordinate system to glTF coordinate system.""" if not armature: # Classic case. Mesh is not skined, no need to apply armature transfoms on vertices / normals / tangents @@ -74,8 +74,10 @@ def convert_swizzle_normal_and_tangent(loc, armature, blender_object, export_set return Vector((loc[0], loc[1], loc[2])) else: # Mesh is skined, we have to apply armature transforms on data - apply_matrix = armature.matrix_world.inverted() @ blender_object.matrix_world - new_loc = apply_matrix.to_quaternion() @ loc + apply_matrix = (armature.matrix_world.inverted() @ blender_object.matrix_world).to_3x3().inverted() + apply_matrix.transpose() + new_loc = ((armature.matrix_world.to_3x3() @ apply_matrix).to_4x4() @ Matrix.Translation(Vector((loc[0], loc[1], loc[2])))).to_translation() + if export_settings[gltf2_blender_export_keys.YUP]: return Vector((new_loc[0], new_loc[2], -new_loc[1])) else: @@ -640,14 +642,14 @@ def extract_primitives(glTF, blender_mesh, blender_object, blender_vertex_groups v = convert_swizzle_location(vertex.co, armature, blender_object, export_settings) if blender_polygon.use_smooth or blender_mesh.use_auto_smooth: if blender_mesh.has_custom_normals: - n = convert_swizzle_normal_and_tangent(blender_mesh.loops[loop_index].normal, armature, blender_object, export_settings) + n = convert_swizzle_normal(blender_mesh.loops[loop_index].normal, armature, blender_object, export_settings) else: - n = convert_swizzle_normal_and_tangent(vertex.normal, armature, blender_object, export_settings) + n = convert_swizzle_normal(vertex.normal, armature, blender_object, export_settings) if use_tangents: t = convert_swizzle_tangent(blender_mesh.loops[loop_index].tangent, armature, blender_object, export_settings) b = convert_swizzle_location(blender_mesh.loops[loop_index].bitangent, armature, blender_object, export_settings) else: - n = convert_swizzle_normal_and_tangent(face_normal, armature, blender_object, export_settings) + n = convert_swizzle_normal(face_normal, armature, blender_object, export_settings) if use_tangents: t = convert_swizzle_tangent(face_tangent, armature, blender_object, export_settings) b = convert_swizzle_location(face_bitangent, armature, blender_object, export_settings) @@ -766,7 +768,7 @@ def extract_primitives(glTF, blender_mesh, blender_object, blender_vertex_groups temp_normals[blender_polygon.index * 3 + 0], temp_normals[blender_polygon.index * 3 + 1], temp_normals[blender_polygon.index * 3 + 2]) - n_morph = convert_swizzle_normal_and_tangent(Vector(n_morph), armature, blender_object, export_settings) + n_morph = convert_swizzle_normal(Vector(n_morph), armature, blender_object, export_settings) # Store delta. n_morph -= n @@ -969,4 +971,3 @@ def extract_primitives(glTF, blender_mesh, blender_object, blender_vertex_groups print_console('INFO', 'Primitives created: ' + str(len(result_primitives))) return result_primitives - |