import bpy from math import radians, pi def clamp_angle_deg(angle, min_angle_deg, max_angle_deg): min_angle = radians(min_angle_deg) max_angle = radians(max_angle_deg) if angle < min_angle: angle = min_angle if angle > max_angle: angle = max_angle return angle def angle_to_linear(angle, divider): if angle < 0.0: return angle / divider else: return 0.0 def angle_to_linear_x(bone, angle): skel = bpy.data.objects["skeleton"] left_base = "ctrl_base_upperleg.L.001" right_base = "ctrl_base_upperleg.R.001" base = "" if base == "": for e in ["_R", ".R"]: if bone.name.endswith(e): base = right_base break if base == "": for e in ["_L", ".L"]: if bone.name.endswith(e): base = left_base break if base == "": for e in ["_R.", ".R."]: if bone.name.find(e) >= 0: base = right_base break if base == "": for e in ["_L.", ".L."]: if bone.name.find(e) >= 0: base = left_base break mul = skel.pose.bones[base]["to_linear_x_base"] offset = skel.pose.bones[base]["angle_offset"] # print("bone: ", bone.name, "base: ", base, "mul: ", mul) # print("angle: ", angle, " angle_offset: ", offset, " angle_sum: ", angle + offset) print("offset: ", mul * (angle + offset), "bone: ", base, "angle: ", angle) return (angle + offset) * mul def extra_linear(angle, offset): ret = 0.0 offt = offset * angle * 2.0 / -radians(-90) if angle * 2.0 < -radians(65): if angle * 2.0 > -radians(65): ret += offset else: ret += offt return ret bpy.app.driver_namespace["clamp_angle_deg"] = clamp_angle_deg bpy.app.driver_namespace["angle_to_linear"] = angle_to_linear bpy.app.driver_namespace["extra_linear"] = extra_linear bpy.app.driver_namespace["angle_to_linear_x"] = angle_to_linear_x