Base avatar setup
This commit is contained in:
73
blender_driver_func.py
Normal file
73
blender_driver_func.py
Normal file
@@ -0,0 +1,73 @@
|
||||
# from mathutils import *
|
||||
from math import *
|
||||
import bpy
|
||||
|
||||
|
||||
def angle_to_length(angle: float, target: float = 1.0) -> float:
|
||||
"""
|
||||
Converts input angle to distance between two points in imaginary isosceles triangle with default angle of 180deg(!).
|
||||
The distance is clamped to the target value.
|
||||
|
||||
:param angle: Input angle (in radians)
|
||||
:type angle: float
|
||||
:param target: Desired distance between end points, defaults to 1.0
|
||||
:type target: float, optional
|
||||
:return: The distance between two points
|
||||
:rtype: float
|
||||
"""
|
||||
if angle > 0:
|
||||
return (target * 0.5 * sin(pi - angle)) / sin(angle * 0.5) # School trigonometry
|
||||
else:
|
||||
return target
|
||||
|
||||
|
||||
def half_angle_to_length(angle: float, target: float = 1.0) -> float:
|
||||
"""
|
||||
Converts input angle to distance between two points in imaginary isosceles triangle with default angle of 90deg.
|
||||
The distance is clamped to the target value.
|
||||
|
||||
:param angle: Input angle (in radians)
|
||||
:type angle: float
|
||||
:param target: Desired distance between end points, defaults to 1.0
|
||||
:type target: float, optional
|
||||
:return: The distance between two points
|
||||
:rtype: float
|
||||
"""
|
||||
side = sqrt(pow(target, 2) * 0.5) # Length of imaginary triangle's side
|
||||
angle = abs(pi * 0.5 - angle) # Default angle is 90deg
|
||||
return (side * sin(angle)) / sin((pi - angle) * 0.5)
|
||||
|
||||
|
||||
def half_elbow_compensation(angle: float) -> float:
|
||||
side = sqrt(pow(pi * 0.25, 2) * 0.5) # Length of imaginary triangle's side
|
||||
angle = abs(angle)
|
||||
final_angle = (side * sin(angle)) / sin((pi - angle) * 0.5) # Width of imaginary triangle's base
|
||||
return sqrt(pow(tan(final_angle), 2) + 1) - 1 # What the fuck??
|
||||
|
||||
|
||||
def compensated_elbow_corner(frame: float, offset: float = 0.125) -> float:
|
||||
# min(0.125, 0.125 * tan(acos(1 - frame / 180)))
|
||||
c_angle = acos(1 - frame / 180)
|
||||
return min(offset, offset * tan(c_angle))
|
||||
|
||||
|
||||
def compensated_elbow_crease(frame: float, offset_1: float = 0.0625, offset_2: float = 0.125) -> float:
|
||||
# min(0.0625, 0.0625 * tan(acos(1 - frame / 180))) + 0.125 * tan(max(acos(1 - frame / 180) - pi / 4, 0))
|
||||
c_angle = acos(1 - frame / 180)
|
||||
first_stage = min(offset_1, offset_1 * tan(c_angle))
|
||||
second_stage = (tan(max(c_angle - pi / 4, 0)) * offset_2)
|
||||
return first_stage + second_stage
|
||||
|
||||
|
||||
def compensated_elbow_corner_2(frame: float, offset: float = 0.125) -> float:
|
||||
# 0.125 * (sqrt(pow(tan(acos(1 - frame / 180)), 2) + 1) - 1)
|
||||
c_angle = acos(1 - frame / 180)
|
||||
return offset * (sqrt(pow(tan(c_angle), 2) + 1) - 1)
|
||||
|
||||
|
||||
bpy.app.driver_namespace["angle_to_length"] = angle_to_length
|
||||
bpy.app.driver_namespace["half_angle_to_length"] = half_angle_to_length
|
||||
bpy.app.driver_namespace["half_elbow_compensation"] = half_elbow_compensation
|
||||
bpy.app.driver_namespace["compensated_elbow_corner"] = compensated_elbow_corner
|
||||
bpy.app.driver_namespace["compensated_elbow_corner_2"] = compensated_elbow_corner_2
|
||||
bpy.app.driver_namespace["compensated_elbow_crease"] = compensated_elbow_crease
|
||||
Reference in New Issue
Block a user