62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
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
|