Finished rudimentary avatar setup

This commit is contained in:
raccoon
2025-03-12 20:10:49 +05:00
parent d3da9ad77a
commit a2143a804d
130 changed files with 469238 additions and 9225 deletions

73
blender_driver_func.py Normal file
View 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