diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-08-26 10:39:29 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-08-26 10:39:29 +0400 |
commit | f453fc9baecd168b6e8ca06f525d563a376d9bb6 (patch) | |
tree | d44656dd878e86b9a75240bec176e5ffb10aff8d /io_anim_bvh | |
parent | 5f26ea87de0cce69559990bed2dcc45b973f53fe (diff) |
added X rotate 90d on import by default, still need to to the reverse on export.
Diffstat (limited to 'io_anim_bvh')
-rw-r--r-- | io_anim_bvh/__init__.py | 40 | ||||
-rw-r--r-- | io_anim_bvh/import_bvh.py | 55 |
2 files changed, 78 insertions, 17 deletions
diff --git a/io_anim_bvh/__init__.py b/io_anim_bvh/__init__.py index 383d3bb9..53a4db09 100644 --- a/io_anim_bvh/__init__.py +++ b/io_anim_bvh/__init__.py @@ -46,7 +46,10 @@ from bpy.props import (StringProperty, BoolProperty, EnumProperty, ) -from bpy_extras.io_utils import ImportHelper, ExportHelper +from bpy_extras.io_utils import (ImportHelper, + ExportHelper, + axis_conversion, + ) class ImportBVH(bpy.types.Operator, ImportHelper): @@ -100,8 +103,41 @@ class ImportBVH(bpy.types.Operator, ImportHelper): default='NATIVE', ) + axis_forward = EnumProperty( + name="Forward", + items=(('X', "X Forward", ""), + ('Y', "Y Forward", ""), + ('Z', "Z Forward", ""), + ('-X', "-X Forward", ""), + ('-Y', "-Y Forward", ""), + ('-Z', "-Z Forward", ""), + ), + default='-Z', + ) + + axis_up = EnumProperty( + name="Up", + items=(('X', "X Up", ""), + ('Y', "Y Up", ""), + ('Z', "Z Up", ""), + ('-X', "-X Up", ""), + ('-Y', "-Y Up", ""), + ('-Z', "-Z Up", ""), + ), + default='Y', + ) + def execute(self, context): - keywords = self.as_keywords(ignore=("filter_glob",)) + keywords = self.as_keywords(ignore=("axis_forward", + "axis_up", + "filter_glob", + )) + + global_matrix = axis_conversion(from_forward=self.axis_forward, + from_up=self.axis_up, + ).to_4x4() + + keywords["global_matrix"] = global_matrix from . import import_bvh return import_bvh.load(self, context, **keywords) diff --git a/io_anim_bvh/import_bvh.py b/io_anim_bvh/import_bvh.py index f8fd18e9..a21a1c1c 100644 --- a/io_anim_bvh/import_bvh.py +++ b/io_anim_bvh/import_bvh.py @@ -43,13 +43,13 @@ class BVH_Node(object): 'has_rot', # Conveinience function, bool, same as (channels[3]!=-1 or channels[4]!=-1 channels[5]!=-1) 'temp') # use this for whatever you want - _eul_order_lookup = { - (0, 1, 2): 'XYZ', - (0, 2, 1): 'XZY', - (1, 0, 2): 'YXZ', - (1, 2, 0): 'YZX', - (2, 0, 1): 'ZXY', - (2, 1, 0): 'ZYX'} + _eul_order_lookup = {(0, 1, 2): 'XYZ', + (0, 2, 1): 'XZY', + (1, 0, 2): 'YXZ', + (1, 2, 0): 'YZX', + (2, 0, 1): 'ZXY', + (2, 1, 0): 'ZYX', + } def __init__(self, name, rest_head_world, rest_head_local, parent, channels, rot_order): self.name = name @@ -331,7 +331,14 @@ def bvh_node_dict2objects(context, bvh_name, bvh_nodes, rotate_mode='NATIVE', fr return objects -def bvh_node_dict2armature(context, bvh_name, bvh_nodes, rotate_mode='XYZ', frame_start=1, IMPORT_LOOP=False): +def bvh_node_dict2armature(context, + bvh_name, + bvh_nodes, + rotate_mode='XYZ', + frame_start=1, + IMPORT_LOOP=False, + global_matrix=None, + ): if frame_start < 1: frame_start = 1 @@ -507,10 +514,24 @@ def bvh_node_dict2armature(context, bvh_name, bvh_nodes, rotate_mode='XYZ', fram for bez in cu.keyframe_points: bez.interpolation = 'LINEAR' + # finally apply matrix + arm_ob.matrix_world = global_matrix + bpy.ops.object.transform_apply(rotation=True) + return arm_ob -def load(operator, context, filepath="", target='ARMATURE', rotate_mode='NATIVE', global_scale=1.0, use_cyclic=False, frame_start=1): +def load(operator, + context, + filepath="", + target='ARMATURE', + rotate_mode='NATIVE', + global_scale=1.0, + use_cyclic=False, + frame_start=1, + global_matrix=None, + ): + import time t1 = time.time() print('\tparsing bvh %r...' % filepath, end="") @@ -530,15 +551,19 @@ def load(operator, context, filepath="", target='ARMATURE', rotate_mode='NATIVE' if target == 'ARMATURE': bvh_node_dict2armature(context, bvh_name, bvh_nodes, - rotate_mode=rotate_mode, - frame_start=frame_start, - IMPORT_LOOP=use_cyclic) + rotate_mode=rotate_mode, + frame_start=frame_start, + IMPORT_LOOP=use_cyclic, + global_matrix=global_matrix, + ) elif target == 'OBJECT': bvh_node_dict2objects(context, bvh_name, bvh_nodes, - rotate_mode=rotate_mode, - frame_start=frame_start, - IMPORT_LOOP=use_cyclic) + rotate_mode=rotate_mode, + frame_start=frame_start, + IMPORT_LOOP=use_cyclic, + # global_matrix=global_matrix, # TODO + ) else: raise Exception("invalid type") |