From 99f0b95485774670410e4498f4e5429c70394265 Mon Sep 17 00:00:00 2001
From: TrevisanGMW
Date: Wed, 20 Oct 2021 10:18:49 -0700
Subject: [PATCH 1/8] Added skeleton with baked segment scale compensate
---
python-scripts/gt_auto_biped_rigger.py | 235 ++++++++++++++++++++++++-
1 file changed, 232 insertions(+), 3 deletions(-)
diff --git a/python-scripts/gt_auto_biped_rigger.py b/python-scripts/gt_auto_biped_rigger.py
index 3b17c837..7a8c14cd 100644
--- a/python-scripts/gt_auto_biped_rigger.py
+++ b/python-scripts/gt_auto_biped_rigger.py
@@ -97,8 +97,14 @@
Added debugging warning to GUI for when debugging mode is activated (Replaces script title next to help)
Changed the "followName" attribute data type for the pole vector controls to float so interpolation is possible
+ 1.7.5 - 2021-10-19
+ Added option to generate secondary skeleton used for game engines (no Segment Scale Compensate)
+ Added option to create lines between pole vectors and their targets
+
To do:
+ Add option to mirror pose
+ Move functions to a module (this script is getting to big)
Create ribbon setup for the spine ( add switch to the master control )
Add more roll joints (upper part of the arm, legs, etc)
Add option to auto create proxy geo
@@ -134,7 +140,7 @@
script_name = "GT Auto Biped Rigger"
# Version:
-script_version = "1.7.4"
+script_version = "1.7.5"
# Python Version
python_version = sys.version_info.major
@@ -151,14 +157,16 @@
left_ctrl_color = (0, .3, 1) # Red
right_ctrl_color = (1, 0, 0) # Soft Blue
automation_ctrl_color = (.6,.2,1) # Purple
+create_real_time_skeleton = True
# Debugging Vars
-debugging = False # Activate Debugging Mode
+debugging = True # Activate Debugging Mode
debugging_auto_recreate = True # Auto deletes proxy/rig before creating
debugging_display_lra = False # Display LRA for all joints after generating
-debugging_auto_breathing = True # Auto activates breathing Time
+debugging_auto_breathing = False # Auto activates breathing Time
debugging_import_proxy = True # Auto Imports Proxy
debugging_import_path = 'C:\\template.json' # Path to auto import
+
debugging_bind_rig = True # Auto Binds Rig
debugging_bind_geo = 'body_geo' # Name of the geo to bind
debugging_bind_heatmap = False #If not using heatmap, then closest distance
@@ -1018,6 +1026,217 @@ def add_sine_attributes(obj, sine_prefix='sine', tick_source_attr='time1.outTime
return [(obj + '.' + output_attr), None]
+def get_inverted_hierarchy_tree(obj_list, return_short_name=True):
+ '''
+ Receives a list (usually a Maya selection) and returns a sorted version of it
+ starting with objects at the bottom of the hierarchy then working its way up to
+ the top parents. It extracts the number of "|" symbols in the full path to the file
+ to determine its position in the hierarchy before sorting it.
+
+ Parameters:
+ obj_list (list): A list of strings with the name of the Maya elements (Usually a maya selection)
+ return_short_name (optional, bool): Determines if the return list will return the full path or just the short name.
+
+ Returns:
+ inverted_hierarchy_tree (list) : A list containing the same elements, but sorted from lowest child to top parent.
+
+ '''
+ # Find hierarchy position and create pair
+ sorted_pairs = []
+ for obj in obj_list:
+ if cmds.objExists(obj):
+ long_name = cmds.ls(obj, l=True) or []
+ number_of_parents = len(long_name[0].split('|'))
+ sorted_pairs.append((long_name[0], number_of_parents))
+
+ sorted_pairs.sort(key=lambda x:x[1], reverse=True)
+
+ # Extract elements and return them
+ inverted_hierarchy_tree = []
+ for pair in sorted_pairs:
+ if return_short_name:
+ short_name = ''
+ split_path = pair[0].split('|')
+ if len(split_path) >= 1:
+ short_name = split_path[len(split_path)-1]
+ inverted_hierarchy_tree.append(short_name)
+ else:
+ inverted_hierarchy_tree.append(pair[0])
+ return inverted_hierarchy_tree
+
+
+
+def mimic_segment_scale_compensate_behaviour(joints_with_ssc, joints_no_ssc):
+ '''
+ Mimics the behaviour of segment scale compensate tranform system present in Maya
+ transfering the baked values to a secondary joint chain.
+ The secondary skeleton is compatible with real time engines as it calculates and bakes
+ scale values directly into the joints.
+
+
+ '''
+ # Check if lists are identical, name length and names?
+
+ scale_compensate_multiply_prefix = "ssc_scale_multiplier_"
+ scale_compensate_divide_prefix = "ssc_scale_divide_"
+
+ for index in range(len(joints_no_ssc)):
+ if index != len(joints_no_ssc)-1: # Don't apply it to the last one as it doesn't have children
+
+ joint_parent = cmds.listRelatives(joints_no_ssc[index], parent=True)
+
+ scale_compensate_multiply_node = scale_compensate_multiply_prefix + joints_no_ssc[index]
+ scale_compensate_multiply_node = cmds.createNode('multiplyDivide', name=scale_compensate_multiply_node)
+
+ cmds.connectAttr(scale_compensate_multiply_node + '.output', joints_no_ssc[index] + '.scale', f=True)
+ cmds.connectAttr(joints_with_ssc[index] + '.scale', scale_compensate_multiply_node + '.input2', f=True)
+
+ scale_compensate_divide_node = scale_compensate_divide_prefix + joint_parent[0]
+ if not cmds.objExists(scale_compensate_divide_node):
+ scale_compensate_divide_node = cmds.createNode('multiplyDivide', name=scale_compensate_divide_node)
+ cmds.setAttr(scale_compensate_divide_node + '.operation', 2)
+ cmds.setAttr(scale_compensate_divide_node + '.input1X', 1)
+ cmds.setAttr(scale_compensate_divide_node + '.input1Y', 1)
+ cmds.setAttr(scale_compensate_divide_node + '.input1Z', 1)
+
+ try:
+ if not cmds.isConnected( joint_parent[0] + '.scale', scale_compensate_divide_node + '.input2' ):
+ cmds.connectAttr(joint_parent[0] + '.scale', scale_compensate_divide_node + '.input2', f=True)
+ if not cmds.isConnected( scale_compensate_divide_node + '.output', scale_compensate_multiply_node + '.input1' ):
+ cmds.connectAttr(scale_compensate_divide_node + '.output', scale_compensate_multiply_node + '.input1', f=True)
+ except:
+ pass
+
+ # Try to connect hierarchy divide nodes
+ for index in range(len(joints_no_ssc)):
+ if index != len(joints_no_ssc)-1: # Ignore top parent
+ joint_parent = cmds.listRelatives(joints_no_ssc[index], parent=True) or []
+
+ try:
+ cmds.connectAttr(scale_compensate_divide_prefix + joint_parent[0] + '.output', scale_compensate_divide_prefix + joints_no_ssc[index] + '.input1', f=True)
+ except:
+ pass
+
+
+def get_short_name(obj):
+ '''
+ Get the name of the objects without its path (Maya returns full path if name is not unique)
+
+ Parameters:
+ obj (string) - object to extract short name
+ '''
+ if obj == '':
+ return ''
+ split_path = obj.split('|')
+ if len(split_path) >= 1:
+ short_name = split_path[len(split_path)-1]
+ return short_name
+
+def generate_no_ssc_skeleton(new_suffix='game'):
+ '''
+ Uses other functions to build a secondary skeleton that doesn't rely
+ on Maya's segment scale compensate system. It insteads bakes the scale
+ on to the children joints.
+
+ Dependencies:
+ get_short_name()
+ mimic_segment_scale_compensate_behaviour()
+ get_inverted_hierarchy_tree()
+ jnt_suffix : string variable
+ gt_ab_joints_default : list of joints
+
+ '''
+ cmds.select(gt_ab_joints_default.get('main_jnt'))
+ game_skeleton = cmds.duplicate(renameChildren=True)
+ for obj in game_skeleton:
+ if cmds.objectType(obj) != "joint":
+ cmds.delete(obj)
+
+ # Rename new skeleton
+ to_rename = []
+ search_jnt = '_' + jnt_suffix + '1' # Automatic renamed during duplication
+ search_end_jnt = '_end' + jnt_suffix.capitalize() + '1'
+ new_suffix_end_jnt = '_' + new_suffix + '_end' + jnt_suffix.capitalize()
+ new_suffix = '_' + new_suffix + '_' + jnt_suffix
+ for jnt in game_skeleton:
+ object_short_name = get_short_name(jnt)
+ new_name = str(object_short_name).replace(search_jnt, new_suffix).replace(search_end_jnt, new_suffix_end_jnt)
+ if cmds.objExists(jnt) and 'shape' not in cmds.nodeType(jnt, inherited=True) and jnt != new_name:
+ to_rename.append([jnt,new_name])
+
+ duplicated_joints = []
+ for pair in reversed(to_rename):
+ if cmds.objExists(pair[0]):
+ duplicated_joints.append(cmds.rename(pair[0], pair[1]))
+
+ return duplicated_joints, cmds.ls(selection=True)[0]
+
+
+def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ctrl, new_skeleton_suffix = 'game'):
+ '''
+ Attaches a previously generated game skeleton (no ssc skeleton)
+ to follow and mimic the scale of the original gt auto biped rigger skeleton
+
+ Parameters:
+ new_skeleton_suffix (optional, string): expected in-between string for game skeleton.
+ Used to pair with original skeleton
+ duplicated_joints (list): A list of string containing all generated real time joints
+ game_root_jnt (string): The name of the root joint (usually the top parent) of the new skeleton
+ scale_constraint_ctrl (string): Control used to drive the scale constraint of the game root joint (usually main_ctrl)
+
+ Dependencies:
+ generate_no_ssc_skeleton()
+ get_inverted_hierarchy_tree()
+ mimic_segment_scale_compensate_behaviour()
+
+ jnt_suffix : string variable
+ gt_ab_joints_default : list of joints
+
+ Returns:
+ sorted_no_ssc_joints (list): A list containing game skeleton joints
+ '''
+
+ # Turn off SSC
+ for jnt in duplicated_joints:
+ cmds.setAttr(jnt + '.segmentScaleCompensate', 0)
+
+ cmds.select(game_root_jnt, hierarchy=True) # Sync selection order
+ duplicated_joints = cmds.ls(selection=True, type='joint')
+
+ cmds.select(gt_ab_joints_default.get('main_jnt'), hierarchy=True)
+ original_joints = cmds.ls(selection=True, type='joint')
+
+ sorted_original_joints = get_inverted_hierarchy_tree(original_joints)
+ sorted_no_ssc_joints = get_inverted_hierarchy_tree(duplicated_joints)
+ mimic_segment_scale_compensate_behaviour(sorted_original_joints, sorted_no_ssc_joints)
+
+ # Parent Constraint new system
+ remove_dupe_str = '_' + new_skeleton_suffix + '_' + jnt_suffix
+
+ remove_org_str = '_' + jnt_suffix
+
+ remove_dupe_end_str = '_' + new_skeleton_suffix + '_end' + jnt_suffix.capitalize()
+ remove_org_end_str = '_end' + jnt_suffix.capitalize()
+
+ # Parent Constraint Game Skeleton
+ for jnt in sorted_original_joints:
+ for game_jnt in sorted_no_ssc_joints:
+ joint_org = jnt.replace(remove_org_str, '')
+ joint_dupe = game_jnt.replace(remove_dupe_str, '')
+ if joint_org == joint_dupe:
+ cmds.parentConstraint( jnt, game_jnt )
+
+ for jnt in sorted_original_joints:
+ for game_jnt in sorted_no_ssc_joints:
+ joint_org = jnt.replace(remove_org_end_str, '')
+ joint_dupe = game_jnt.replace(remove_dupe_end_str, '')
+ if joint_org == joint_dupe:
+ cmds.parentConstraint( jnt, game_jnt )
+
+ # Scale Constraint Rootf
+ cmds.scaleConstraint(scale_constraint_ctrl, game_root_jnt)
+
+ return sorted_no_ssc_joints
def create_visualization_line(object_a, object_b):
@@ -7168,6 +7387,12 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.setAttr(gt_ab_joints.get('right_pinky02_jnt') + '.type', 22) # Pinky Finger
cmds.setAttr(gt_ab_joints.get('right_pinky03_jnt') + '.type', 22) # Pinky Finger
+ # Creates game skeleton (No Segment Scale Compensate)
+ if create_real_time_skeleton:
+ new_skeleton_suffix = 'game'
+ duplicated_joints, game_root_jnt = generate_no_ssc_skeleton(new_skeleton_suffix)
+ sorted_no_ssc_joints = attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, main_ctrl, new_skeleton_suffix)
+
################# Store Created Joints #################
gt_ab_joints_default['left_forearm_jnt'] = left_forearm_jnt
@@ -7965,6 +8190,10 @@ def extract_transform_joint_to_proxy(joint_name, ignore_translate=False, ignore_
cmds.warning('Couldn\'t write to file. Please make sure the exporting directory is accessible.')
+
+
+
+
# Build UI
if __name__ == '__main__':
build_gui_auto_biped_rig()
\ No newline at end of file
From cb5d3bf8673ded763c0034e26a58c0d5c77d555e Mon Sep 17 00:00:00 2001
From: TrevisanGMW
Date: Wed, 20 Oct 2021 18:16:23 -0700
Subject: [PATCH 2/8] Created persistent settings and settings GUI
---
python-scripts/gt_auto_biped_rigger.py | 1054 ++++++++++++++----------
1 file changed, 611 insertions(+), 443 deletions(-)
diff --git a/python-scripts/gt_auto_biped_rigger.py b/python-scripts/gt_auto_biped_rigger.py
index 7a8c14cd..243c184e 100644
--- a/python-scripts/gt_auto_biped_rigger.py
+++ b/python-scripts/gt_auto_biped_rigger.py
@@ -101,6 +101,10 @@
Added option to generate secondary skeleton used for game engines (no Segment Scale Compensate)
Added option to create lines between pole vectors and their targets
+ 1.7.6 - 2021-10-20
+ Created "settings" button and the GUI updates necessary to display it
+ Created the base for persistent settings and implemented "User Real-time Skeleton" option
+ Created a custom help window that takes strings as help inputs to display it to the user
To do:
Add option to mirror pose
@@ -140,7 +144,7 @@
script_name = "GT Auto Biped Rigger"
# Version:
-script_version = "1.7.5"
+script_version = "1.7.6"
# Python Version
python_version = sys.version_info.major
@@ -157,22 +161,27 @@
left_ctrl_color = (0, .3, 1) # Red
right_ctrl_color = (1, 0, 0) # Soft Blue
automation_ctrl_color = (.6,.2,1) # Purple
-create_real_time_skeleton = True
# Debugging Vars
-debugging = True # Activate Debugging Mode
+debugging = False # Activates Debugging Mode
debugging_auto_recreate = True # Auto deletes proxy/rig before creating
debugging_display_lra = False # Display LRA for all joints after generating
debugging_auto_breathing = False # Auto activates breathing Time
debugging_import_proxy = True # Auto Imports Proxy
debugging_import_path = 'C:\\template.json' # Path to auto import
-
debugging_bind_rig = True # Auto Binds Rig
debugging_bind_geo = 'body_geo' # Name of the geo to bind
debugging_bind_heatmap = False #If not using heatmap, then closest distance
+# Persistent Settings
+gt_ab_settings = {
+ 'is_settings_visible' : False,
+ 'body_column_height' : 0, # determined during settings GUI creation
+ 'using_no_ssc_skeleton' : False,
+}
+
# Loaded Elements Dictionary
-gt_ab_settings = { # General Settings
+gt_ab_elements = { # General Settings
'main_proxy_grp' : 'auto_biped_proxy' + '_' + grp_suffix,
# Center Elements
'main_crv' : 'root' + '_' + proxy_suffix,
@@ -237,24 +246,67 @@
}
# Auto Populate Control Names (Copy from Left to Right) + Add prefixes
-gt_ab_settings_list = list(gt_ab_settings)
-for item in gt_ab_settings_list:
+gt_ab_elements_list = list(gt_ab_elements)
+for item in gt_ab_elements_list:
if item.startswith('left_'):
- gt_ab_settings[item] = 'left_' + gt_ab_settings.get(item) # Add "left_" prefix
- gt_ab_settings[item.replace('left_', 'right_')] = gt_ab_settings.get(item).replace('left_', 'right_') # Add right copy
+ gt_ab_elements[item] = 'left_' + gt_ab_elements.get(item) # Add "left_" prefix
+ gt_ab_elements[item.replace('left_', 'right_')] = gt_ab_elements.get(item).replace('left_', 'right_') # Add right copy
# Store Default Values
+gt_ab_elements_default = copy.deepcopy(gt_ab_elements)
gt_ab_settings_default = copy.deepcopy(gt_ab_settings)
# Create Joints List
gt_ab_joints_default = {}
-for obj in gt_ab_settings:
+for obj in gt_ab_elements:
if obj.endswith('_crv'):
- name = gt_ab_settings.get(obj).replace(proxy_suffix, jnt_suffix).replace('end' + proxy_suffix.capitalize(), 'end' + jnt_suffix.capitalize())
+ name = gt_ab_elements.get(obj).replace(proxy_suffix, jnt_suffix).replace('end' + proxy_suffix.capitalize(), 'end' + jnt_suffix.capitalize())
gt_ab_joints_default[obj.replace('_crv','_' + jnt_suffix).replace('_proxy', '')] = name
gt_ab_joints_default['left_forearm_jnt'] = 'left_forearm_jnt'
gt_ab_joints_default['right_forearm_jnt'] = 'right_forearm_jnt'
+# Manage Persistent Settings
+def get_persistent_settings_auto_biped_rigger():
+ '''
+ Checks if persistant settings for GT Auto Biped Rigger exists and transfer them to the settings dictionary.
+ It assumes that persistent settings were stored using the cmds.optionVar function.
+ '''
+ # Check if there is anything stored
+ stored_setup_exists = cmds.optionVar(exists=("gt_auto_biped_rigger_setup"))
+
+ # The values in these keys will not get imported (No persistent behaviour)
+ ignore_keys = ['is_settings_visible', 'body_column_height']
+
+ if stored_setup_exists:
+ stored_settings = {}
+ try:
+ stored_settings = eval(str(cmds.optionVar(q=("gt_auto_biped_rigger_setup"))))
+ for stored_item in stored_settings:
+ #print(stored_item)
+ for item in gt_ab_settings:
+ if stored_item == item and item not in ignore_keys:
+ gt_ab_settings[item] = stored_settings.get(stored_item)
+ except:
+ print('Couldn\'t load persistent settings, try resetting it in the help menu.')
+
+
+def set_persistent_settings_auto_biped_rigger():
+ '''
+ Stores persistant settings for GT Auto Biped Rigger.
+ It converts the dictionary into a list for easy storage. (The get function converts it back to a dictionary)
+ It assumes that persistent settings were stored using the cmds.optionVar function.
+ '''
+ cmds.optionVar( sv=('gt_auto_biped_rigger_setup', str(gt_ab_settings)))
+
+
+def reset_persistent_settings_auto_biped_rigger():
+ ''' Resets persistant settings for GT Auto Biped Rigger '''
+ cmds.optionVar( remove='gt_auto_biped_rigger_setup' )
+ gt_ab_settings = gt_ab_settings_default
+ cmds.warning('Persistent settings for ' + script_name + ' were cleared.')
+ cmds.evalDeferred("build_gui_auto_biped_rig()")
+
+
# Main Dialog ============================================================================
def build_gui_auto_biped_rig():
@@ -263,8 +315,10 @@ def build_gui_auto_biped_rig():
if cmds.window(window_name, exists =True):
cmds.deleteUI(window_name)
- # Main GUI Start Here =================================================================================
+ # Get Persistent Settings
+ get_persistent_settings_auto_biped_rigger()
+ # Main GUI Start Here =================================================================================
build_gui_auto_biped_rig = cmds.window(window_name, title=script_name + " (v" + script_version + ')',\
titleBar=True, mnb=False, mxb=False, sizeable =True)
@@ -281,9 +335,10 @@ def build_gui_auto_biped_rig():
cmds.separator(h=10, style='none') # Empty Space
cmds.rowColumnLayout(nc=1, cw=[(1, 270)], cs=[(1, 10)], p=content_main) # Window Size Adjustment
- cmds.rowColumnLayout(nc=3, cw=[(1, 10), (2, 200), (3, 50)], cs=[(1, 10), (2, 0), (3, 0)], p=content_main) # Title Column
- cmds.text(" ", bgc=title_bgc_color) # Tiny Empty Green Space
+ cmds.rowColumnLayout(nc=4, cw=[(1, 10), (2, 150), (3, 50), (4, 50)], cs=[(1, 10), (2, 0), (3, 0)], p=content_main) # Title Column
+ cmds.text(" ", bgc=title_bgc_color) # Tiny Empty Space
cmds.text(main_window_title, bgc=title_bgc_color, fn="boldLabelFont", align="left")
+ settings_btn = cmds.button( l ="Settings", bgc=title_bgc_color, c=lambda x:update_gui_settings())
cmds.button( l ="Help", bgc=title_bgc_color, c=lambda x:build_help_gui_auto_biped_rig())
cmds.separator(h=10, style='none', p=content_main) # Empty Space
@@ -311,7 +366,30 @@ def build_gui_auto_biped_rig():
image_result.write(image_64_decode)
image_result.close()
+
+ # Settings ================ @@@
+ settings_column = cmds.rowColumnLayout(nc=1, cw=[(1, 260)], cs=[(1,10)], h=1, p=content_main)
+
+ # General Settings
+ settings_bgc_color = (.4, .4, .4)
+ cmds.text('General Settings:', font='boldLabelFont')
+ cmds.separator(h=5, style='none') # Empty Space
+ cmds.rowColumnLayout(nc=3, cw=[(1, 10), (2, 210), (3, 20)], cs=[(1,10)])
+ cmds.text(" ", bgc=settings_bgc_color, h=20) # Tiny Empty Space
+ cmds.checkBox( label=' Use Real-time Skeleton', value=gt_ab_settings.get('using_no_ssc_skeleton'), ebg=True, cc=lambda x:invert_stored_setting('using_no_ssc_skeleton'))
+
+ custom_help_message = 'Creates another skeleton without the parameter "Segment Scale Compensate" being active. This skeleton inherits the transforms from the controls while mimicking the behaviour of the "Segment Scale Compensate" option, essentially creating a baked version of this Maya depended system.\nAs this baked version does not yet fully support non-uniform scaling, it\'s recommended that you only use it if you are planning to later send this rig into a game engine or another 3d application.\n\nThis will allow you to preserve the stretchy settings even in programs that do not support it.'
+ custom_help_title = 'Use Real-time Skeleton'
+ cmds.button(l ="?", bgc=settings_bgc_color, c=lambda x:build_custom_help_window(custom_help_message, custom_help_title))
+
+ cmds.rowColumnLayout(nc=1, cw=[(1, 240)], cs=[(1,10)], p=settings_column)
+
+ cmds.separator(h=25)
+ cmds.separator(h=5, style='none') # Empty Space
+ cmds.button(l ="Reset Persistent Settings", bgc=settings_bgc_color, c=lambda x:reset_persistent_settings_auto_biped_rigger())
+
+
# Body ====================
body_column = cmds.rowColumnLayout(nc=1, cw=[(1, 260)], cs=[(1,10)], p=content_main)
@@ -400,6 +478,40 @@ def build_gui_auto_biped_rig():
widget.setWindowIcon(icon)
+ ### GUI Functions ###
+ def invert_stored_setting(key_string):
+ '''
+ Used for boolean values, it inverts the value, so if True it becomes False and vice-versa
+
+ Parameters:
+ key_string (string) : Key name, used to determine what bool value to flip
+ '''
+ gt_ab_settings[key_string] = not gt_ab_settings.get(key_string)
+
+ def update_gui_settings():
+ '''
+ Function to show or hide settings.
+ It acomplishes this by switching the height of the body_column and the settings_column. @@@
+ '''
+ if gt_ab_settings.get('is_settings_visible') != True:
+ gt_ab_settings["is_settings_visible"] = True
+
+ cmds.button(settings_btn, e=True, l='Apply', bgc=(.6, .6, .6))
+
+ # Hide Checklist Items
+ gt_ab_settings["body_column_height"] = cmds.rowColumnLayout(body_column, q=True, h=True)
+ cmds.rowColumnLayout(body_column, e=True, h=1)
+
+ # Show Settings Items
+ cmds.rowColumnLayout(settings_column, e=True, h=(gt_ab_settings.get('body_column_height')))
+ else:
+ gt_ab_settings["is_settings_visible"] = False
+ cmds.rowColumnLayout(body_column, e=True, h=gt_ab_settings.get('body_column_height'))
+ cmds.rowColumnLayout(settings_column, e=True, h=1)
+ cmds.button(settings_btn, e=True, l='Settings', bgc=title_bgc_color)
+ set_persistent_settings_auto_biped_rigger()
+ get_persistent_settings_auto_biped_rigger()
+
# Main GUI Ends Here =================================================================================
@@ -499,6 +611,62 @@ def close_help_gui():
# Help Dialog Ends Here =================================================================================
+def build_custom_help_window(input_text, help_title=''):
+ '''
+ Creates a help window to display the provided text
+
+ Parameters:
+ input_text (string): Text used as help, this is displayed in a scroll fields.
+ help_title (optinal, string)
+ '''
+ window_name = help_title.replace(" ","_").replace("-","_").lower().strip() + "_help_window"
+ if cmds.window(window_name, exists=True):
+ cmds.deleteUI(window_name, window=True)
+
+ cmds.window(window_name, title= help_title + " Help", mnb=False, mxb=False, s=True)
+ cmds.window(window_name, e=True, s=True, wh=[1,1])
+
+ main_column = cmds.columnLayout(p= window_name)
+
+ # Title Text
+ cmds.separator(h=12, style='none') # Empty Space
+ cmds.rowColumnLayout(nc=1, cw=[(1, 310)], cs=[(1, 10)], p=main_column) # Window Size Adjustment
+ cmds.rowColumnLayout(nc=1, cw=[(1, 300)], cs=[(1, 10)], p=main_column) # Title Column
+ cmds.text(help_title + " Help", bgc=(.4, .4, .4), fn="boldLabelFont", align="center")
+ cmds.separator(h=10, style='none', p=main_column) # Empty Space
+
+ # Body ====================
+ cmds.rowColumnLayout(nc=1, cw=[(1, 300)], cs=[(1,10)], p=main_column)
+
+ help_scroll_field = cmds.scrollField(editable=False, wordWrap=True, fn="smallPlainLabelFont")
+
+ cmds.scrollField(help_scroll_field, e=True, ip=0, it=input_text)
+ cmds.scrollField(help_scroll_field, e=True, ip=1, it='') # Bring Back to the Top
+
+ # Close Button
+ cmds.rowColumnLayout(nc=1, cw=[(1, 300)], cs=[(1,10)], p=main_column)
+ cmds.separator(h=10, style='none')
+ cmds.button(l='OK', h=30, c=lambda args: close_help_gui())
+ cmds.separator(h=8, style='none')
+
+ # Show and Lock Window
+ cmds.showWindow(window_name)
+ cmds.window(window_name, e=True, s=False)
+
+ # Set Window Icon
+ qw = omui.MQtUtil.findWindow(window_name)
+ if python_version == 3:
+ widget = wrapInstance(int(qw), QWidget)
+ else:
+ widget = wrapInstance(long(qw), QWidget)
+ icon = QIcon(':/question.png')
+ widget.setWindowIcon(icon)
+
+ def close_help_gui():
+ ''' Closes help windows '''
+ if cmds.window(window_name, exists=True):
+ cmds.deleteUI(window_name, window=True)
+ # Custom Help Dialog Ends Here =================================================================================
def gtu_combine_curves_list(curve_list):
@@ -1066,11 +1234,11 @@ def get_inverted_hierarchy_tree(obj_list, return_short_name=True):
-def mimic_segment_scale_compensate_behaviour(joints_with_ssc, joints_no_ssc):
+def mimic_segment_scale_compensate(joints_with_ssc, joints_no_ssc):
'''
Mimics the behaviour of segment scale compensate tranform system present in Maya
transfering the baked values to a secondary joint chain.
- The secondary skeleton is compatible with real time engines as it calculates and bakes
+ The secondary skeleton is compatible with real-time engines as it calculates and bakes
scale values directly into the joints.
@@ -1180,7 +1348,7 @@ def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ct
Parameters:
new_skeleton_suffix (optional, string): expected in-between string for game skeleton.
Used to pair with original skeleton
- duplicated_joints (list): A list of string containing all generated real time joints
+ duplicated_joints (list): A list of string containing all generated real-time joints
game_root_jnt (string): The name of the root joint (usually the top parent) of the new skeleton
scale_constraint_ctrl (string): Control used to drive the scale constraint of the game root joint (usually main_ctrl)
@@ -1208,7 +1376,7 @@ def attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, scale_constraint_ct
sorted_original_joints = get_inverted_hierarchy_tree(original_joints)
sorted_no_ssc_joints = get_inverted_hierarchy_tree(duplicated_joints)
- mimic_segment_scale_compensate_behaviour(sorted_original_joints, sorted_no_ssc_joints)
+ mimic_segment_scale_compensate(sorted_original_joints, sorted_no_ssc_joints)
# Parent Constraint new system
remove_dupe_str = '_' + new_skeleton_suffix + '_' + jnt_suffix
@@ -1527,16 +1695,16 @@ def validate_operation(operation, debugging=False):
# Debugging (Auto deletes generated proxy)
if debugging and debugging_auto_recreate:
try:
- cmds.delete(gt_ab_settings_default.get('main_proxy_grp'))
+ cmds.delete(gt_ab_elements_default.get('main_proxy_grp'))
except:
pass
# Check if proxy exists in the scene
- proxy_elements = [gt_ab_settings_default.get('main_proxy_grp')]
- for proxy in gt_ab_settings_default:
+ proxy_elements = [gt_ab_elements_default.get('main_proxy_grp')]
+ for proxy in gt_ab_elements_default:
if '_crv' in proxy:
- proxy_elements.append(gt_ab_settings_default.get(proxy))
+ proxy_elements.append(gt_ab_elements_default.get(proxy))
for obj in proxy_elements:
if cmds.objExists(obj) and is_valid:
is_valid = False
@@ -1572,8 +1740,8 @@ def validate_operation(operation, debugging=False):
try:
if cmds.objExists('rig_grp'):
cmds.delete('rig_grp')
- if cmds.objExists(gt_ab_settings.get('main_proxy_grp')):
- cmds.delete(gt_ab_settings.get('main_proxy_grp'))
+ if cmds.objExists(gt_ab_elements.get('main_proxy_grp')):
+ cmds.delete(gt_ab_elements.get('main_proxy_grp'))
create_proxy(colorize_proxy=True)
# Debugging (Auto imports proxy)
if debugging_import_proxy and os.path.exists(debugging_import_path):
@@ -1582,14 +1750,14 @@ def validate_operation(operation, debugging=False):
pass
# Validate Proxy
- if not cmds.objExists(gt_ab_settings.get('main_proxy_grp')):
+ if not cmds.objExists(gt_ab_elements.get('main_proxy_grp')):
is_valid = False
cmds.warning('Proxy couldn\'t be found. Make sure you first create a proxy (guide objects) before generating a rig.')
- proxy_elements = [gt_ab_settings.get('main_proxy_grp')]
- for proxy in gt_ab_settings_default:
+ proxy_elements = [gt_ab_elements.get('main_proxy_grp')]
+ for proxy in gt_ab_elements_default:
if '_crv' in proxy:
- proxy_elements.append(gt_ab_settings.get(proxy))
+ proxy_elements.append(gt_ab_elements.get(proxy))
for obj in proxy_elements:
if not cmds.objExists(obj) and is_valid:
is_valid = False
@@ -1642,84 +1810,84 @@ def create_proxy(colorize_proxy=True):
cmds.warning('Proxy creation already in progress, please finish it first.')
# Main
- main_crv = create_main_control(gt_ab_settings_default.get('main_crv'))
- main_grp = cmds.group(empty=True, world=True, name=gt_ab_settings_default.get('main_proxy_grp'))
+ main_crv = create_main_control(gt_ab_elements_default.get('main_crv'))
+ main_grp = cmds.group(empty=True, world=True, name=gt_ab_elements_default.get('main_proxy_grp'))
cmds.parent(main_crv, main_grp)
# Root
- cog_proxy_crv = create_joint_curve(gt_ab_settings_default.get('cog_proxy_crv'), 1)
+ cog_proxy_crv = create_joint_curve(gt_ab_elements_default.get('cog_proxy_crv'), 1)
root_proxy_grp = cmds.group(empty=True, world=True, name=cog_proxy_crv + grp_suffix.capitalize())
cmds.parent(cog_proxy_crv, root_proxy_grp)
cmds.move(0, 89.2, 0, root_proxy_grp)
# Spine 1
- spine01_proxy_crv = create_joint_curve(gt_ab_settings_default.get('spine01_proxy_crv'), 0.5)
+ spine01_proxy_crv = create_joint_curve(gt_ab_elements_default.get('spine01_proxy_crv'), 0.5)
spine01_proxy_grp = cmds.group(empty=True, world=True, name=spine01_proxy_crv + grp_suffix.capitalize())
cmds.parent(spine01_proxy_crv, spine01_proxy_grp)
cmds.move(0, 98.5, 0, spine01_proxy_grp)
# Spine 2
- spine02_proxy_crv = create_joint_curve(gt_ab_settings_default.get('spine02_proxy_crv'), 0.5)
+ spine02_proxy_crv = create_joint_curve(gt_ab_elements_default.get('spine02_proxy_crv'), 0.5)
spine02_proxy_grp = cmds.group(empty=True, world=True, name=spine02_proxy_crv + grp_suffix.capitalize())
cmds.parent(spine02_proxy_crv, spine02_proxy_grp)
cmds.move(0, 108.2, 0, spine02_proxy_grp)
# Spine 3
- spine03_proxy_crv = create_joint_curve(gt_ab_settings_default.get('spine03_proxy_crv'), 0.5)
+ spine03_proxy_crv = create_joint_curve(gt_ab_elements_default.get('spine03_proxy_crv'), 0.5)
spine03_proxy_grp = cmds.group(empty=True, world=True, name=spine03_proxy_crv + grp_suffix.capitalize())
cmds.parent(spine03_proxy_crv, spine03_proxy_grp)
cmds.move(0, 117.8, 0, spine03_proxy_grp)
# Spine 4
- spine04_proxy_crv = create_joint_curve(gt_ab_settings_default.get('spine04_proxy_crv'), 1)
+ spine04_proxy_crv = create_joint_curve(gt_ab_elements_default.get('spine04_proxy_crv'), 1)
spine04_proxy_grp = cmds.group(empty=True, world=True, name=spine04_proxy_crv + grp_suffix.capitalize())
cmds.parent(spine04_proxy_crv, spine04_proxy_grp)
cmds.move(0, 127.5, 0, spine04_proxy_grp)
# Neck Base
- neck_base_proxy_crv = create_joint_curve(gt_ab_settings_default.get('neck_base_proxy_crv'), .5)
+ neck_base_proxy_crv = create_joint_curve(gt_ab_elements_default.get('neck_base_proxy_crv'), .5)
neck_base_proxy_grp = cmds.group(empty=True, world=True, name=neck_base_proxy_crv + grp_suffix.capitalize())
cmds.parent(neck_base_proxy_crv, neck_base_proxy_grp)
cmds.move(0, 137.1, 0, neck_base_proxy_grp)
# Neck Mid
- neck_mid_proxy_crv = create_joint_curve(gt_ab_settings_default.get('neck_mid_proxy_crv'), .2)
+ neck_mid_proxy_crv = create_joint_curve(gt_ab_elements_default.get('neck_mid_proxy_crv'), .2)
neck_mid_proxy_grp = cmds.group(empty=True, world=True, name=neck_mid_proxy_crv + grp_suffix.capitalize())
cmds.parent(neck_mid_proxy_crv, neck_mid_proxy_grp)
cmds.move(0, 139.8, 0, neck_mid_proxy_grp)
# Head
- head_proxy_crv = create_joint_curve(gt_ab_settings_default.get('head_proxy_crv'), .5)
+ head_proxy_crv = create_joint_curve(gt_ab_elements_default.get('head_proxy_crv'), .5)
head_proxy_grp = cmds.group(empty=True, world=True, name=head_proxy_crv + grp_suffix.capitalize())
cmds.parent(head_proxy_crv, head_proxy_grp)
cmds.move(0, 142.4, 0, head_proxy_grp)
# Head End
- head_end_proxy_crv = create_joint_curve(gt_ab_settings_default.get('head_end_proxy_crv'), .2)
+ head_end_proxy_crv = create_joint_curve(gt_ab_elements_default.get('head_end_proxy_crv'), .2)
head_end_proxy_grp = cmds.group(empty=True, world=True, name=head_end_proxy_crv + grp_suffix.capitalize())
cmds.parent(head_end_proxy_crv, head_end_proxy_grp)
cmds.move(0, 160, 0, head_end_proxy_grp)
# Jaw
- jaw_proxy_crv = create_joint_curve(gt_ab_settings_default.get('jaw_proxy_crv'), .5)
+ jaw_proxy_crv = create_joint_curve(gt_ab_elements_default.get('jaw_proxy_crv'), .5)
jaw_proxy_grp = cmds.group(empty=True, world=True, name=jaw_proxy_crv + grp_suffix.capitalize())
cmds.parent(jaw_proxy_crv, jaw_proxy_grp)
cmds.move(0, 147.4, 2.35, jaw_proxy_grp)
# Jaw End
- jaw_end_proxy_crv = create_joint_curve(gt_ab_settings_default.get('jaw_end_proxy_crv'), .2)
+ jaw_end_proxy_crv = create_joint_curve(gt_ab_elements_default.get('jaw_end_proxy_crv'), .2)
jaw_end_proxy_grp = cmds.group(empty=True, world=True, name=jaw_end_proxy_crv + grp_suffix.capitalize())
cmds.parent(jaw_end_proxy_crv, jaw_end_proxy_grp)
cmds.move(0, 142.7, 10.8, jaw_end_proxy_grp)
# Right Eye
- right_eye_proxy_crv = create_loc_joint_curve(gt_ab_settings_default.get('right_eye_proxy_crv'), .6)
+ right_eye_proxy_crv = create_loc_joint_curve(gt_ab_elements_default.get('right_eye_proxy_crv'), .6)
right_eye_proxy_grp = cmds.group(empty=True, world=True, name=right_eye_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_eye_proxy_crv, right_eye_proxy_grp)
cmds.move(-3.5, 151.2, 8.7, right_eye_proxy_grp)
# Left Eye
- left_eye_proxy_crv = create_loc_joint_curve(gt_ab_settings_default.get('left_eye_proxy_crv'), .6)
+ left_eye_proxy_crv = create_loc_joint_curve(gt_ab_elements_default.get('left_eye_proxy_crv'), .6)
left_eye_proxy_grp = cmds.group(empty=True, world=True, name=left_eye_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_eye_proxy_crv, left_eye_proxy_grp)
cmds.move(3.5, 151.2, 8.7, left_eye_proxy_grp)
@@ -1727,134 +1895,134 @@ def create_proxy(colorize_proxy=True):
################# Left Arm #################
# Left Clavicle
- left_clavicle_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_clavicle_proxy_crv'), .5)
+ left_clavicle_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_clavicle_proxy_crv'), .5)
left_clavicle_proxy_grp = cmds.group(empty=True, world=True, name=left_clavicle_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_clavicle_proxy_crv, left_clavicle_proxy_grp)
cmds.move(7.3, 130.4, 0, left_clavicle_proxy_grp)
# Left Shoulder
- left_shoulder_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_shoulder_proxy_crv'), .5)
+ left_shoulder_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_shoulder_proxy_crv'), .5)
left_shoulder_proxy_grp = cmds.group(empty=True, world=True, name=left_shoulder_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_shoulder_proxy_crv, left_shoulder_proxy_grp)
cmds.move(17.2, 130.4, 0, left_shoulder_proxy_grp)
# Left Elbow
- left_elbow_proxy_crv = create_aim_joint_curve(gt_ab_settings_default.get('left_elbow_proxy_crv'), .5)
+ left_elbow_proxy_crv = create_aim_joint_curve(gt_ab_elements_default.get('left_elbow_proxy_crv'), .5)
left_elbow_proxy_grp = cmds.group(empty=True, world=True, name=left_elbow_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_elbow_proxy_crv, left_elbow_proxy_grp)
cmds.move(37.7, 130.4, 0, left_elbow_proxy_grp)
# Left Wrist
- left_wrist_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_wrist_proxy_crv'), .6)
+ left_wrist_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_wrist_proxy_crv'), .6)
left_wrist_proxy_grp = cmds.group(empty=True, world=True, name=left_wrist_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_wrist_proxy_crv, left_wrist_proxy_grp)
cmds.move(58.2, 130.4, 0, left_wrist_proxy_grp)
# Left Thumb
- left_thumb01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_thumb01_proxy_crv'), proxy_finger_scale)
+ left_thumb01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_thumb01_proxy_crv'), proxy_finger_scale)
left_thumb01_proxy_grp = cmds.group(empty=True, world=True, name=left_thumb01_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_thumb01_proxy_crv, left_thumb01_proxy_grp)
cmds.move(60.8, 130.4, 2.9, left_thumb01_proxy_grp)
- left_thumb02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_thumb02_proxy_crv'), proxy_finger_scale)
+ left_thumb02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_thumb02_proxy_crv'), proxy_finger_scale)
left_thumb02_proxy_grp = cmds.group(empty=True, world=True, name=left_thumb02_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_thumb02_proxy_crv, left_thumb02_proxy_grp)
cmds.move(60.8, 130.4, 7.3, left_thumb02_proxy_grp)
- left_thumb03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_thumb03_proxy_crv'), proxy_finger_scale)
+ left_thumb03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_thumb03_proxy_crv'), proxy_finger_scale)
left_thumb03_proxy_grp = cmds.group(empty=True, world=True, name=left_thumb03_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_thumb03_proxy_crv, left_thumb03_proxy_grp)
cmds.move(60.8, 130.4, 11.7, left_thumb03_proxy_grp)
- left_thumb04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_thumb04_proxy_crv'), proxy_end_joint_scale)
+ left_thumb04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_thumb04_proxy_crv'), proxy_end_joint_scale)
left_thumb04_proxy_grp = cmds.group(empty=True, world=True, name=left_thumb04_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_thumb04_proxy_crv, left_thumb04_proxy_grp)
cmds.move(60.8, 130.4, 16.3, left_thumb04_proxy_grp)
# Left Index
- left_index01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_index01_proxy_crv'), proxy_finger_scale)
+ left_index01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_index01_proxy_crv'), proxy_finger_scale)
left_index01_proxy_grp = cmds.group(empty=True, world=True, name=left_index01_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_index01_proxy_crv, left_index01_proxy_grp)
cmds.move(66.9, 130.4, 3.5, left_index01_proxy_grp)
- left_index02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_index02_proxy_crv'), proxy_finger_scale)
+ left_index02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_index02_proxy_crv'), proxy_finger_scale)
left_index02_proxy_grp = cmds.group(empty=True, world=True, name=left_index02_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_index02_proxy_crv, left_index02_proxy_grp)
cmds.move(70.1, 130.4, 3.5, left_index02_proxy_grp)
- left_index03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_index03_proxy_crv'), proxy_finger_scale)
+ left_index03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_index03_proxy_crv'), proxy_finger_scale)
left_index03_proxy_grp = cmds.group(empty=True, world=True, name=left_index03_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_index03_proxy_crv, left_index03_proxy_grp)
cmds.move(74.2, 130.4, 3.5, left_index03_proxy_grp)
- left_index04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_index04_proxy_crv'), proxy_end_joint_scale)
+ left_index04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_index04_proxy_crv'), proxy_end_joint_scale)
left_index04_proxy_grp = cmds.group(empty=True, world=True, name=left_index04_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_index04_proxy_crv, left_index04_proxy_grp)
cmds.move(77.5, 130.4, 3.5, left_index04_proxy_grp)
# Left Middle
- left_middle01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_middle01_proxy_crv'), proxy_finger_scale)
+ left_middle01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_middle01_proxy_crv'), proxy_finger_scale)
left_middle01_proxy_grp = cmds.group(empty=True, world=True, name=left_middle01_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_middle01_proxy_crv, left_middle01_proxy_grp)
cmds.move(66.9, 130.4, 1.1, left_middle01_proxy_grp)
- left_middle02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_middle02_proxy_crv'), proxy_finger_scale)
+ left_middle02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_middle02_proxy_crv'), proxy_finger_scale)
left_middle02_proxy_grp = cmds.group(empty=True, world=True, name=left_middle02_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_middle02_proxy_crv, left_middle02_proxy_grp)
cmds.move(70.7, 130.4, 1.1, left_middle02_proxy_grp)
- left_middle03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_middle03_proxy_crv'), proxy_finger_scale)
+ left_middle03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_middle03_proxy_crv'), proxy_finger_scale)
left_middle03_proxy_grp = cmds.group(empty=True, world=True, name=left_middle03_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_middle03_proxy_crv, left_middle03_proxy_grp)
cmds.move(74.4, 130.4, 1.1, left_middle03_proxy_grp)
- left_middle04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_middle04_proxy_crv'), proxy_end_joint_scale)
+ left_middle04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_middle04_proxy_crv'), proxy_end_joint_scale)
left_middle04_proxy_grp = cmds.group(empty=True, world=True, name=left_middle04_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_middle04_proxy_crv, left_middle04_proxy_grp)
cmds.move(78.0, 130.4, 1.1, left_middle04_proxy_grp)
# Left Ring
- left_ring01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_ring01_proxy_crv'), proxy_finger_scale)
+ left_ring01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_ring01_proxy_crv'), proxy_finger_scale)
left_ring01_proxy_grp = cmds.group(empty=True, world=True, name=left_ring01_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_ring01_proxy_crv, left_ring01_proxy_grp)
cmds.move(66.9, 130.4, -1.1, left_ring01_proxy_grp)
- left_ring02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_ring02_proxy_crv'), proxy_finger_scale)
+ left_ring02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_ring02_proxy_crv'), proxy_finger_scale)
left_ring02_proxy_grp = cmds.group(empty=True, world=True, name=left_ring02_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_ring02_proxy_crv, left_ring02_proxy_grp)
cmds.move(70.4, 130.4, -1.1, left_ring02_proxy_grp)
- left_ring03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_ring03_proxy_crv'), proxy_finger_scale)
+ left_ring03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_ring03_proxy_crv'), proxy_finger_scale)
left_ring03_proxy_grp = cmds.group(empty=True, world=True, name=left_ring03_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_ring03_proxy_crv, left_ring03_proxy_grp)
cmds.move(74, 130.4, -1.1, left_ring03_proxy_grp)
- left_ring04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_ring04_proxy_crv'), proxy_end_joint_scale)
+ left_ring04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_ring04_proxy_crv'), proxy_end_joint_scale)
left_ring04_proxy_grp = cmds.group(empty=True, world=True, name=left_ring04_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_ring04_proxy_crv, left_ring04_proxy_grp)
cmds.move(77.5, 130.4, -1.1, left_ring04_proxy_grp)
# Left Pinky
- left_pinky01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_pinky01_proxy_crv'), proxy_finger_scale)
+ left_pinky01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_pinky01_proxy_crv'), proxy_finger_scale)
left_pinky01_proxy_grp = cmds.group(empty=True, world=True, name=left_pinky01_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_pinky01_proxy_crv, left_pinky01_proxy_grp)
cmds.move(66.3, 130.4, -3.2, left_pinky01_proxy_grp)
- left_pinky02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_pinky02_proxy_crv'), proxy_finger_scale)
+ left_pinky02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_pinky02_proxy_crv'), proxy_finger_scale)
left_pinky02_proxy_grp = cmds.group(empty=True, world=True, name=left_pinky02_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_pinky02_proxy_crv, left_pinky02_proxy_grp)
cmds.move(69.6, 130.4, -3.2, left_pinky02_proxy_grp)
- left_pinky03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_pinky03_proxy_crv'), proxy_finger_scale)
+ left_pinky03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_pinky03_proxy_crv'), proxy_finger_scale)
left_pinky03_proxy_grp = cmds.group(empty=True, world=True, name=left_pinky03_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_pinky03_proxy_crv, left_pinky03_proxy_grp)
cmds.move(72.8, 130.4, -3.2, left_pinky03_proxy_grp)
- left_pinky04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('left_pinky04_proxy_crv'), proxy_end_joint_scale)
+ left_pinky04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('left_pinky04_proxy_crv'), proxy_end_joint_scale)
left_pinky04_proxy_grp = cmds.group(empty=True, world=True, name=left_pinky04_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_pinky04_proxy_crv, left_pinky04_proxy_grp)
cmds.move(76.3, 130.4, -3.2, left_pinky04_proxy_grp)
@@ -1862,155 +2030,155 @@ def create_proxy(colorize_proxy=True):
################# Right Arm #################
# Right Clavicle
- right_clavicle_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_clavicle_proxy_crv'), .5)
+ right_clavicle_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_clavicle_proxy_crv'), .5)
right_clavicle_proxy_grp = cmds.group(empty=True, world=True, name=right_clavicle_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_clavicle_proxy_crv, right_clavicle_proxy_grp)
cmds.move(-7.3, 130.4, 0, right_clavicle_proxy_grp)
# Right Shoulder
- right_shoulder_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_shoulder_proxy_crv'), .5)
+ right_shoulder_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_shoulder_proxy_crv'), .5)
right_shoulder_proxy_grp = cmds.group(empty=True, world=True, name=right_shoulder_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_shoulder_proxy_crv, right_shoulder_proxy_grp)
cmds.move(-17.2, 130.4, 0, right_shoulder_proxy_grp)
# Right Elbow
- right_elbow_proxy_crv = create_aim_joint_curve(gt_ab_settings_default.get('right_elbow_proxy_crv'), .5)
+ right_elbow_proxy_crv = create_aim_joint_curve(gt_ab_elements_default.get('right_elbow_proxy_crv'), .5)
right_elbow_proxy_grp = cmds.group(empty=True, world=True, name=right_elbow_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_elbow_proxy_crv, right_elbow_proxy_grp)
cmds.move(-37.7, 130.4, 0, right_elbow_proxy_grp)
# Right Wrist
- right_wrist_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_wrist_proxy_crv'), .6)
+ right_wrist_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_wrist_proxy_crv'), .6)
right_wrist_proxy_grp = cmds.group(empty=True, world=True, name=right_wrist_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_wrist_proxy_crv, right_wrist_proxy_grp)
cmds.move(-58.2, 130.4, 0, right_wrist_proxy_grp)
# Right Thumb
- right_thumb01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_thumb01_proxy_crv'), proxy_finger_scale)
+ right_thumb01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_thumb01_proxy_crv'), proxy_finger_scale)
right_thumb01_proxy_grp = cmds.group(empty=True, world=True, name=right_thumb01_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_thumb01_proxy_crv, right_thumb01_proxy_grp)
cmds.move(-60.8, 130.4, 2.9, right_thumb01_proxy_grp)
- right_thumb02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_thumb02_proxy_crv'), proxy_finger_scale)
+ right_thumb02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_thumb02_proxy_crv'), proxy_finger_scale)
right_thumb02_proxy_grp = cmds.group(empty=True, world=True, name=right_thumb02_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_thumb02_proxy_crv, right_thumb02_proxy_grp)
cmds.move(-60.8, 130.4, 7.3, right_thumb02_proxy_grp)
- right_thumb03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_thumb03_proxy_crv'), proxy_finger_scale)
+ right_thumb03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_thumb03_proxy_crv'), proxy_finger_scale)
right_thumb03_proxy_grp = cmds.group(empty=True, world=True, name=right_thumb03_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_thumb03_proxy_crv, right_thumb03_proxy_grp)
cmds.move(-60.8, 130.4, 11.7, right_thumb03_proxy_grp)
- right_thumb04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_thumb04_proxy_crv'), proxy_end_joint_scale)
+ right_thumb04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_thumb04_proxy_crv'), proxy_end_joint_scale)
right_thumb04_proxy_grp = cmds.group(empty=True, world=True, name=right_thumb04_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_thumb04_proxy_crv, right_thumb04_proxy_grp)
cmds.move(-60.8, 130.4, 16.3, right_thumb04_proxy_grp)
# Right Index
- right_index01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_index01_proxy_crv'), proxy_finger_scale)
+ right_index01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_index01_proxy_crv'), proxy_finger_scale)
right_index01_proxy_grp = cmds.group(empty=True, world=True, name=right_index01_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_index01_proxy_crv, right_index01_proxy_grp)
cmds.move(-66.9, 130.4, 3.5, right_index01_proxy_grp)
- right_index02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_index02_proxy_crv'), proxy_finger_scale)
+ right_index02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_index02_proxy_crv'), proxy_finger_scale)
right_index02_proxy_grp = cmds.group(empty=True, world=True, name=right_index02_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_index02_proxy_crv, right_index02_proxy_grp)
cmds.move(-70.1, 130.4, 3.5, right_index02_proxy_grp)
- right_index03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_index03_proxy_crv'), proxy_finger_scale)
+ right_index03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_index03_proxy_crv'), proxy_finger_scale)
right_index03_proxy_grp = cmds.group(empty=True, world=True, name=right_index03_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_index03_proxy_crv, right_index03_proxy_grp)
cmds.move(-74.2, 130.4, 3.5, right_index03_proxy_grp)
- right_index04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_index04_proxy_crv'), proxy_end_joint_scale)
+ right_index04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_index04_proxy_crv'), proxy_end_joint_scale)
right_index04_proxy_grp = cmds.group(empty=True, world=True, name=right_index04_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_index04_proxy_crv, right_index04_proxy_grp)
cmds.move(-77.5, 130.4, 3.5, right_index04_proxy_grp)
# Right Middle
- right_middle01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_middle01_proxy_crv'), proxy_finger_scale)
+ right_middle01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_middle01_proxy_crv'), proxy_finger_scale)
right_middle01_proxy_grp = cmds.group(empty=True, world=True, name=right_middle01_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_middle01_proxy_crv, right_middle01_proxy_grp)
cmds.move(-66.9, 130.4, 1.1, right_middle01_proxy_grp)
- right_middle02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_middle02_proxy_crv'), proxy_finger_scale)
+ right_middle02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_middle02_proxy_crv'), proxy_finger_scale)
right_middle02_proxy_grp = cmds.group(empty=True, world=True, name=right_middle02_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_middle02_proxy_crv, right_middle02_proxy_grp)
cmds.move(-70.7, 130.4, 1.1, right_middle02_proxy_grp)
- right_middle03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_middle03_proxy_crv'), proxy_finger_scale)
+ right_middle03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_middle03_proxy_crv'), proxy_finger_scale)
right_middle03_proxy_grp = cmds.group(empty=True, world=True, name=right_middle03_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_middle03_proxy_crv, right_middle03_proxy_grp)
cmds.move(-74.4, 130.4, 1.1, right_middle03_proxy_grp)
- right_middle04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_middle04_proxy_crv'), proxy_end_joint_scale)
+ right_middle04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_middle04_proxy_crv'), proxy_end_joint_scale)
right_middle04_proxy_grp = cmds.group(empty=True, world=True, name=right_middle04_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_middle04_proxy_crv, right_middle04_proxy_grp)
cmds.move(-78, 130.4, 1.1, right_middle04_proxy_grp)
# Right Ring
- right_ring01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_ring01_proxy_crv'), proxy_finger_scale)
+ right_ring01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_ring01_proxy_crv'), proxy_finger_scale)
right_ring01_proxy_grp = cmds.group(empty=True, world=True, name=right_ring01_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_ring01_proxy_crv, right_ring01_proxy_grp)
cmds.move(-66.9, 130.4, -1.1, right_ring01_proxy_grp)
- right_ring02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_ring02_proxy_crv'), proxy_finger_scale)
+ right_ring02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_ring02_proxy_crv'), proxy_finger_scale)
right_ring02_proxy_grp = cmds.group(empty=True, world=True, name=right_ring02_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_ring02_proxy_crv, right_ring02_proxy_grp)
cmds.move(-70.4, 130.4, -1.1, right_ring02_proxy_grp)
- right_ring03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_ring03_proxy_crv'), proxy_finger_scale)
+ right_ring03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_ring03_proxy_crv'), proxy_finger_scale)
right_ring03_proxy_grp = cmds.group(empty=True, world=True, name=right_ring03_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_ring03_proxy_crv, right_ring03_proxy_grp)
cmds.move(-74, 130.4, -1.1, right_ring03_proxy_grp)
- right_ring04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_ring04_proxy_crv'), proxy_end_joint_scale)
+ right_ring04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_ring04_proxy_crv'), proxy_end_joint_scale)
right_ring04_proxy_grp = cmds.group(empty=True, world=True, name=right_ring04_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_ring04_proxy_crv, right_ring04_proxy_grp)
cmds.move(-77.5, 130.4, -1.1, right_ring04_proxy_grp)
# Right Pinky
- right_pinky01_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_pinky01_proxy_crv'), proxy_finger_scale)
+ right_pinky01_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_pinky01_proxy_crv'), proxy_finger_scale)
right_pinky01_proxy_grp = cmds.group(empty=True, world=True, name=right_pinky01_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_pinky01_proxy_crv, right_pinky01_proxy_grp)
cmds.move(-66.3, 130.4, -3.2, right_pinky01_proxy_grp)
- right_pinky02_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_pinky02_proxy_crv'), proxy_finger_scale)
+ right_pinky02_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_pinky02_proxy_crv'), proxy_finger_scale)
right_pinky02_proxy_grp = cmds.group(empty=True, world=True, name=right_pinky02_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_pinky02_proxy_crv, right_pinky02_proxy_grp)
cmds.move(-69.6, 130.4, -3.2, right_pinky02_proxy_grp)
- right_pinky03_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_pinky03_proxy_crv'), proxy_finger_scale)
+ right_pinky03_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_pinky03_proxy_crv'), proxy_finger_scale)
right_pinky03_proxy_grp = cmds.group(empty=True, world=True, name=right_pinky03_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_pinky03_proxy_crv, right_pinky03_proxy_grp)
cmds.move(-72.8, 130.4, -3.2, right_pinky03_proxy_grp)
- right_pinky04_proxy_crv = create_directional_joint_curve(gt_ab_settings_default.get('right_pinky04_proxy_crv'), proxy_end_joint_scale)
+ right_pinky04_proxy_crv = create_directional_joint_curve(gt_ab_elements_default.get('right_pinky04_proxy_crv'), proxy_end_joint_scale)
right_pinky04_proxy_grp = cmds.group(empty=True, world=True, name=right_pinky04_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_pinky04_proxy_crv, right_pinky04_proxy_grp)
cmds.move(-76.3, 130.4, -3.2, right_pinky04_proxy_grp)
# Hip
- hip_proxy_crv = create_joint_curve(gt_ab_settings_default.get('hip_proxy_crv'), .4)
+ hip_proxy_crv = create_joint_curve(gt_ab_elements_default.get('hip_proxy_crv'), .4)
hip_proxy_grp = cmds.group(empty=True, world=True, name=hip_proxy_crv + grp_suffix.capitalize())
cmds.parent(hip_proxy_crv, hip_proxy_grp)
cmds.move(0, 84.5, 0, hip_proxy_grp)
################# Left Leg #################
# Left Hip
- left_hip_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_hip_proxy_crv'), .4)
+ left_hip_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_hip_proxy_crv'), .4)
left_hip_proxy_grp = cmds.group(empty=True, world=True, name=left_hip_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_hip_proxy_crv, left_hip_proxy_grp)
cmds.move(10.2, 84.5, 0, left_hip_proxy_grp)
# Left Knee
- left_knee_proxy_crv = create_aim_joint_curve(gt_ab_settings_default.get('left_knee_proxy_crv'), .5)
+ left_knee_proxy_crv = create_aim_joint_curve(gt_ab_elements_default.get('left_knee_proxy_crv'), .5)
cmds.rotate(0, 180, 90, left_knee_proxy_crv)
cmds.makeIdentity(left_knee_proxy_crv, apply=True, translate=True, scale=True, rotate=True)
left_knee_proxy_grp = cmds.group(empty=True, world=True, name=left_knee_proxy_crv + grp_suffix.capitalize())
@@ -2018,19 +2186,19 @@ def create_proxy(colorize_proxy=True):
cmds.move(10.2, 46.8, 0, left_knee_proxy_grp)
# Left Ankle
- left_ankle_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_ankle_proxy_crv'), .4)
+ left_ankle_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_ankle_proxy_crv'), .4)
left_ankle_proxy_grp = cmds.group(empty=True, world=True, name=left_ankle_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_ankle_proxy_crv, left_ankle_proxy_grp)
cmds.move(10.2, 9.6, 0, left_ankle_proxy_grp)
# Left Ball
- left_ball_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_ball_proxy_crv'), .4)
+ left_ball_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_ball_proxy_crv'), .4)
left_ball_proxy_grp = cmds.group(empty=True, world=True, name=left_ball_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_ball_proxy_crv, left_ball_proxy_grp)
cmds.move(10.2, 0, 13.1, left_ball_proxy_grp)
# Left Toe
- left_toe_proxy_crv = create_joint_curve(gt_ab_settings_default.get('left_toe_proxy_crv'), .35)
+ left_toe_proxy_crv = create_joint_curve(gt_ab_elements_default.get('left_toe_proxy_crv'), .35)
left_toe_proxy_grp = cmds.group(empty=True, world=True, name=left_toe_proxy_crv + grp_suffix.capitalize())
cmds.parent(left_toe_proxy_crv, left_toe_proxy_grp)
cmds.move(10.2, 0, 23.4, left_toe_proxy_grp)
@@ -2038,13 +2206,13 @@ def create_proxy(colorize_proxy=True):
################# Right Leg #################
# Right Hip
- right_hip_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_hip_proxy_crv'), .4)
+ right_hip_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_hip_proxy_crv'), .4)
right_hip_proxy_grp = cmds.group(empty=True, world=True, name=right_hip_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_hip_proxy_crv, right_hip_proxy_grp)
cmds.move(-10.2, 84.5, 0, right_hip_proxy_grp)
# Right Knee
- right_knee_proxy_crv = create_aim_joint_curve(gt_ab_settings_default.get('right_knee_proxy_crv'), .5)
+ right_knee_proxy_crv = create_aim_joint_curve(gt_ab_elements_default.get('right_knee_proxy_crv'), .5)
cmds.rotate(0, 180, 90, right_knee_proxy_crv)
cmds.makeIdentity(right_knee_proxy_crv, apply=True, translate=True, scale=True, rotate=True)
right_knee_proxy_grp = cmds.group(empty=True, world=True, name=right_knee_proxy_crv + grp_suffix.capitalize())
@@ -2052,19 +2220,19 @@ def create_proxy(colorize_proxy=True):
cmds.move(-1.75, 8, 0, right_knee_proxy_grp)
# Right Ankle
- right_ankle_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_ankle_proxy_crv'), .4)
+ right_ankle_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_ankle_proxy_crv'), .4)
right_ankle_proxy_grp = cmds.group(empty=True, world=True, name=right_ankle_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_ankle_proxy_crv, right_ankle_proxy_grp)
cmds.move(-10.2, 9.6, 0, right_ankle_proxy_grp)
# Right Ball
- right_ball_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_ball_proxy_crv'), .4)
+ right_ball_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_ball_proxy_crv'), .4)
right_ball_proxy_grp = cmds.group(empty=True, world=True, name=right_ball_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_ball_proxy_crv, right_ball_proxy_grp)
cmds.move(-10.2, 0, 13.1, right_ball_proxy_grp)
# Right Toe
- right_toe_proxy_crv = create_joint_curve(gt_ab_settings_default.get('right_toe_proxy_crv'), .35)
+ right_toe_proxy_crv = create_joint_curve(gt_ab_elements_default.get('right_toe_proxy_crv'), .35)
right_toe_proxy_grp = cmds.group(empty=True, world=True, name=right_toe_proxy_crv + grp_suffix.capitalize())
cmds.parent(right_toe_proxy_crv, right_toe_proxy_grp)
cmds.move(-10.2, 0, 23.4, right_toe_proxy_grp)
@@ -2193,14 +2361,14 @@ def create_proxy(colorize_proxy=True):
# Left Elbow Constraints
# Left Elbow Pole Vector Dir
- left_elbow_pv_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_pv_dir') )
- cmds.delete(cmds.pointConstraint(gt_ab_settings_default.get('left_elbow_proxy_crv'), left_elbow_pv_loc[0]))
- cmds.parent(left_elbow_pv_loc[0], gt_ab_settings_default.get('left_elbow_proxy_crv'))
+ left_elbow_pv_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_pv_dir') )
+ cmds.delete(cmds.pointConstraint(gt_ab_elements_default.get('left_elbow_proxy_crv'), left_elbow_pv_loc[0]))
+ cmds.parent(left_elbow_pv_loc[0], gt_ab_elements_default.get('left_elbow_proxy_crv'))
cmds.move(0,0,-9.6, left_elbow_pv_loc[0], relative=True)
- left_elbow_dir_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_dir_loc') )
- left_elbow_aim_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_aim_loc') )
- left_elbow_upvec_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_upvec_loc') )
+ left_elbow_dir_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_dir_loc') )
+ left_elbow_aim_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_aim_loc') )
+ left_elbow_upvec_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_upvec_loc') )
left_elbow_upvec_loc_grp = cmds.group(empty=True, world=True, name=left_elbow_upvec_loc[0] + grp_suffix.capitalize())
cmds.parent(left_elbow_aim_loc, left_elbow_dir_loc)
@@ -2214,7 +2382,7 @@ def create_proxy(colorize_proxy=True):
cmds.pointConstraint(left_shoulder_proxy_crv, left_elbow_upvec_loc_grp, skip=['x','z'])
- left_elbow_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_settings_default.get('left_elbow_divide_node'))
+ left_elbow_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_elements_default.get('left_elbow_divide_node'))
cmds.setAttr(left_elbow_divide_node + '.operation', 2) # Make Divide
cmds.setAttr(left_elbow_divide_node + '.input2X', -2)
@@ -2231,14 +2399,14 @@ def create_proxy(colorize_proxy=True):
# Right Elbow Constraints
# Right Elbow Pole Vector Dir
- right_elbow_pv_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_pv_dir') )
- cmds.delete(cmds.pointConstraint(gt_ab_settings_default.get('right_elbow_proxy_crv'), right_elbow_pv_loc[0]))
- cmds.parent(right_elbow_pv_loc[0], gt_ab_settings_default.get('right_elbow_proxy_crv'))
+ right_elbow_pv_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_pv_dir') )
+ cmds.delete(cmds.pointConstraint(gt_ab_elements_default.get('right_elbow_proxy_crv'), right_elbow_pv_loc[0]))
+ cmds.parent(right_elbow_pv_loc[0], gt_ab_elements_default.get('right_elbow_proxy_crv'))
cmds.move(0,0,-9.6, right_elbow_pv_loc[0], relative=True)
- right_elbow_dir_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_dir_loc') )
- right_elbow_aim_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_aim_loc') )
- right_elbow_upvec_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_upvec_loc') )
+ right_elbow_dir_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_dir_loc') )
+ right_elbow_aim_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_aim_loc') )
+ right_elbow_upvec_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_upvec_loc') )
right_elbow_upvec_loc_grp = cmds.group(empty=True, world=True, name=right_elbow_upvec_loc[0] + grp_suffix.capitalize())
cmds.parent(right_elbow_aim_loc, right_elbow_dir_loc)
@@ -2252,7 +2420,7 @@ def create_proxy(colorize_proxy=True):
cmds.pointConstraint(right_shoulder_proxy_crv, right_elbow_upvec_loc_grp, skip=['x','z'])
- right_elbow_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_settings_default.get('right_elbow_divide_node'))
+ right_elbow_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_elements_default.get('right_elbow_divide_node'))
cmds.setAttr(right_elbow_divide_node + '.operation', 2) # Make Divide
cmds.setAttr(right_elbow_divide_node + '.input2X', -2)
@@ -2269,7 +2437,7 @@ def create_proxy(colorize_proxy=True):
# Left Knee Setup
- left_knee_pv_dir = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_pv_dir') )
+ left_knee_pv_dir = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_pv_dir') )
temp = cmds.pointConstraint(left_knee_proxy_crv, left_knee_pv_dir)
cmds.delete(temp)
cmds.move(0, 0, 12.9, left_knee_pv_dir, relative=True)
@@ -2277,7 +2445,7 @@ def create_proxy(colorize_proxy=True):
# Right Knee Setup
- right_knee_pv_dir = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_pv_dir') )
+ right_knee_pv_dir = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_pv_dir') )
temp = cmds.pointConstraint(right_knee_proxy_crv, right_knee_pv_dir)
cmds.delete(temp)
cmds.move(0, 0, 12.9, right_knee_pv_dir, relative=True)
@@ -2285,16 +2453,16 @@ def create_proxy(colorize_proxy=True):
# Left Knee Constraints
- left_knee_dir_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_dir_loc') )
- left_knee_aim_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_aim_loc') )
- left_knee_upvec_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_upvec_loc') )
+ left_knee_dir_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_dir_loc') )
+ left_knee_aim_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_aim_loc') )
+ left_knee_upvec_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_upvec_loc') )
left_knee_upvec_loc_grp = cmds.group(empty=True, world=True, name=left_knee_upvec_loc[0] + grp_suffix.capitalize())
cmds.parent(left_knee_upvec_loc, left_knee_upvec_loc_grp)
cmds.parent(left_knee_upvec_loc_grp, main_crv)
cmds.parent(left_knee_dir_loc[0], main_crv)
cmds.parent(left_knee_aim_loc[0], left_knee_dir_loc[0])
- left_knee_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_settings_default.get('left_knee_divide_node'))
+ left_knee_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_elements_default.get('left_knee_divide_node'))
cmds.setAttr(left_knee_divide_node + '.operation', 2) # Make Divide
cmds.setAttr(left_knee_divide_node + '.input2X', -2)
cmds.connectAttr(left_ankle_proxy_crv + '.tx', left_knee_divide_node + '.input1X')
@@ -2313,16 +2481,16 @@ def create_proxy(colorize_proxy=True):
# Right Knee Constraints
- right_knee_dir_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_dir_loc') )
- right_knee_aim_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_aim_loc') )
- right_knee_upvec_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_upvec_loc') )
+ right_knee_dir_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_dir_loc') )
+ right_knee_aim_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_aim_loc') )
+ right_knee_upvec_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_upvec_loc') )
right_knee_upvec_loc_grp = cmds.group(empty=True, world=True, name=right_knee_upvec_loc[0] + grp_suffix.capitalize())
cmds.parent(right_knee_upvec_loc, right_knee_upvec_loc_grp)
cmds.parent(right_knee_upvec_loc_grp, main_crv)
cmds.parent(right_knee_dir_loc[0], main_crv)
cmds.parent(right_knee_aim_loc[0], right_knee_dir_loc[0])
- right_knee_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_settings_default.get('right_knee_divide_node'))
+ right_knee_divide_node = cmds.createNode('multiplyDivide', name=gt_ab_elements_default.get('right_knee_divide_node'))
cmds.setAttr(right_knee_divide_node + '.operation', 2) # Make Divide
cmds.setAttr(right_knee_divide_node + '.input2X', -2)
cmds.connectAttr(right_ankle_proxy_crv + '.tx', right_knee_divide_node + '.input1X')
@@ -2341,7 +2509,7 @@ def create_proxy(colorize_proxy=True):
# Left Rolls
- left_ball_pivot_grp = cmds.group(empty=True, world=True, name=gt_ab_settings_default.get('left_ball_pivot_grp'))
+ left_ball_pivot_grp = cmds.group(empty=True, world=True, name=gt_ab_elements_default.get('left_ball_pivot_grp'))
cmds.parent(left_ball_pivot_grp, main_crv)
ankle_pos = cmds.xform(left_ankle_proxy_crv, q=True, ws=True, rp=True)
cmds.move(ankle_pos[0], left_ball_pivot_grp, moveX=True)
@@ -2352,7 +2520,7 @@ def create_proxy(colorize_proxy=True):
cmds.parent(left_ball_proxy_grp, left_ball_pivot_grp)
# Right Rolls
- right_ball_pivot_grp = cmds.group(empty=True, world=True, name=gt_ab_settings_default.get('right_ball_pivot_grp'))
+ right_ball_pivot_grp = cmds.group(empty=True, world=True, name=gt_ab_elements_default.get('right_ball_pivot_grp'))
cmds.parent(right_ball_pivot_grp, main_crv)
ankle_pos = cmds.xform(right_ankle_proxy_crv, q=True, ws=True, rp=True)
cmds.move(ankle_pos[0], right_ball_pivot_grp, moveX=True)
@@ -2548,119 +2716,119 @@ def create_proxy(colorize_proxy=True):
cmds.connectAttr(right_ankle_proxy_crv + '.followHip', constraint[0] + '.w0')
# Store new names into settings in case they were modified
- gt_ab_settings['main_crv'] = main_crv
- gt_ab_settings['cog_proxy_crv'] = cog_proxy_crv
- gt_ab_settings['spine01_proxy_crv'] = spine01_proxy_crv
- gt_ab_settings['spine02_proxy_crv'] = spine02_proxy_crv
- gt_ab_settings['spine03_proxy_crv'] = spine03_proxy_crv
- gt_ab_settings['spine04_proxy_crv'] = spine04_proxy_crv
- gt_ab_settings['neck_base_proxy_crv'] = neck_base_proxy_crv
- gt_ab_settings['neck_mid_proxy_crv'] = neck_mid_proxy_crv
- gt_ab_settings['head_proxy_crv'] = head_proxy_crv
- gt_ab_settings['head_end_proxy_crv'] = head_end_proxy_crv
- gt_ab_settings['jaw_proxy_crv'] = jaw_proxy_crv
- gt_ab_settings['jaw_end_proxy_crv'] = jaw_end_proxy_crv
- gt_ab_settings['hip_proxy_crv'] = hip_proxy_crv
+ gt_ab_elements['main_crv'] = main_crv
+ gt_ab_elements['cog_proxy_crv'] = cog_proxy_crv
+ gt_ab_elements['spine01_proxy_crv'] = spine01_proxy_crv
+ gt_ab_elements['spine02_proxy_crv'] = spine02_proxy_crv
+ gt_ab_elements['spine03_proxy_crv'] = spine03_proxy_crv
+ gt_ab_elements['spine04_proxy_crv'] = spine04_proxy_crv
+ gt_ab_elements['neck_base_proxy_crv'] = neck_base_proxy_crv
+ gt_ab_elements['neck_mid_proxy_crv'] = neck_mid_proxy_crv
+ gt_ab_elements['head_proxy_crv'] = head_proxy_crv
+ gt_ab_elements['head_end_proxy_crv'] = head_end_proxy_crv
+ gt_ab_elements['jaw_proxy_crv'] = jaw_proxy_crv
+ gt_ab_elements['jaw_end_proxy_crv'] = jaw_end_proxy_crv
+ gt_ab_elements['hip_proxy_crv'] = hip_proxy_crv
# Left Side Elements
- gt_ab_settings['left_eye_proxy_crv'] = left_eye_proxy_crv
- gt_ab_settings['left_clavicle_proxy_crv'] = left_clavicle_proxy_crv
- gt_ab_settings['left_shoulder_proxy_crv'] = left_shoulder_proxy_crv
- gt_ab_settings['left_elbow_proxy_crv'] = left_elbow_proxy_crv
- gt_ab_settings['left_wrist_proxy_crv'] = left_wrist_proxy_crv
- gt_ab_settings['left_thumb01_proxy_crv'] = left_thumb01_proxy_crv
- gt_ab_settings['left_thumb02_proxy_crv'] = left_thumb02_proxy_crv
- gt_ab_settings['left_thumb03_proxy_crv'] = left_thumb03_proxy_crv
- gt_ab_settings['left_thumb04_proxy_crv'] = left_thumb04_proxy_crv
- gt_ab_settings['left_index01_proxy_crv'] = left_index01_proxy_crv
- gt_ab_settings['left_index02_proxy_crv'] = left_index02_proxy_crv
- gt_ab_settings['left_index03_proxy_crv'] = left_index03_proxy_crv
- gt_ab_settings['left_index04_proxy_crv'] = left_index04_proxy_crv
- gt_ab_settings['left_middle01_proxy_crv'] = left_middle01_proxy_crv
- gt_ab_settings['left_middle02_proxy_crv'] = left_middle02_proxy_crv
- gt_ab_settings['left_middle03_proxy_crv'] = left_middle03_proxy_crv
- gt_ab_settings['left_middle04_proxy_crv'] = left_middle04_proxy_crv
- gt_ab_settings['left_ring01_proxy_crv'] = left_ring01_proxy_crv
- gt_ab_settings['left_ring02_proxy_crv'] = left_ring02_proxy_crv
- gt_ab_settings['left_ring03_proxy_crv'] = left_ring03_proxy_crv
- gt_ab_settings['left_ring04_proxy_crv'] = left_ring04_proxy_crv
- gt_ab_settings['left_pinky01_proxy_crv'] = left_pinky01_proxy_crv
- gt_ab_settings['left_pinky02_proxy_crv'] = left_pinky02_proxy_crv
- gt_ab_settings['left_pinky03_proxy_crv'] = left_pinky03_proxy_crv
- gt_ab_settings['left_pinky04_proxy_crv'] = left_pinky04_proxy_crv
- gt_ab_settings['left_hip_proxy_crv'] = left_hip_proxy_crv
- gt_ab_settings['left_knee_proxy_crv'] = left_knee_proxy_crv
- gt_ab_settings['left_ankle_proxy_crv'] = left_ankle_proxy_crv
- gt_ab_settings['left_ball_proxy_crv'] = left_ball_proxy_crv
- gt_ab_settings['left_toe_proxy_crv'] = left_toe_proxy_crv
- gt_ab_settings['left_elbow_pv_loc'] = left_elbow_pv_loc[0]
- gt_ab_settings['left_elbow_dir_loc'] = left_elbow_dir_loc[0]
- gt_ab_settings['left_elbow_aim_loc'] = left_elbow_aim_loc[0]
- gt_ab_settings['left_elbow_upvec_loc'] = left_elbow_upvec_loc[0]
- gt_ab_settings['left_elbow_divide_node'] = left_elbow_divide_node
- gt_ab_settings['left_knee_pv_dir'] = left_knee_pv_dir[0]
- gt_ab_settings['left_knee_dir_loc'] = left_knee_dir_loc[0]
- gt_ab_settings['left_knee_aim_loc'] = left_knee_aim_loc[0]
- gt_ab_settings['left_knee_upvec_loc'] = left_knee_upvec_loc[0]
- gt_ab_settings['left_knee_divide_node'] = left_knee_divide_node
- gt_ab_settings['left_ball_pivot_grp'] = left_ball_pivot_grp
+ gt_ab_elements['left_eye_proxy_crv'] = left_eye_proxy_crv
+ gt_ab_elements['left_clavicle_proxy_crv'] = left_clavicle_proxy_crv
+ gt_ab_elements['left_shoulder_proxy_crv'] = left_shoulder_proxy_crv
+ gt_ab_elements['left_elbow_proxy_crv'] = left_elbow_proxy_crv
+ gt_ab_elements['left_wrist_proxy_crv'] = left_wrist_proxy_crv
+ gt_ab_elements['left_thumb01_proxy_crv'] = left_thumb01_proxy_crv
+ gt_ab_elements['left_thumb02_proxy_crv'] = left_thumb02_proxy_crv
+ gt_ab_elements['left_thumb03_proxy_crv'] = left_thumb03_proxy_crv
+ gt_ab_elements['left_thumb04_proxy_crv'] = left_thumb04_proxy_crv
+ gt_ab_elements['left_index01_proxy_crv'] = left_index01_proxy_crv
+ gt_ab_elements['left_index02_proxy_crv'] = left_index02_proxy_crv
+ gt_ab_elements['left_index03_proxy_crv'] = left_index03_proxy_crv
+ gt_ab_elements['left_index04_proxy_crv'] = left_index04_proxy_crv
+ gt_ab_elements['left_middle01_proxy_crv'] = left_middle01_proxy_crv
+ gt_ab_elements['left_middle02_proxy_crv'] = left_middle02_proxy_crv
+ gt_ab_elements['left_middle03_proxy_crv'] = left_middle03_proxy_crv
+ gt_ab_elements['left_middle04_proxy_crv'] = left_middle04_proxy_crv
+ gt_ab_elements['left_ring01_proxy_crv'] = left_ring01_proxy_crv
+ gt_ab_elements['left_ring02_proxy_crv'] = left_ring02_proxy_crv
+ gt_ab_elements['left_ring03_proxy_crv'] = left_ring03_proxy_crv
+ gt_ab_elements['left_ring04_proxy_crv'] = left_ring04_proxy_crv
+ gt_ab_elements['left_pinky01_proxy_crv'] = left_pinky01_proxy_crv
+ gt_ab_elements['left_pinky02_proxy_crv'] = left_pinky02_proxy_crv
+ gt_ab_elements['left_pinky03_proxy_crv'] = left_pinky03_proxy_crv
+ gt_ab_elements['left_pinky04_proxy_crv'] = left_pinky04_proxy_crv
+ gt_ab_elements['left_hip_proxy_crv'] = left_hip_proxy_crv
+ gt_ab_elements['left_knee_proxy_crv'] = left_knee_proxy_crv
+ gt_ab_elements['left_ankle_proxy_crv'] = left_ankle_proxy_crv
+ gt_ab_elements['left_ball_proxy_crv'] = left_ball_proxy_crv
+ gt_ab_elements['left_toe_proxy_crv'] = left_toe_proxy_crv
+ gt_ab_elements['left_elbow_pv_loc'] = left_elbow_pv_loc[0]
+ gt_ab_elements['left_elbow_dir_loc'] = left_elbow_dir_loc[0]
+ gt_ab_elements['left_elbow_aim_loc'] = left_elbow_aim_loc[0]
+ gt_ab_elements['left_elbow_upvec_loc'] = left_elbow_upvec_loc[0]
+ gt_ab_elements['left_elbow_divide_node'] = left_elbow_divide_node
+ gt_ab_elements['left_knee_pv_dir'] = left_knee_pv_dir[0]
+ gt_ab_elements['left_knee_dir_loc'] = left_knee_dir_loc[0]
+ gt_ab_elements['left_knee_aim_loc'] = left_knee_aim_loc[0]
+ gt_ab_elements['left_knee_upvec_loc'] = left_knee_upvec_loc[0]
+ gt_ab_elements['left_knee_divide_node'] = left_knee_divide_node
+ gt_ab_elements['left_ball_pivot_grp'] = left_ball_pivot_grp
# Right Side Elements
- gt_ab_settings['right_eye_proxy_crv'] = right_eye_proxy_crv
- gt_ab_settings['right_clavicle_proxy_crv'] = right_clavicle_proxy_crv
- gt_ab_settings['right_shoulder_proxy_crv'] = right_shoulder_proxy_crv
- gt_ab_settings['right_elbow_proxy_crv'] = right_elbow_proxy_crv
- gt_ab_settings['right_wrist_proxy_crv'] = right_wrist_proxy_crv
- gt_ab_settings['right_thumb01_proxy_crv'] = right_thumb01_proxy_crv
- gt_ab_settings['right_thumb02_proxy_crv'] = right_thumb02_proxy_crv
- gt_ab_settings['right_thumb03_proxy_crv'] = right_thumb03_proxy_crv
- gt_ab_settings['right_thumb04_proxy_crv'] = right_thumb04_proxy_crv
- gt_ab_settings['right_index01_proxy_crv'] = right_index01_proxy_crv
- gt_ab_settings['right_index02_proxy_crv'] = right_index02_proxy_crv
- gt_ab_settings['right_index03_proxy_crv'] = right_index03_proxy_crv
- gt_ab_settings['right_index04_proxy_crv'] = right_index04_proxy_crv
- gt_ab_settings['right_middle01_proxy_crv'] = right_middle01_proxy_crv
- gt_ab_settings['right_middle02_proxy_crv'] = right_middle02_proxy_crv
- gt_ab_settings['right_middle03_proxy_crv'] = right_middle03_proxy_crv
- gt_ab_settings['right_middle04_proxy_crv'] = right_middle04_proxy_crv
- gt_ab_settings['right_ring01_proxy_crv'] = right_ring01_proxy_crv
- gt_ab_settings['right_ring02_proxy_crv'] = right_ring02_proxy_crv
- gt_ab_settings['right_ring03_proxy_crv'] = right_ring03_proxy_crv
- gt_ab_settings['right_ring04_proxy_crv'] = right_ring04_proxy_crv
- gt_ab_settings['right_pinky01_proxy_crv'] = right_pinky01_proxy_crv
- gt_ab_settings['right_pinky02_proxy_crv'] = right_pinky02_proxy_crv
- gt_ab_settings['right_pinky03_proxy_crv'] = right_pinky03_proxy_crv
- gt_ab_settings['right_pinky04_proxy_crv'] = right_pinky04_proxy_crv
- gt_ab_settings['right_hip_proxy_crv'] = right_hip_proxy_crv
- gt_ab_settings['right_knee_proxy_crv'] = right_knee_proxy_crv
- gt_ab_settings['right_ankle_proxy_crv'] = right_ankle_proxy_crv
- gt_ab_settings['right_ball_proxy_crv'] = right_ball_proxy_crv
- gt_ab_settings['right_toe_proxy_crv'] = right_toe_proxy_crv
- gt_ab_settings['right_elbow_pv_loc'] = right_elbow_pv_loc[0]
- gt_ab_settings['right_elbow_dir_loc'] = right_elbow_dir_loc[0]
- gt_ab_settings['right_elbow_aim_loc'] = right_elbow_aim_loc[0]
- gt_ab_settings['right_elbow_upvec_loc'] = right_elbow_upvec_loc[0]
- gt_ab_settings['right_elbow_divide_node'] = right_elbow_divide_node
- gt_ab_settings['right_knee_pv_dir'] = right_knee_pv_dir[0]
- gt_ab_settings['right_knee_dir_loc'] = right_knee_dir_loc[0]
- gt_ab_settings['right_knee_aim_loc'] = right_knee_aim_loc[0]
- gt_ab_settings['right_knee_upvec_loc'] = right_knee_upvec_loc[0]
- gt_ab_settings['right_knee_divide_node'] = right_knee_divide_node
- gt_ab_settings['right_ball_pivot_grp'] = right_ball_pivot_grp
+ gt_ab_elements['right_eye_proxy_crv'] = right_eye_proxy_crv
+ gt_ab_elements['right_clavicle_proxy_crv'] = right_clavicle_proxy_crv
+ gt_ab_elements['right_shoulder_proxy_crv'] = right_shoulder_proxy_crv
+ gt_ab_elements['right_elbow_proxy_crv'] = right_elbow_proxy_crv
+ gt_ab_elements['right_wrist_proxy_crv'] = right_wrist_proxy_crv
+ gt_ab_elements['right_thumb01_proxy_crv'] = right_thumb01_proxy_crv
+ gt_ab_elements['right_thumb02_proxy_crv'] = right_thumb02_proxy_crv
+ gt_ab_elements['right_thumb03_proxy_crv'] = right_thumb03_proxy_crv
+ gt_ab_elements['right_thumb04_proxy_crv'] = right_thumb04_proxy_crv
+ gt_ab_elements['right_index01_proxy_crv'] = right_index01_proxy_crv
+ gt_ab_elements['right_index02_proxy_crv'] = right_index02_proxy_crv
+ gt_ab_elements['right_index03_proxy_crv'] = right_index03_proxy_crv
+ gt_ab_elements['right_index04_proxy_crv'] = right_index04_proxy_crv
+ gt_ab_elements['right_middle01_proxy_crv'] = right_middle01_proxy_crv
+ gt_ab_elements['right_middle02_proxy_crv'] = right_middle02_proxy_crv
+ gt_ab_elements['right_middle03_proxy_crv'] = right_middle03_proxy_crv
+ gt_ab_elements['right_middle04_proxy_crv'] = right_middle04_proxy_crv
+ gt_ab_elements['right_ring01_proxy_crv'] = right_ring01_proxy_crv
+ gt_ab_elements['right_ring02_proxy_crv'] = right_ring02_proxy_crv
+ gt_ab_elements['right_ring03_proxy_crv'] = right_ring03_proxy_crv
+ gt_ab_elements['right_ring04_proxy_crv'] = right_ring04_proxy_crv
+ gt_ab_elements['right_pinky01_proxy_crv'] = right_pinky01_proxy_crv
+ gt_ab_elements['right_pinky02_proxy_crv'] = right_pinky02_proxy_crv
+ gt_ab_elements['right_pinky03_proxy_crv'] = right_pinky03_proxy_crv
+ gt_ab_elements['right_pinky04_proxy_crv'] = right_pinky04_proxy_crv
+ gt_ab_elements['right_hip_proxy_crv'] = right_hip_proxy_crv
+ gt_ab_elements['right_knee_proxy_crv'] = right_knee_proxy_crv
+ gt_ab_elements['right_ankle_proxy_crv'] = right_ankle_proxy_crv
+ gt_ab_elements['right_ball_proxy_crv'] = right_ball_proxy_crv
+ gt_ab_elements['right_toe_proxy_crv'] = right_toe_proxy_crv
+ gt_ab_elements['right_elbow_pv_loc'] = right_elbow_pv_loc[0]
+ gt_ab_elements['right_elbow_dir_loc'] = right_elbow_dir_loc[0]
+ gt_ab_elements['right_elbow_aim_loc'] = right_elbow_aim_loc[0]
+ gt_ab_elements['right_elbow_upvec_loc'] = right_elbow_upvec_loc[0]
+ gt_ab_elements['right_elbow_divide_node'] = right_elbow_divide_node
+ gt_ab_elements['right_knee_pv_dir'] = right_knee_pv_dir[0]
+ gt_ab_elements['right_knee_dir_loc'] = right_knee_dir_loc[0]
+ gt_ab_elements['right_knee_aim_loc'] = right_knee_aim_loc[0]
+ gt_ab_elements['right_knee_upvec_loc'] = right_knee_upvec_loc[0]
+ gt_ab_elements['right_knee_divide_node'] = right_knee_divide_node
+ gt_ab_elements['right_ball_pivot_grp'] = right_ball_pivot_grp
# Visibility Adjustments
- for obj in gt_ab_settings:
+ for obj in gt_ab_elements:
if obj.endswith('_crv'):
- proxy_crv = gt_ab_settings.get(obj)
+ proxy_crv = gt_ab_elements.get(obj)
is_end_jnt = False
color = (0,0,0)
if '_endProxy' in proxy_crv:
add_node_note(proxy_crv, 'This is an end proxy. This element will be used to determine the orientation of its parent. For example:\n"jaw_endProxy" determines the orientation of the "jaw_proxy".\n\nEven though a joint will be generated it mostly likely shouldn\'t be an influence when skinning.')
color = (.5,.5,0)
is_end_jnt=True
- elif gt_ab_settings.get('neck_mid_proxy_crv') in proxy_crv:
+ elif gt_ab_elements.get('neck_mid_proxy_crv') in proxy_crv:
add_node_note(proxy_crv, 'This is the neckMid proxy. This element will be automated to receive part of its transforms from the neckBase and the other part from the head.')
color = (.3,.3,0)
- elif gt_ab_settings.get('left_toe_proxy_crv') in proxy_crv or gt_ab_settings.get('right_toe_proxy_crv') in proxy_crv:
+ elif gt_ab_elements.get('left_toe_proxy_crv') in proxy_crv or gt_ab_elements.get('right_toe_proxy_crv') in proxy_crv:
add_node_note(proxy_crv, 'This is a toe proxy. This element will be used to automate toe poses. Much like an end proxy, it will generate a joint that most likely shoudln\'t be used as an influence when skinning.\n\nThis joint should be placed at the end of the longest toe.')
color = (.3,.3,0)
is_end_jnt=True
@@ -2668,19 +2836,19 @@ def create_proxy(colorize_proxy=True):
color = (1,.4,.4)
elif proxy_crv.startswith('left_'):
color = (.2,.6,1)
- elif gt_ab_settings.get('spine01_proxy_crv') in proxy_crv or gt_ab_settings.get('spine02_proxy_crv') in proxy_crv or gt_ab_settings.get('spine03_proxy_crv') in proxy_crv:
+ elif gt_ab_elements.get('spine01_proxy_crv') in proxy_crv or gt_ab_elements.get('spine02_proxy_crv') in proxy_crv or gt_ab_elements.get('spine03_proxy_crv') in proxy_crv:
color = (.3,.3,0)
else:
color = (1,1,.65)
# Notes Only
- if gt_ab_settings.get('left_eye_proxy_crv') in proxy_crv or gt_ab_settings.get('right_eye_proxy_crv') in proxy_crv:
+ if gt_ab_elements.get('left_eye_proxy_crv') in proxy_crv or gt_ab_elements.get('right_eye_proxy_crv') in proxy_crv:
add_node_note(proxy_crv, 'This is an eye proxy.\nThis element should be snapped to the center of the eye geometry.\nYou can see the center of the eye by selecting the eye geometry then going to "Display > Transform Display > Local Rotation Axes".\nYou can then use this axis to snap the joint to its center. (Using "Ctrl + V")\n\nPS: If for some reason the pivot point is not in the center of the eye, you can reset it first: "Modify > Center Pivot".')
- if gt_ab_settings.get('left_elbow_proxy_crv') in proxy_crv or gt_ab_settings.get('right_elbow_proxy_crv') in proxy_crv:
+ if gt_ab_elements.get('left_elbow_proxy_crv') in proxy_crv or gt_ab_elements.get('right_elbow_proxy_crv') in proxy_crv:
add_node_note(proxy_crv, 'This is an elbow proxy.\nThe movement of this element is intentionaly limited to attempt to keep the joints in one single plane. For better results keep the arm joints in "T" or "A" pose.')
- if gt_ab_settings.get('left_knee_proxy_crv') in proxy_crv or gt_ab_settings.get('right_knee_proxy_crv') in proxy_crv:
+ if gt_ab_elements.get('left_knee_proxy_crv') in proxy_crv or gt_ab_elements.get('right_knee_proxy_crv') in proxy_crv:
add_node_note(proxy_crv, 'This is a knee proxy.\nThe movement of this element is intentionaly limited to attempt to keep the joints in one single plane. For better results keep the leg joints in "T" or "A" pose.')
if colorize_proxy:
@@ -2690,81 +2858,81 @@ def create_proxy(colorize_proxy=True):
# Create Lines
line_list = []
- line_list.append(create_visualization_line(gt_ab_settings.get('cog_proxy_crv'), gt_ab_settings.get('hip_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('cog_proxy_crv'), gt_ab_settings.get('spine01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('spine01_proxy_crv'), gt_ab_settings.get('spine02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('spine02_proxy_crv'), gt_ab_settings.get('spine03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('spine03_proxy_crv'), gt_ab_settings.get('spine04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('spine04_proxy_crv'), gt_ab_settings.get('neck_base_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('neck_base_proxy_crv'), gt_ab_settings.get('neck_mid_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('neck_mid_proxy_crv'), gt_ab_settings.get('head_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('head_proxy_crv'), gt_ab_settings.get('head_end_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('head_proxy_crv'), gt_ab_settings.get('jaw_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('jaw_proxy_crv'), gt_ab_settings.get('jaw_end_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('head_proxy_crv'), gt_ab_settings.get('left_eye_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('head_proxy_crv'), gt_ab_settings.get('right_eye_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('cog_proxy_crv'), gt_ab_elements.get('hip_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('cog_proxy_crv'), gt_ab_elements.get('spine01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('spine01_proxy_crv'), gt_ab_elements.get('spine02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('spine02_proxy_crv'), gt_ab_elements.get('spine03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('spine03_proxy_crv'), gt_ab_elements.get('spine04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('spine04_proxy_crv'), gt_ab_elements.get('neck_base_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('neck_base_proxy_crv'), gt_ab_elements.get('neck_mid_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('neck_mid_proxy_crv'), gt_ab_elements.get('head_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('head_proxy_crv'), gt_ab_elements.get('head_end_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('head_proxy_crv'), gt_ab_elements.get('jaw_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('jaw_proxy_crv'), gt_ab_elements.get('jaw_end_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('head_proxy_crv'), gt_ab_elements.get('left_eye_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('head_proxy_crv'), gt_ab_elements.get('right_eye_proxy_crv')))
# Left Side
- line_list.append(create_visualization_line(gt_ab_settings.get('hip_proxy_crv'), gt_ab_settings.get('left_hip_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_hip_proxy_crv'), gt_ab_settings.get('left_knee_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_knee_proxy_crv'), gt_ab_settings.get('left_ankle_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_ankle_proxy_crv'), gt_ab_settings.get('left_ball_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_ball_proxy_crv'), gt_ab_settings.get('left_toe_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('spine04_proxy_crv'), gt_ab_settings.get('left_clavicle_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_clavicle_proxy_crv'), gt_ab_settings.get('left_shoulder_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_shoulder_proxy_crv'), gt_ab_settings.get('left_elbow_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_elbow_proxy_crv'), gt_ab_settings.get('left_wrist_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('hip_proxy_crv'), gt_ab_elements.get('left_hip_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_hip_proxy_crv'), gt_ab_elements.get('left_knee_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_knee_proxy_crv'), gt_ab_elements.get('left_ankle_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_ankle_proxy_crv'), gt_ab_elements.get('left_ball_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_ball_proxy_crv'), gt_ab_elements.get('left_toe_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('spine04_proxy_crv'), gt_ab_elements.get('left_clavicle_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_clavicle_proxy_crv'), gt_ab_elements.get('left_shoulder_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_shoulder_proxy_crv'), gt_ab_elements.get('left_elbow_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_elbow_proxy_crv'), gt_ab_elements.get('left_wrist_proxy_crv')))
# Left Fingers
- line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_thumb01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_thumb01_proxy_crv'), gt_ab_settings.get('left_thumb02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_thumb02_proxy_crv'), gt_ab_settings.get('left_thumb03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_thumb03_proxy_crv'), gt_ab_settings.get('left_thumb04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_index01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_index01_proxy_crv'), gt_ab_settings.get('left_index02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_index02_proxy_crv'), gt_ab_settings.get('left_index03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_index03_proxy_crv'), gt_ab_settings.get('left_index04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_middle01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_middle01_proxy_crv'), gt_ab_settings.get('left_middle02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_middle02_proxy_crv'), gt_ab_settings.get('left_middle03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_middle03_proxy_crv'), gt_ab_settings.get('left_middle04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_ring01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_ring01_proxy_crv'), gt_ab_settings.get('left_ring02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_ring02_proxy_crv'), gt_ab_settings.get('left_ring03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_ring03_proxy_crv'), gt_ab_settings.get('left_ring04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_wrist_proxy_crv'), gt_ab_settings.get('left_pinky01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_pinky01_proxy_crv'), gt_ab_settings.get('left_pinky02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_pinky02_proxy_crv'), gt_ab_settings.get('left_pinky03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('left_pinky03_proxy_crv'), gt_ab_settings.get('left_pinky04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_thumb01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_thumb01_proxy_crv'), gt_ab_elements.get('left_thumb02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_thumb02_proxy_crv'), gt_ab_elements.get('left_thumb03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_thumb03_proxy_crv'), gt_ab_elements.get('left_thumb04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_index01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_index01_proxy_crv'), gt_ab_elements.get('left_index02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_index02_proxy_crv'), gt_ab_elements.get('left_index03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_index03_proxy_crv'), gt_ab_elements.get('left_index04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_middle01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_middle01_proxy_crv'), gt_ab_elements.get('left_middle02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_middle02_proxy_crv'), gt_ab_elements.get('left_middle03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_middle03_proxy_crv'), gt_ab_elements.get('left_middle04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_ring01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_ring01_proxy_crv'), gt_ab_elements.get('left_ring02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_ring02_proxy_crv'), gt_ab_elements.get('left_ring03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_ring03_proxy_crv'), gt_ab_elements.get('left_ring04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_wrist_proxy_crv'), gt_ab_elements.get('left_pinky01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_pinky01_proxy_crv'), gt_ab_elements.get('left_pinky02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_pinky02_proxy_crv'), gt_ab_elements.get('left_pinky03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('left_pinky03_proxy_crv'), gt_ab_elements.get('left_pinky04_proxy_crv')))
# Right Side
- line_list.append(create_visualization_line(gt_ab_settings.get('hip_proxy_crv'), gt_ab_settings.get('right_hip_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_hip_proxy_crv'), gt_ab_settings.get('right_knee_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_knee_proxy_crv'), gt_ab_settings.get('right_ankle_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_ankle_proxy_crv'), gt_ab_settings.get('right_ball_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_ball_proxy_crv'), gt_ab_settings.get('right_toe_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('spine04_proxy_crv'), gt_ab_settings.get('right_clavicle_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_clavicle_proxy_crv'), gt_ab_settings.get('right_shoulder_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_shoulder_proxy_crv'), gt_ab_settings.get('right_elbow_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_elbow_proxy_crv'), gt_ab_settings.get('right_wrist_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('hip_proxy_crv'), gt_ab_elements.get('right_hip_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_hip_proxy_crv'), gt_ab_elements.get('right_knee_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_knee_proxy_crv'), gt_ab_elements.get('right_ankle_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_ankle_proxy_crv'), gt_ab_elements.get('right_ball_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_ball_proxy_crv'), gt_ab_elements.get('right_toe_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('spine04_proxy_crv'), gt_ab_elements.get('right_clavicle_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_clavicle_proxy_crv'), gt_ab_elements.get('right_shoulder_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_shoulder_proxy_crv'), gt_ab_elements.get('right_elbow_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_elbow_proxy_crv'), gt_ab_elements.get('right_wrist_proxy_crv')))
# Right Fingers
- line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_thumb01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_thumb01_proxy_crv'), gt_ab_settings.get('right_thumb02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_thumb02_proxy_crv'), gt_ab_settings.get('right_thumb03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_thumb03_proxy_crv'), gt_ab_settings.get('right_thumb04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_index01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_index01_proxy_crv'), gt_ab_settings.get('right_index02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_index02_proxy_crv'), gt_ab_settings.get('right_index03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_index03_proxy_crv'), gt_ab_settings.get('right_index04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_middle01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_middle01_proxy_crv'), gt_ab_settings.get('right_middle02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_middle02_proxy_crv'), gt_ab_settings.get('right_middle03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_middle03_proxy_crv'), gt_ab_settings.get('right_middle04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_ring01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_ring01_proxy_crv'), gt_ab_settings.get('right_ring02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_ring02_proxy_crv'), gt_ab_settings.get('right_ring03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_ring03_proxy_crv'), gt_ab_settings.get('right_ring04_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_wrist_proxy_crv'), gt_ab_settings.get('right_pinky01_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_pinky01_proxy_crv'), gt_ab_settings.get('right_pinky02_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_pinky02_proxy_crv'), gt_ab_settings.get('right_pinky03_proxy_crv')))
- line_list.append(create_visualization_line(gt_ab_settings.get('right_pinky03_proxy_crv'), gt_ab_settings.get('right_pinky04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_thumb01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_thumb01_proxy_crv'), gt_ab_elements.get('right_thumb02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_thumb02_proxy_crv'), gt_ab_elements.get('right_thumb03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_thumb03_proxy_crv'), gt_ab_elements.get('right_thumb04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_index01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_index01_proxy_crv'), gt_ab_elements.get('right_index02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_index02_proxy_crv'), gt_ab_elements.get('right_index03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_index03_proxy_crv'), gt_ab_elements.get('right_index04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_middle01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_middle01_proxy_crv'), gt_ab_elements.get('right_middle02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_middle02_proxy_crv'), gt_ab_elements.get('right_middle03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_middle03_proxy_crv'), gt_ab_elements.get('right_middle04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_ring01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_ring01_proxy_crv'), gt_ab_elements.get('right_ring02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_ring02_proxy_crv'), gt_ab_elements.get('right_ring03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_ring03_proxy_crv'), gt_ab_elements.get('right_ring04_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_wrist_proxy_crv'), gt_ab_elements.get('right_pinky01_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_pinky01_proxy_crv'), gt_ab_elements.get('right_pinky02_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_pinky02_proxy_crv'), gt_ab_elements.get('right_pinky03_proxy_crv')))
+ line_list.append(create_visualization_line(gt_ab_elements.get('right_pinky03_proxy_crv'), gt_ab_elements.get('right_pinky04_proxy_crv')))
lines_grp = cmds.group(name='visualization_lines', empty=True, world=True)
cmds.setAttr(lines_grp + '.overrideEnabled', 1)
@@ -2773,19 +2941,19 @@ def create_proxy(colorize_proxy=True):
for obj in line_objs:
cmds.parent(obj, lines_grp)
- cmds.parent(lines_grp, gt_ab_settings.get('main_proxy_grp'))
+ cmds.parent(lines_grp, gt_ab_elements.get('main_proxy_grp'))
- cmds.addAttr(gt_ab_settings.get('main_crv'), ln="proxyOptions", at="enum", en="-------------:", keyable=True)
- cmds.setAttr(gt_ab_settings.get('main_crv') + '.proxyOptions', lock=True)
- cmds.addAttr(gt_ab_settings.get('main_crv'), ln="linesVisibility", at="bool", keyable=True)
- cmds.setAttr(gt_ab_settings.get('main_crv') + '.linesVisibility', 1)
- cmds.connectAttr(gt_ab_settings.get('main_crv') + '.linesVisibility', lines_grp + '.v', f=True)
+ cmds.addAttr(gt_ab_elements.get('main_crv'), ln="proxyOptions", at="enum", en="-------------:", keyable=True)
+ cmds.setAttr(gt_ab_elements.get('main_crv') + '.proxyOptions', lock=True)
+ cmds.addAttr(gt_ab_elements.get('main_crv'), ln="linesVisibility", at="bool", keyable=True)
+ cmds.setAttr(gt_ab_elements.get('main_crv') + '.linesVisibility', 1)
+ cmds.connectAttr(gt_ab_elements.get('main_crv') + '.linesVisibility', lines_grp + '.v', f=True)
# Main Proxy Control Scale
- cmds.connectAttr(gt_ab_settings.get('main_crv') + '.sy', gt_ab_settings.get('main_crv') + '.sx', f=True)
- cmds.connectAttr(gt_ab_settings.get('main_crv') + '.sy', gt_ab_settings.get('main_crv') + '.sz', f=True)
- cmds.setAttr(gt_ab_settings.get('main_crv') + '.sx', k=False)
- cmds.setAttr(gt_ab_settings.get('main_crv') + '.sz', k=False)
+ cmds.connectAttr(gt_ab_elements.get('main_crv') + '.sy', gt_ab_elements.get('main_crv') + '.sx', f=True)
+ cmds.connectAttr(gt_ab_elements.get('main_crv') + '.sy', gt_ab_elements.get('main_crv') + '.sz', f=True)
+ cmds.setAttr(gt_ab_elements.get('main_crv') + '.sx', k=False)
+ cmds.setAttr(gt_ab_elements.get('main_crv') + '.sz', k=False)
# Clean Selection and Print Feedback
@@ -2941,11 +3109,11 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Create Joints
gt_ab_joints = {}
- for obj in gt_ab_settings:
+ for obj in gt_ab_elements:
if obj.endswith('_crv'):
cmds.select(d=True)
- joint = cmds.joint(name=rename_proxy(gt_ab_settings.get(obj)), radius=1)
- constraint = cmds.pointConstraint(gt_ab_settings.get(obj), joint)
+ joint = cmds.joint(name=rename_proxy(gt_ab_elements.get(obj)), radius=1)
+ constraint = cmds.pointConstraint(gt_ab_elements.get(obj), joint)
cmds.delete(constraint)
gt_ab_joints[obj.replace('_crv','_' + jnt_suffix).replace('_proxy', '')] = joint
@@ -2960,46 +3128,46 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
orient_to_target(gt_ab_joints.get('jaw_jnt'), gt_ab_joints.get('jaw_end_jnt'), (90, 0, 90))
# Left Finger Orients
- orient_to_target(gt_ab_joints.get('left_thumb01_jnt'), gt_ab_joints.get('left_thumb02_jnt'), (0, 0, 0), gt_ab_settings.get('left_thumb01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_thumb02_jnt'), gt_ab_joints.get('left_thumb03_jnt'), (0, 0, 0), gt_ab_settings.get('left_thumb02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_thumb03_jnt'), gt_ab_joints.get('left_thumb04_jnt'), (0, 0, 0), gt_ab_settings.get('left_thumb03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_thumb01_jnt'), gt_ab_joints.get('left_thumb02_jnt'), (0, 0, 0), gt_ab_elements.get('left_thumb01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_thumb02_jnt'), gt_ab_joints.get('left_thumb03_jnt'), (0, 0, 0), gt_ab_elements.get('left_thumb02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_thumb03_jnt'), gt_ab_joints.get('left_thumb04_jnt'), (0, 0, 0), gt_ab_elements.get('left_thumb03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_index01_jnt'), gt_ab_joints.get('left_index02_jnt'), (0, 0, 90), gt_ab_settings.get('left_index01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_index02_jnt'), gt_ab_joints.get('left_index03_jnt'), (0, 0, 90), gt_ab_settings.get('left_index02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_index03_jnt'), gt_ab_joints.get('left_index04_jnt'), (0, 0, 90), gt_ab_settings.get('left_index03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_index01_jnt'), gt_ab_joints.get('left_index02_jnt'), (0, 0, 90), gt_ab_elements.get('left_index01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_index02_jnt'), gt_ab_joints.get('left_index03_jnt'), (0, 0, 90), gt_ab_elements.get('left_index02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_index03_jnt'), gt_ab_joints.get('left_index04_jnt'), (0, 0, 90), gt_ab_elements.get('left_index03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_middle01_jnt'), gt_ab_joints.get('left_middle02_jnt'), (0, 0, 90), gt_ab_settings.get('left_middle01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_middle02_jnt'), gt_ab_joints.get('left_middle03_jnt'), (0, 0, 90), gt_ab_settings.get('left_middle02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_middle03_jnt'), gt_ab_joints.get('left_middle04_jnt'), (0, 0, 90), gt_ab_settings.get('left_middle03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_middle01_jnt'), gt_ab_joints.get('left_middle02_jnt'), (0, 0, 90), gt_ab_elements.get('left_middle01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_middle02_jnt'), gt_ab_joints.get('left_middle03_jnt'), (0, 0, 90), gt_ab_elements.get('left_middle02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_middle03_jnt'), gt_ab_joints.get('left_middle04_jnt'), (0, 0, 90), gt_ab_elements.get('left_middle03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_ring01_jnt'), gt_ab_joints.get('left_ring02_jnt'), (0, 0, 90), gt_ab_settings.get('left_ring01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_ring02_jnt'), gt_ab_joints.get('left_ring03_jnt'), (0, 0, 90), gt_ab_settings.get('left_ring02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_ring03_jnt'), gt_ab_joints.get('left_ring04_jnt'), (0, 0, 90), gt_ab_settings.get('left_ring03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_ring01_jnt'), gt_ab_joints.get('left_ring02_jnt'), (0, 0, 90), gt_ab_elements.get('left_ring01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_ring02_jnt'), gt_ab_joints.get('left_ring03_jnt'), (0, 0, 90), gt_ab_elements.get('left_ring02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_ring03_jnt'), gt_ab_joints.get('left_ring04_jnt'), (0, 0, 90), gt_ab_elements.get('left_ring03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_pinky01_jnt'), gt_ab_joints.get('left_pinky02_jnt'), (0, 0, 90), gt_ab_settings.get('left_pinky01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_pinky02_jnt'), gt_ab_joints.get('left_pinky03_jnt'), (0, 0, 90), gt_ab_settings.get('left_pinky02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('left_pinky03_jnt'), gt_ab_joints.get('left_pinky04_jnt'), (0, 0, 90), gt_ab_settings.get('left_pinky03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_pinky01_jnt'), gt_ab_joints.get('left_pinky02_jnt'), (0, 0, 90), gt_ab_elements.get('left_pinky01_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_pinky02_jnt'), gt_ab_joints.get('left_pinky03_jnt'), (0, 0, 90), gt_ab_elements.get('left_pinky02_proxy_crv'), up_vec=(0,1,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('left_pinky03_jnt'), gt_ab_joints.get('left_pinky04_jnt'), (0, 0, 90), gt_ab_elements.get('left_pinky03_proxy_crv'), up_vec=(0,1,0), brute_force=True)
# Right Finger Orients
- orient_to_target(gt_ab_joints.get('right_thumb01_jnt'), gt_ab_joints.get('right_thumb02_jnt'), (0, 180, 0), gt_ab_settings.get('right_thumb01_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_thumb02_jnt'), gt_ab_joints.get('right_thumb03_jnt'), (0, 180, 0), gt_ab_settings.get('right_thumb02_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_thumb03_jnt'), gt_ab_joints.get('right_thumb04_jnt'), (0, 180, 0), gt_ab_settings.get('right_thumb03_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_thumb01_jnt'), gt_ab_joints.get('right_thumb02_jnt'), (0, 180, 0), gt_ab_elements.get('right_thumb01_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_thumb02_jnt'), gt_ab_joints.get('right_thumb03_jnt'), (0, 180, 0), gt_ab_elements.get('right_thumb02_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_thumb03_jnt'), gt_ab_joints.get('right_thumb04_jnt'), (0, 180, 0), gt_ab_elements.get('right_thumb03_proxy_crv'), up_vec=(0,-1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_index01_jnt'), gt_ab_joints.get('right_index02_jnt'), (0, 180, 0), gt_ab_settings.get('right_index01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_index02_jnt'), gt_ab_joints.get('right_index03_jnt'), (0, 180, 0), gt_ab_settings.get('right_index02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_index03_jnt'), gt_ab_joints.get('right_index04_jnt'), (0, 180, 0), gt_ab_settings.get('right_index03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_index01_jnt'), gt_ab_joints.get('right_index02_jnt'), (0, 180, 0), gt_ab_elements.get('right_index01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_index02_jnt'), gt_ab_joints.get('right_index03_jnt'), (0, 180, 0), gt_ab_elements.get('right_index02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_index03_jnt'), gt_ab_joints.get('right_index04_jnt'), (0, 180, 0), gt_ab_elements.get('right_index03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_middle01_jnt'), gt_ab_joints.get('right_middle02_jnt'), (0, 180, 0), gt_ab_settings.get('right_middle01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_middle02_jnt'), gt_ab_joints.get('right_middle03_jnt'), (0, 180, 0), gt_ab_settings.get('right_middle02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_middle03_jnt'), gt_ab_joints.get('right_middle04_jnt'), (0, 180, 0), gt_ab_settings.get('right_middle03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_middle01_jnt'), gt_ab_joints.get('right_middle02_jnt'), (0, 180, 0), gt_ab_elements.get('right_middle01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_middle02_jnt'), gt_ab_joints.get('right_middle03_jnt'), (0, 180, 0), gt_ab_elements.get('right_middle02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_middle03_jnt'), gt_ab_joints.get('right_middle04_jnt'), (0, 180, 0), gt_ab_elements.get('right_middle03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_ring01_jnt'), gt_ab_joints.get('right_ring02_jnt'), (0, 180, 0), gt_ab_settings.get('right_ring01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_ring02_jnt'), gt_ab_joints.get('right_ring03_jnt'), (0, 180, 0), gt_ab_settings.get('right_ring02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_ring03_jnt'), gt_ab_joints.get('right_ring04_jnt'), (0, 180, 0), gt_ab_settings.get('right_ring03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_ring01_jnt'), gt_ab_joints.get('right_ring02_jnt'), (0, 180, 0), gt_ab_elements.get('right_ring01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_ring02_jnt'), gt_ab_joints.get('right_ring03_jnt'), (0, 180, 0), gt_ab_elements.get('right_ring02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_ring03_jnt'), gt_ab_joints.get('right_ring04_jnt'), (0, 180, 0), gt_ab_elements.get('right_ring03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_pinky01_jnt'), gt_ab_joints.get('right_pinky02_jnt'), (0, 180, 0), gt_ab_settings.get('right_pinky01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_pinky02_jnt'), gt_ab_joints.get('right_pinky03_jnt'), (0, 180, 0), gt_ab_settings.get('right_pinky02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
- orient_to_target(gt_ab_joints.get('right_pinky03_jnt'), gt_ab_joints.get('right_pinky04_jnt'), (0, 180, 0), gt_ab_settings.get('right_pinky03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_pinky01_jnt'), gt_ab_joints.get('right_pinky02_jnt'), (0, 180, 0), gt_ab_elements.get('right_pinky01_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_pinky02_jnt'), gt_ab_joints.get('right_pinky03_jnt'), (0, 180, 0), gt_ab_elements.get('right_pinky02_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
+ orient_to_target(gt_ab_joints.get('right_pinky03_jnt'), gt_ab_joints.get('right_pinky04_jnt'), (0, 180, 0), gt_ab_elements.get('right_pinky03_proxy_crv'), up_vec=(0,1,0), aim_vec=(1,0,0), brute_force=True)
# Center Parenting
@@ -3118,13 +3286,13 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
change_viewport_color(joint, (.3,.3,0))
# Set Orientation For Arms
- orient_to_target(gt_ab_joints.get('left_clavicle_jnt'), gt_ab_joints.get('left_shoulder_jnt'), (-90,0,0), gt_ab_settings.get('left_clavicle_proxy_crv'))
+ orient_to_target(gt_ab_joints.get('left_clavicle_jnt'), gt_ab_joints.get('left_shoulder_jnt'), (-90,0,0), gt_ab_elements.get('left_clavicle_proxy_crv'))
orient_to_target(gt_ab_joints.get('left_shoulder_jnt'), gt_ab_joints.get('left_elbow_jnt'), (-90,0,0))
- orient_to_target(gt_ab_joints.get('left_elbow_jnt'), gt_ab_joints.get('left_wrist_jnt'), (-90,0,0), gt_ab_settings.get('left_elbow_proxy_crv'))
+ orient_to_target(gt_ab_joints.get('left_elbow_jnt'), gt_ab_joints.get('left_wrist_jnt'), (-90,0,0), gt_ab_elements.get('left_elbow_proxy_crv'))
- orient_to_target(gt_ab_joints.get('right_clavicle_jnt'), gt_ab_joints.get('right_shoulder_jnt'), (90,0,0), gt_ab_settings.get('right_clavicle_proxy_crv'), (-1,0,0))
+ orient_to_target(gt_ab_joints.get('right_clavicle_jnt'), gt_ab_joints.get('right_shoulder_jnt'), (90,0,0), gt_ab_elements.get('right_clavicle_proxy_crv'), (-1,0,0))
orient_to_target(gt_ab_joints.get('right_shoulder_jnt'), gt_ab_joints.get('right_elbow_jnt'), (90,0,0), aim_vec=(-1,0,0))
- orient_to_target(gt_ab_joints.get('right_elbow_jnt'), gt_ab_joints.get('right_wrist_jnt'), (90,0,0), gt_ab_settings.get('right_elbow_proxy_crv'), aim_vec=(-1,0,0))
+ orient_to_target(gt_ab_joints.get('right_elbow_jnt'), gt_ab_joints.get('right_wrist_jnt'), (90,0,0), gt_ab_elements.get('right_elbow_proxy_crv'), aim_vec=(-1,0,0))
# Left Arm Parenting
cmds.parent(gt_ab_joints.get('left_clavicle_jnt'), gt_ab_joints.get('spine04_jnt'))
@@ -3148,12 +3316,12 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.parent(gt_ab_joints.get('left_pinky01_jnt'), world=True)
# Left Wrist Orient
- temp_transform = cmds.group(empty=True, world=True, name=gt_ab_settings.get('left_wrist_proxy_crv') + '_orient_target')
- constraint = cmds.parentConstraint(gt_ab_settings.get('left_wrist_proxy_crv'), temp_transform)
+ temp_transform = cmds.group(empty=True, world=True, name=gt_ab_elements.get('left_wrist_proxy_crv') + '_orient_target')
+ constraint = cmds.parentConstraint(gt_ab_elements.get('left_wrist_proxy_crv'), temp_transform)
cmds.delete(constraint)
- cmds.parent(temp_transform, gt_ab_settings.get('left_wrist_proxy_crv'))
+ cmds.parent(temp_transform, gt_ab_elements.get('left_wrist_proxy_crv'))
cmds.setAttr(temp_transform + '.tx', 1)
- orient_to_target(gt_ab_joints.get('left_wrist_jnt'), temp_transform, (-90,0,0), gt_ab_settings.get('left_wrist_proxy_crv'))
+ orient_to_target(gt_ab_joints.get('left_wrist_jnt'), temp_transform, (-90,0,0), gt_ab_elements.get('left_wrist_proxy_crv'))
cmds.delete(temp_transform)
# Left Add Fingers
@@ -3174,12 +3342,12 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.parent(gt_ab_joints.get('right_pinky01_jnt'), world=True)
# Right Wrist Orient
- temp_transform = cmds.group(empty=True, world=True, name=gt_ab_settings.get('right_wrist_proxy_crv') + '_orient_target')
- constraint = cmds.parentConstraint(gt_ab_settings.get('right_wrist_proxy_crv'), temp_transform)
+ temp_transform = cmds.group(empty=True, world=True, name=gt_ab_elements.get('right_wrist_proxy_crv') + '_orient_target')
+ constraint = cmds.parentConstraint(gt_ab_elements.get('right_wrist_proxy_crv'), temp_transform)
cmds.delete(constraint)
- cmds.parent(temp_transform, gt_ab_settings.get('right_wrist_proxy_crv'))
+ cmds.parent(temp_transform, gt_ab_elements.get('right_wrist_proxy_crv'))
cmds.setAttr(temp_transform + '.tx', -1)
- orient_to_target(gt_ab_joints.get('right_wrist_jnt'), temp_transform, (90,0,0), gt_ab_settings.get('right_wrist_proxy_crv'), (-1,0,0))
+ orient_to_target(gt_ab_joints.get('right_wrist_jnt'), temp_transform, (90,0,0), gt_ab_elements.get('right_wrist_proxy_crv'), (-1,0,0))
cmds.delete(temp_transform)
# Right Add Fingers
@@ -3198,7 +3366,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.parent(gt_ab_joints.get('spine01_jnt'), world=True)
# Root Orients
- cog_orients = cmds.xform(gt_ab_settings.get('cog_proxy_crv'), q=True, ro=True)
+ cog_orients = cmds.xform(gt_ab_elements.get('cog_proxy_crv'), q=True, ro=True)
cmds.joint(gt_ab_joints.get('cog_jnt'), e=True, oj='none', zso=True) # ch
cmds.setAttr(gt_ab_joints.get('cog_jnt') + '.jointOrientX', 90)
cmds.setAttr(gt_ab_joints.get('cog_jnt') + '.jointOrientY', 0)
@@ -3207,7 +3375,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.makeIdentity(gt_ab_joints.get('cog_jnt'), apply=True, rotate=True)
# Hip Orients
- hip_orients = cmds.xform(gt_ab_settings.get('hip_proxy_crv'), q=True, ro=True)
+ hip_orients = cmds.xform(gt_ab_elements.get('hip_proxy_crv'), q=True, ro=True)
cmds.joint(gt_ab_joints.get('hip_jnt'), e=True, oj='none', zso=True)
cmds.setAttr(gt_ab_joints.get('hip_jnt') + '.jointOrientX', 90)
cmds.setAttr(gt_ab_joints.get('hip_jnt') + '.jointOrientY', 0)
@@ -3216,19 +3384,19 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.makeIdentity(gt_ab_joints.get('hip_jnt'), apply=True, rotate=True)
- orient_to_target(gt_ab_joints.get('left_hip_jnt'), gt_ab_joints.get('left_knee_jnt'), (90,0,-90), gt_ab_settings.get('left_knee_proxy_crv'))
- orient_to_target(gt_ab_joints.get('left_knee_jnt'), gt_ab_joints.get('left_ankle_jnt'), (90,0,-90), gt_ab_settings.get('left_knee_proxy_crv'))
+ orient_to_target(gt_ab_joints.get('left_hip_jnt'), gt_ab_joints.get('left_knee_jnt'), (90,0,-90), gt_ab_elements.get('left_knee_proxy_crv'))
+ orient_to_target(gt_ab_joints.get('left_knee_jnt'), gt_ab_joints.get('left_ankle_jnt'), (90,0,-90), gt_ab_elements.get('left_knee_proxy_crv'))
- orient_to_target(gt_ab_joints.get('right_hip_jnt'), gt_ab_joints.get('right_knee_jnt'), (90,0,-90), gt_ab_settings.get('right_knee_proxy_crv'), (-1,0,0))
- orient_to_target(gt_ab_joints.get('right_knee_jnt'), gt_ab_joints.get('right_ankle_jnt'), (90,0,-90), gt_ab_settings.get('right_knee_proxy_crv'), (-1,0,0))
+ orient_to_target(gt_ab_joints.get('right_hip_jnt'), gt_ab_joints.get('right_knee_jnt'), (90,0,-90), gt_ab_elements.get('right_knee_proxy_crv'), (-1,0,0))
+ orient_to_target(gt_ab_joints.get('right_knee_jnt'), gt_ab_joints.get('right_ankle_jnt'), (90,0,-90), gt_ab_elements.get('right_knee_proxy_crv'), (-1,0,0))
# Feet Orients
# Left Foot
- orient_to_target(gt_ab_joints.get('left_ankle_jnt'), gt_ab_joints.get('left_ball_jnt'), (90,0,-90), gt_ab_settings.get('left_ankle_proxy_crv'))#, (-1,0,0))
- orient_to_target(gt_ab_joints.get('left_ball_jnt'), gt_ab_joints.get('left_toe_jnt'), (90,0,-90), gt_ab_settings.get('left_ball_proxy_crv'))#, (-1,0,0))
+ orient_to_target(gt_ab_joints.get('left_ankle_jnt'), gt_ab_joints.get('left_ball_jnt'), (90,0,-90), gt_ab_elements.get('left_ankle_proxy_crv'))#, (-1,0,0))
+ orient_to_target(gt_ab_joints.get('left_ball_jnt'), gt_ab_joints.get('left_toe_jnt'), (90,0,-90), gt_ab_elements.get('left_ball_proxy_crv'))#, (-1,0,0))
# Right Foot
- orient_to_target(gt_ab_joints.get('right_ankle_jnt'), gt_ab_joints.get('right_ball_jnt'), (90,0,-90), gt_ab_settings.get('right_ankle_proxy_crv'), (-1,0,0))
- orient_to_target(gt_ab_joints.get('right_ball_jnt'), gt_ab_joints.get('right_toe_jnt'), (90,0,-90), gt_ab_settings.get('right_ball_proxy_crv'), (-1,0,0))
+ orient_to_target(gt_ab_joints.get('right_ankle_jnt'), gt_ab_joints.get('right_ball_jnt'), (90,0,-90), gt_ab_elements.get('right_ankle_proxy_crv'), (-1,0,0))
+ orient_to_target(gt_ab_joints.get('right_ball_jnt'), gt_ab_joints.get('right_toe_jnt'), (90,0,-90), gt_ab_elements.get('right_ball_proxy_crv'), (-1,0,0))
# Right Leg Parenting
@@ -3278,19 +3446,19 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
change_viewport_color(gt_ab_joints.get('right_forearm_jnt'), (1,1,0))
# # Left Eye Orient
- # temp_transform = cmds.group(empty=True, world=True, name=gt_ab_settings.get('left_eye_proxy_crv') + '_orient_target')
- # cmds.delete(cmds.parentConstraint(gt_ab_settings.get('left_eye_proxy_crv'), temp_transform))
- # cmds.parent(temp_transform, gt_ab_settings.get('left_eye_proxy_crv'))
+ # temp_transform = cmds.group(empty=True, world=True, name=gt_ab_elements.get('left_eye_proxy_crv') + '_orient_target')
+ # cmds.delete(cmds.parentConstraint(gt_ab_elements.get('left_eye_proxy_crv'), temp_transform))
+ # cmds.parent(temp_transform, gt_ab_elements.get('left_eye_proxy_crv'))
# cmds.setAttr(temp_transform + '.tz', 1)
- # orient_to_target(gt_ab_joints.get('left_eye_jnt'), temp_transform, (0,0,0), gt_ab_settings.get('left_eye_proxy_crv'))#, (-1,0,0))
+ # orient_to_target(gt_ab_joints.get('left_eye_jnt'), temp_transform, (0,0,0), gt_ab_elements.get('left_eye_proxy_crv'))#, (-1,0,0))
# cmds.delete(temp_transform)
# # Right Eye Orient
- # temp_transform = cmds.group(empty=True, world=True, name=gt_ab_settings.get('right_eye_proxy_crv') + '_orient_target')
- # cmds.delete(cmds.parentConstraint(gt_ab_settings.get('right_eye_proxy_crv'), temp_transform))
- # cmds.parent(temp_transform, gt_ab_settings.get('right_eye_proxy_crv'))
+ # temp_transform = cmds.group(empty=True, world=True, name=gt_ab_elements.get('right_eye_proxy_crv') + '_orient_target')
+ # cmds.delete(cmds.parentConstraint(gt_ab_elements.get('right_eye_proxy_crv'), temp_transform))
+ # cmds.parent(temp_transform, gt_ab_elements.get('right_eye_proxy_crv'))
# cmds.setAttr(temp_transform + '.tz', 1)
- # orient_to_target(gt_ab_joints.get('right_eye_jnt'), temp_transform, (0,0,0), gt_ab_settings.get('right_eye_proxy_crv'))#, (-1,0,0))
+ # orient_to_target(gt_ab_joints.get('right_eye_jnt'), temp_transform, (0,0,0), gt_ab_elements.get('right_eye_proxy_crv'))#, (-1,0,0))
# cmds.delete(temp_transform)
@@ -3542,7 +3710,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Main Ctrl
main_ctrl = create_main_control(name='main_' + ctrl_suffix)
- main_ctrl_scale = cmds.xform(gt_ab_settings.get('main_crv'), q=True, ws=True, scale=True)
+ main_ctrl_scale = cmds.xform(gt_ab_elements.get('main_crv'), q=True, ws=True, scale=True)
cmds.scale( main_ctrl_scale[1], main_ctrl_scale[1], main_ctrl_scale[1], main_ctrl )
cmds.makeIdentity(main_ctrl, apply=True, scale=True)
@@ -3562,7 +3730,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
for shape in cmds.listRelatives(direction_ctrl, s=True, f=True) or []:
shape = cmds.rename(shape, "{0}Shape".format(direction_ctrl))
change_viewport_color(direction_ctrl, (1,1,0))
- cmds.delete(cmds.scaleConstraint(gt_ab_settings.get('main_crv'), direction_ctrl))
+ cmds.delete(cmds.scaleConstraint(gt_ab_elements.get('main_crv'), direction_ctrl))
cmds.makeIdentity(direction_ctrl, apply=True, scale=True)
direction_ctrl_grp = cmds.group(name=direction_ctrl + grp_suffix.capitalize(), empty=True, world=True)
cmds.parent(direction_ctrl, direction_ctrl_grp)
@@ -3887,8 +4055,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Left Knee Find Position
temp_transform = cmds.group(name=left_knee_ik_ctrl + '_rotExtraction', empty=True, world=True)
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('left_knee_proxy_crv'), temp_transform))
- cmds.delete(cmds.aimConstraint(gt_ab_settings.get('left_knee_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0)))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('left_knee_proxy_crv'), temp_transform))
+ cmds.delete(cmds.aimConstraint(gt_ab_elements.get('left_knee_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0)))
cmds.move(left_knee_scale_offset ,0 , 0, temp_transform, os=True, relative=True)
cmds.delete(cmds.pointConstraint(temp_transform, left_knee_ik_ctrl_grp))
cmds.delete(temp_transform)
@@ -3920,8 +4088,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Left Foot Position
cmds.delete(cmds.pointConstraint([gt_ab_joints.get('left_ankle_jnt'), gt_ab_joints.get('left_toe_jnt')], left_foot_ik_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(left_foot_ik_ctrl_grp + '.ry', desired_rotation[1])
# Left Foot Pivot Adjustment
@@ -4034,8 +4202,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Right Knee Find Position
temp_transform = cmds.group(name=right_knee_ik_ctrl + '_rotExtraction', empty=True, world=True)
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_knee_proxy_crv'), temp_transform))
- cmds.delete(cmds.aimConstraint(gt_ab_settings.get('right_knee_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0)))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_knee_proxy_crv'), temp_transform))
+ cmds.delete(cmds.aimConstraint(gt_ab_elements.get('right_knee_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0)))
cmds.move(right_knee_scale_offset*-1 ,0 , 0, temp_transform, os=True, relative=True)
cmds.delete(cmds.pointConstraint(temp_transform, right_knee_ik_ctrl_grp))
cmds.delete(temp_transform)
@@ -4067,8 +4235,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Right Foot Position
cmds.delete(cmds.pointConstraint([gt_ab_joints.get('right_ankle_jnt'), gt_ab_joints.get('right_toe_jnt')], right_foot_ik_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(right_foot_ik_ctrl_grp + '.ry', desired_rotation[1])
# Right Foot Pivot Adjustment
@@ -4277,8 +4445,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Left Knee Find Position
left_arm_scale_offset = left_arm_scale_offset*.5
temp_transform = cmds.group(name=left_elbow_ik_ctrl + '_rotExtraction', empty=True, world=True)
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('left_elbow_proxy_crv'), temp_transform))
- cmds.delete(cmds.aimConstraint(gt_ab_settings.get('left_elbow_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0)))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('left_elbow_proxy_crv'), temp_transform))
+ cmds.delete(cmds.aimConstraint(gt_ab_elements.get('left_elbow_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,-1,0), worldUpType="vector", worldUpVector=(0,1,0)))
cmds.move(left_arm_scale_offset ,0 , 0, temp_transform, os=True, relative=True)
cmds.delete(cmds.pointConstraint(temp_transform, left_elbow_ik_ctrl_grp))
cmds.delete(temp_transform)
@@ -4488,8 +4656,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Right Elbow Find Position
right_arm_scale_offset = abs(right_arm_scale_offset)*.5
temp_transform = cmds.group(name=right_elbow_ik_ctrl + '_rotExtraction', empty=True, world=True)
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_elbow_proxy_crv'), temp_transform))
- cmds.delete(cmds.aimConstraint(gt_ab_settings.get('right_elbow_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,1,0), worldUpType="vector", worldUpVector=(0,1,0)))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_elbow_proxy_crv'), temp_transform))
+ cmds.delete(cmds.aimConstraint(gt_ab_elements.get('right_elbow_pv_dir'), temp_transform, offset=(0,0,0), aimVector=(1,0,0), upVector=(0,1,0), worldUpType="vector", worldUpVector=(0,1,0)))
cmds.move(right_arm_scale_offset ,0 , 0, temp_transform, os=True, relative=True)
cmds.delete(cmds.pointConstraint(temp_transform, right_elbow_ik_ctrl_grp))
cmds.delete(temp_transform)
@@ -4530,7 +4698,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.parent(left_arm_switch, left_arm_switch_grp)
change_viewport_color(left_arm_switch, left_ctrl_color)
- cmds.delete(cmds.parentConstraint(gt_ab_settings.get('left_wrist_proxy_crv'), left_arm_switch_grp))
+ cmds.delete(cmds.parentConstraint(gt_ab_elements.get('left_wrist_proxy_crv'), left_arm_switch_grp))
cmds.parent(left_arm_switch_grp, main_ctrl)
# Right Arm
@@ -4559,7 +4727,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.parent(right_arm_switch, right_arm_switch_grp)
change_viewport_color(right_arm_switch, right_ctrl_color)
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_wrist_proxy_crv'), right_arm_switch_grp))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_wrist_proxy_crv'), right_arm_switch_grp))
cmds.parent(right_arm_switch_grp, main_ctrl)
@@ -4589,9 +4757,9 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.parent(left_leg_switch, left_leg_switch_grp)
change_viewport_color(left_leg_switch, left_ctrl_color)
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('left_ankle_proxy_crv'), left_leg_switch_grp))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('left_ankle_proxy_crv'), left_leg_switch_grp))
- desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True)
cmds.setAttr(left_leg_switch_grp + '.ry', desired_rotation[1])
cmds.parent(left_leg_switch_grp, main_ctrl)
@@ -4624,7 +4792,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
change_viewport_color(right_leg_switch, right_ctrl_color)
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_ankle_proxy_crv'), right_leg_switch_grp))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_ankle_proxy_crv'), right_leg_switch_grp))
cmds.parent(right_leg_switch_grp, main_ctrl)
@@ -4649,8 +4817,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Left Toe Position and Visibility
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_toe_jnt'), left_toe_roll_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(left_toe_roll_ctrl_grp + '.ry', desired_rotation[1])
cmds.move(left_foot_scale_offset/4,left_toe_roll_ctrl_grp, z=True, relative=True, objectSpace=True)
@@ -4675,8 +4843,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Left Toe Position and Visibility
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_toe_jnt'), left_toe_up_down_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(left_toe_up_down_ctrl_grp + '.ry', desired_rotation[1])
cmds.move(left_foot_scale_offset/2.6,left_toe_up_down_ctrl_grp, z=True, relative=True, objectSpace=True)
@@ -4703,8 +4871,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Left Ball Position and Visibility
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_ball_jnt'), left_ball_roll_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(left_ball_roll_ctrl_grp + '.ry', desired_rotation[1])
cmds.move(left_foot_scale_offset/3,left_ball_roll_ctrl_grp, x=True, relative=True, objectSpace=True)
@@ -4731,8 +4899,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Left Heel Position and Visibility
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_ankle_jnt'), left_heel_roll_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(left_heel_roll_ctrl_grp + '.ry', desired_rotation[1])
cmds.move(left_foot_scale_offset/3.5*-1,left_heel_roll_ctrl_grp, z=True, relative=True, objectSpace=True)
@@ -4765,8 +4933,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Right Toe Position and Visibility
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_toe_jnt'), right_toe_roll_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(right_toe_roll_ctrl_grp + '.ry', desired_rotation[1])
cmds.move(-right_foot_scale_offset/4,right_toe_roll_ctrl_grp, z=True, relative=True, objectSpace=True)
@@ -4791,8 +4959,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Right Toe Position and Visibility
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_toe_jnt'), right_toe_up_down_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(right_toe_up_down_ctrl_grp + '.ry', desired_rotation[1])
cmds.move(-right_foot_scale_offset/2.6,right_toe_up_down_ctrl_grp, z=True, relative=True, objectSpace=True)
@@ -4823,8 +4991,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Right Ball Position and Visibility
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_ball_jnt'), right_ball_roll_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(right_ball_roll_ctrl_grp + '.ry', desired_rotation[1])
cmds.move(right_foot_scale_offset/3,right_ball_roll_ctrl_grp, x=True, relative=True, objectSpace=True)
@@ -4855,8 +5023,8 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
# Right Heel Position and Visibility
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_ankle_jnt'), right_heel_roll_ctrl_grp, skip='y'))
- desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True)
- desired_translation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True)
+ desired_translation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, t=True, ws=True)
cmds.setAttr(right_heel_roll_ctrl_grp + '.ry', desired_rotation[1])
cmds.move(-right_foot_scale_offset/3.5*-1,right_heel_roll_ctrl_grp, z=True, relative=True, objectSpace=True)
@@ -5720,11 +5888,11 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.parent(left_toe_pos_pivot_grp, left_toe_pivot_grp)
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_ankle_jnt'), left_foot_pivot_grp))
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('left_ball_pivot_grp'), left_heel_pivot_grp))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('left_ball_pivot_grp'), left_heel_pivot_grp))
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_ball_jnt'), left_ball_pivot_grp))
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('left_toe_jnt'), left_toe_pivot_grp))
- desired_rotation = cmds.xform(gt_ab_settings.get('left_ankle_proxy_crv'), q=True, ro=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('left_ankle_proxy_crv'), q=True, ro=True)
cmds.setAttr(left_foot_pivot_grp + '.ry', desired_rotation[1])
cmds.setAttr(left_heel_pivot_grp + '.ry', desired_rotation[1])
cmds.setAttr(left_ball_pivot_grp + '.ry', desired_rotation[1])
@@ -5913,11 +6081,11 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.parent(right_toe_pos_pivot_grp, right_toe_pivot_grp)
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_ankle_jnt'), right_foot_pivot_grp))
- cmds.delete(cmds.pointConstraint(gt_ab_settings.get('right_ball_pivot_grp'), right_heel_pivot_grp))
+ cmds.delete(cmds.pointConstraint(gt_ab_elements.get('right_ball_pivot_grp'), right_heel_pivot_grp))
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_ball_jnt'), right_ball_pivot_grp))
cmds.delete(cmds.pointConstraint(gt_ab_joints.get('right_toe_jnt'), right_toe_pivot_grp))
- desired_rotation = cmds.xform(gt_ab_settings.get('right_ankle_proxy_crv'), q=True, ro=True)
+ desired_rotation = cmds.xform(gt_ab_elements.get('right_ankle_proxy_crv'), q=True, ro=True)
cmds.setAttr(right_foot_pivot_grp + '.ry', desired_rotation[1])
cmds.setAttr(right_heel_pivot_grp + '.ry', desired_rotation[1])
cmds.setAttr(right_ball_pivot_grp + '.ry', desired_rotation[1])
@@ -7199,32 +7367,32 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
lock_hide_default_attr(ik_solvers_grp, visibility=False)
# Create Seamless FK/IK Switch References
- left_ankle_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_ankle_ik_reference') )[0]
+ left_ankle_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_ankle_ik_reference') )[0]
cmds.delete(cmds.parentConstraint(left_foot_ik_ctrl, left_ankle_ref_loc))
cmds.parent(left_ankle_ref_loc, left_ankle_fk_jnt)
cmds.setAttr(left_ankle_ref_loc + '.v', 0)
- left_knee_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_knee_ik_reference') )[0]
+ left_knee_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_knee_ik_reference') )[0]
cmds.delete(cmds.pointConstraint(left_knee_ik_ctrl, left_knee_ref_loc))
cmds.parent(left_knee_ref_loc, left_knee_fk_jnt)
cmds.setAttr(left_knee_ref_loc + '.v', 0)
- left_elbow_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('left_elbow_ik_reference') )[0]
+ left_elbow_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('left_elbow_ik_reference') )[0]
cmds.delete(cmds.pointConstraint(left_elbow_ik_ctrl, left_elbow_ref_loc))
cmds.parent(left_elbow_ref_loc, left_elbow_fk_jnt)
cmds.setAttr(left_elbow_ref_loc + '.v', 0)
- right_ankle_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_ankle_ik_reference') )[0]
+ right_ankle_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_ankle_ik_reference') )[0]
cmds.delete(cmds.parentConstraint(right_foot_ik_ctrl, right_ankle_ref_loc))
cmds.parent(right_ankle_ref_loc, right_ankle_fk_jnt)
cmds.setAttr(right_ankle_ref_loc + '.v', 0)
- right_knee_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_knee_ik_reference') )[0]
+ right_knee_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_knee_ik_reference') )[0]
cmds.delete(cmds.pointConstraint(right_knee_ik_ctrl, right_knee_ref_loc))
cmds.parent(right_knee_ref_loc, right_knee_fk_jnt)
cmds.setAttr(right_knee_ref_loc + '.v', 0)
- right_elbow_ref_loc = cmds.spaceLocator( name=gt_ab_settings_default.get('right_elbow_ik_reference') )[0]
+ right_elbow_ref_loc = cmds.spaceLocator( name=gt_ab_elements_default.get('right_elbow_ik_reference') )[0]
cmds.delete(cmds.pointConstraint(right_elbow_ik_ctrl, right_elbow_ref_loc))
cmds.parent(right_elbow_ref_loc, right_elbow_fk_jnt)
cmds.setAttr(right_elbow_ref_loc + '.v', 0)
@@ -7234,7 +7402,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.matchTransform(left_leg_toe_ik_handle[0], left_toe_fk_jnt, pos=1, rot=1)
# Delete Proxy
- cmds.delete(gt_ab_settings.get('main_proxy_grp'))
+ cmds.delete(gt_ab_elements.get('main_proxy_grp'))
# Add Notes
note = 'This rig was created using ' + str(script_name) + '. (v' + str(script_version) + ')\n\nIssues, questions or suggestions? Go to:\ngithub.com/TrevisanGMW/gt-tools'
@@ -7388,7 +7556,7 @@ def lock_hide_default_attr(obj, translate=True, rotate=True, scale=True, visibil
cmds.setAttr(gt_ab_joints.get('right_pinky03_jnt') + '.type', 22) # Pinky Finger
# Creates game skeleton (No Segment Scale Compensate)
- if create_real_time_skeleton:
+ if gt_ab_settings.get('using_no_ssc_skeleton'):
new_skeleton_suffix = 'game'
duplicated_joints, game_root_jnt = generate_no_ssc_skeleton(new_skeleton_suffix)
sorted_no_ssc_joints = attach_no_ssc_skeleton(duplicated_joints, game_root_jnt, main_ctrl, new_skeleton_suffix)
@@ -7447,9 +7615,9 @@ def reset_proxy(suppress_warning=False):
attributes_set_zero = ['tx', 'ty', 'tz', 'rx', 'ry', 'rz', 'followHip']
attributes_set_one = ['sx', 'sy', 'sz', 'v']
proxy_elements = []
- for proxy in gt_ab_settings_default:
+ for proxy in gt_ab_elements_default:
if '_crv' in proxy:
- proxy_elements.append(gt_ab_settings_default.get(proxy))
+ proxy_elements.append(gt_ab_elements_default.get(proxy))
for obj in proxy_elements:
if cmds.objExists(obj):
for attr in attributes_set_zero:
@@ -7483,7 +7651,7 @@ def delete_proxy(suppress_warning=False):
is_deleted = False
- to_delete_elements = [gt_ab_settings.get('main_proxy_grp'), gt_ab_settings.get('main_crv') ]
+ to_delete_elements = [gt_ab_elements.get('main_proxy_grp'), gt_ab_elements.get('main_crv') ]
for obj in to_delete_elements:
if cmds.objExists(obj) and is_deleted == False:
cmds.delete(obj)
@@ -7521,14 +7689,14 @@ def mirror_attr(source, target):
# Validate Proxy
is_valid = True
- if not cmds.objExists(gt_ab_settings.get('main_proxy_grp')):
+ if not cmds.objExists(gt_ab_elements.get('main_proxy_grp')):
is_valid = False
cmds.warning('Proxy couldn\'t be found. Make sure you first create a proxy (guide objects) before mirroring it.')
- proxy_elements = [gt_ab_settings.get('main_proxy_grp')]
- for proxy in gt_ab_settings_default:
+ proxy_elements = [gt_ab_elements.get('main_proxy_grp')]
+ for proxy in gt_ab_elements_default:
if '_crv' in proxy:
- proxy_elements.append(gt_ab_settings.get(proxy))
+ proxy_elements.append(gt_ab_elements.get(proxy))
for obj in proxy_elements:
if not cmds.objExists(obj) and is_valid:
is_valid = False
@@ -7539,11 +7707,11 @@ def mirror_attr(source, target):
right_elements = []
if is_valid:
- for obj in gt_ab_settings:
+ for obj in gt_ab_elements:
if obj.startswith('left_') and '_crv' in obj:
- left_elements.append(gt_ab_settings.get(obj))
+ left_elements.append(gt_ab_elements.get(obj))
elif obj.startswith('right_') and '_crv' in obj:
- right_elements.append(gt_ab_settings.get(obj))
+ right_elements.append(gt_ab_elements.get(obj))
for left_obj in left_elements:
for right_obj in right_elements:
@@ -7573,10 +7741,10 @@ def export_proxy_pose():
is_valid = True
successfully_created_file = False
- proxy_elements = [gt_ab_settings.get('main_proxy_grp')]
- for proxy in gt_ab_settings_default:
+ proxy_elements = [gt_ab_elements.get('main_proxy_grp')]
+ for proxy in gt_ab_elements_default:
if '_crv' in proxy:
- proxy_elements.append(gt_ab_settings.get(proxy))
+ proxy_elements.append(gt_ab_elements.get(proxy))
for obj in proxy_elements:
if not cmds.objExists(obj) and is_valid:
is_valid = False
@@ -7591,12 +7759,12 @@ def export_proxy_pose():
if successfully_created_file and is_valid:
export_dict = {'gt_auto_biped_version' : script_version, 'gt_auto_biped_export_method' : 'object-space'}
- for obj in gt_ab_settings_default:
+ for obj in gt_ab_elements_default:
if '_crv' in obj:
- translate = cmds.getAttr(gt_ab_settings_default.get(obj) + '.translate')[0]
- rotate = cmds.getAttr(gt_ab_settings_default.get(obj) + '.rotate')[0]
- scale = cmds.getAttr(gt_ab_settings_default.get(obj) + '.scale')[0]
- to_save = [gt_ab_settings_default.get(obj), translate, rotate, scale]
+ translate = cmds.getAttr(gt_ab_elements_default.get(obj) + '.translate')[0]
+ rotate = cmds.getAttr(gt_ab_elements_default.get(obj) + '.rotate')[0]
+ scale = cmds.getAttr(gt_ab_elements_default.get(obj) + '.scale')[0]
+ to_save = [gt_ab_elements_default.get(obj), translate, rotate, scale]
export_dict[obj] = to_save
try:
@@ -7708,9 +7876,9 @@ def set_unlocked_ws_attr(target, attr, value_tuple):
proxy_exists = True
proxy_elements = []
- for proxy in gt_ab_settings_default:
+ for proxy in gt_ab_elements_default:
if '_crv' in proxy:
- proxy_elements.append(gt_ab_settings.get(proxy))
+ proxy_elements.append(gt_ab_elements.get(proxy))
for obj in proxy_elements:
if not cmds.objExists(obj) and proxy_exists:
proxy_exists = False
@@ -8173,7 +8341,7 @@ def extract_transform_joint_to_proxy(joint_name, ignore_translate=False, ignore_
else:
values_to_store = extract_transform_joint_to_proxy(jnt)
- for proxy_key in gt_ab_settings_default:
+ for proxy_key in gt_ab_elements_default:
if jnt_key.replace('_' + jnt_suffix, '_proxy_crv') == proxy_key:
export_dict[proxy_key] = values_to_store
From c2a3da7c83f668d0e609484d592911b9f31cb1d2 Mon Sep 17 00:00:00 2001
From: TrevisanGMW
Date: Thu, 21 Oct 2021 16:49:35 -0700
Subject: [PATCH 3/8] Added docs about new settings menu
---
docs/README.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/docs/README.md b/docs/README.md
index 35949f54..62039ce1 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -829,6 +829,12 @@ This rig comes with many custom attributes so you can tweak how much stability/f
+Settings:
+
+ - Use Real-time Skeleton:
Creates another skeleton without the parameter "Segment Scale Compensate" being active. This skeleton inherits the transforms from the controls while mimicking the behaviour of the "Segment Scale Compensate" option, essentially creating a baked version of this Maya depended system.
+ As this baked version does not yet fully support non-uniform scaling, it's recommended that you only use it if you are planning to later send this rig into a game engine or another 3d application. This will allow you to preserve the stretchy settings even in programs that do not support it.
+
+
Imports/Exporting Skin Weights:
This might be obvious, but when exporting and importing skin weights, don't forget to include all influences before importing it. This can be done by clicking on "Select Skinning Joints" then adding them as influences through "Rigging > Skin > Edit Influences > Add Influence"
From c9efaf692230e533f7cb1b56761d6855940056a3 Mon Sep 17 00:00:00 2001
From: TrevisanGMW
Date: Thu, 21 Oct 2021 16:50:03 -0700
Subject: [PATCH 4/8] Slightly updated GUI look
---
docs/media/gt_auto_biped_rigger.jpg | Bin 38131 -> 38629 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/docs/media/gt_auto_biped_rigger.jpg b/docs/media/gt_auto_biped_rigger.jpg
index abfb67fb0dcf4a1057c1f5ed9e353833a4c7c848..53c9548dd55c08547603f32ab8759eab5719b002 100644
GIT binary patch
literal 38629
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