Files
blender-portable-repo/scripts/addons/cc_blender_tools-2_3_3/hik.py
T
2026-03-17 14:58:51 -06:00

423 lines
10 KiB
Python

import bpy
from mathutils import Euler
from . import bones, utils
def fix_armature(arm):
if arm:
utils.set_only_active_object(arm)
facing = get_vrm_rig_facing(arm)
utils.log_info(f"VRM Alignment: Forward = {facing}")
if facing != "-Y":
utils.log_info("Aligning armature: Forward = -Y")
utils.set_transform_rotation(arm, Euler((0, 0, 3.1415926535897)))
bpy.ops.object.transform_apply(location=False, rotation=True, scale=False)
restore_bone_display(arm)
def get_vrm_rig_facing(arm):
"""VRM1.0 aligns with forward +Y
VRM2.0 aligns with forward -Y
need to figure out which is which."""
root_bone = bones.get_pose_bone(arm, "Root")
toe_bone = bones.get_pose_bone(arm, "J_Bip_L_ToeBase")
if not (root_bone and toe_bone):
return "-Y"
delta = arm.matrix_world @ toe_bone.head - arm.matrix_world @ root_bone.head
if delta.y > 0:
return "Y"
else:
return "-Y"
def restore_bone_display(arm):
utils.object_mode_to(arm)
pose_bone: bpy.types.PoseBone
for pose_bone in arm.pose.bones:
pose_bone.custom_shape = None
def pack_rotation(name, rot):
return f"{name} = {rot.x},{rot.y},{rot.z},{rot.w},\n"
def pack_bone(arm, pose_bone: bpy.types.PoseBone):
bone_name = pose_bone.name
parent_bone = pose_bone.parent
if parent_bone:
rot = (parent_bone.matrix.inverted() @ pose_bone.matrix).to_quaternion()
else:
rot = pose_bone.matrix.to_quaternion()
return pack_rotation(bone_name, rot)
def generate_hik_profile(arm, name, path, hik_template):
bone_list = ""
bone_list += pack_rotation(name, arm.rotation_quaternion)
for pose_bone in arm.pose.bones:
bone_list += pack_bone(arm, pose_bone)
for child in arm.children:
if child.type == "MESH":
bone_list += pack_rotation(child.name, child.rotation_quaternion)
hik_template = hik_template.replace("$BONE_LIST", bone_list)
with open(path, "w") as write_file:
utils.log_info(f"Writing VRM HIK Profile: {path}")
write_file.write(hik_template)
return True
RIGIFY_METARIG_PROFILE_TEMPLATE = """
[BoneMapOption]
Prefix =
[BoneMap]
f_index_01_L = LeftHandIndex1
f_index_01_R = RightHandIndex1
f_index_02_L = LeftHandIndex2
f_index_02_R = RightHandIndex2
f_index_03_L = LeftHandIndex3
f_index_03_R = RightHandIndex3
f_middle_01_L = LeftHandMiddle1
f_middle_01_R = RightHandMiddle1
f_middle_02_L = LeftHandMiddle2
f_middle_02_R = RightHandMiddle2
f_middle_03_L = LeftHandMiddle3
f_middle_03_R = RightHandMiddle3
f_pinky_01_L = LeftHandPinky1
f_pinky_01_R = RightHandPinky1
f_pinky_02_L = LeftHandPinky2
f_pinky_02_R = RightHandPinky2
f_pinky_03_L = LeftHandPinky3
f_pinky_03_R = RightHandPinky3
f_ring_01_L = LeftHandRing1
f_ring_01_R = RightHandRing1
f_ring_02_L = LeftHandRing2
f_ring_02_R = RightHandRing2
f_ring_03_L = LeftHandRing3
f_ring_03_R = RightHandRing3
foot_L = LeftFoot
foot_R = RightFoot
forearm_L = LeftForeArm
forearm_L_001 = LeftForeArmRoll
forearm_R = RightForeArm
forearm_R_001 = RightForeArmRoll
hand_L = LeftHand
hand_R = RightHand
shin_L = LeftLeg
shin_L_001 = LeftLegRoll
shin_R = RightLeg
shin_R_001 = RightLegRoll
shoulder_L = LeftShoulder
shoulder_R = RightShoulder
spine = Hips
spine_001 = Spine
spine_002 = Spine1
spine_003 = Spine2
spine_004 = Neck
spine_005 = Neck1
spine_006 = Head
thigh_L = LeftUpLeg
thigh_L_001 = LeftUpLegRoll
thigh_R = RightUpLeg
thigh_R_001 = RightUpLegRoll
thumb_01_L = LeftHandThumb1
thumb_01_R = RightHandThumb1
thumb_02_L = LeftHandThumb2
thumb_02_R = RightHandThumb2
thumb_03_L = LeftHandThumb3
thumb_03_R = RightHandThumb3
upper_arm_L = LeftArm
upper_arm_L_001 = LeftArmRoll
upper_arm_R = RightArm
upper_arm_R_001 = RightArmRoll
[BoneRotate]
$BONE_LIST
[RootTransform]
Value = 1.,1.,1.,1.,0.,0.,0.,1.,0.,0.,0.,1.,0.,0.,0.,
[FacialMap_LEye]
Bone0 = eye_L
[FacialMap_REye]
Bone0 = eye_R
[BoneTypeOfBonesUnderHead]
jaw = Facial
tongue = Facial
tongue_001 = Unused
tongue_002 = Unused
teeth_T = Facial
teeth_B = Facial
eye_R = Facial
eye_L = Facial
"""
RIGIFY_CC_BASE_PROFILE_TEMPLATE = """
[BoneMapOption]
Prefix =
[BoneMap]
CC_Base_Head = Head
CC_Base_Hip = Hips
CC_Base_L_Calf = LeftLeg
CC_Base_L_CalfTwist = LeftLegRoll
CC_Base_L_Clavicle = LeftShoulder
CC_Base_L_Foot = LeftFoot
CC_Base_L_Forearm = LeftForeArm
CC_Base_L_ForearmTwist = LeftForeArmRoll
CC_Base_L_Hand = LeftHand
CC_Base_L_Index1 = LeftHandIndex1
CC_Base_L_Index2 = LeftHandIndex2
CC_Base_L_Index3 = LeftHandIndex3
CC_Base_L_Mid1 = LeftHandMiddle1
CC_Base_L_Mid2 = LeftHandMiddle2
CC_Base_L_Mid3 = LeftHandMiddle3
CC_Base_L_Pinky1 = LeftHandPinky1
CC_Base_L_Pinky2 = LeftHandPinky2
CC_Base_L_Pinky3 = LeftHandPinky3
CC_Base_L_Ring1 = LeftHandRing1
CC_Base_L_Ring2 = LeftHandRing2
CC_Base_L_Ring3 = LeftHandRing3
CC_Base_L_Thigh = LeftUpLeg
CC_Base_L_ThighTwist = LeftUpLegRoll
CC_Base_L_Thumb1 = LeftHandThumb1
CC_Base_L_Thumb2 = LeftHandThumb2
CC_Base_L_Thumb3 = LeftHandThumb3
CC_Base_L_Upperarm = LeftArm
CC_Base_L_UpperarmTwist = LeftArmRoll
CC_Base_NeckTwist01 = Neck
CC_Base_NeckTwist02 = Neck1
CC_Base_R_Calf = RightLeg
CC_Base_R_CalfTwist = RightLegRoll
CC_Base_R_Clavicle = RightShoulder
CC_Base_R_Foot = RightFoot
CC_Base_R_Forearm = RightForeArm
CC_Base_R_ForearmTwist = RightForeArmRoll
CC_Base_R_Hand = RightHand
CC_Base_R_Index1 = RightHandIndex1
CC_Base_R_Index2 = RightHandIndex2
CC_Base_R_Index3 = RightHandIndex3
CC_Base_R_Mid1 = RightHandMiddle1
CC_Base_R_Mid2 = RightHandMiddle2
CC_Base_R_Mid3 = RightHandMiddle3
CC_Base_R_Pinky1 = RightHandPinky1
CC_Base_R_Pinky2 = RightHandPinky2
CC_Base_R_Pinky3 = RightHandPinky3
CC_Base_R_Ring1 = RightHandRing1
CC_Base_R_Ring2 = RightHandRing2
CC_Base_R_Ring3 = RightHandRing3
CC_Base_R_Thigh = RightUpLeg
CC_Base_R_ThighTwist = RightUpLegRoll
CC_Base_R_Thumb1 = RightHandThumb1
CC_Base_R_Thumb2 = RightHandThumb2
CC_Base_R_Thumb3 = RightHandThumb3
CC_Base_R_Upperarm = RightArm
CC_Base_R_UpperarmTwist = RightArmRoll
CC_Base_Spine01 = Spine1
CC_Base_Spine02 = Spine2
CC_Base_Waist = Spine
[BoneRotate]
$BONE_LIST
[RootTransform]
Value = 1.,1.,1.,1.,0.,0.,0.,1.,0.,0.,0.,1.,0.,0.,0.,
[FacialMap_LEye]
Bone0 = CC_Base_L_Eye
[FacialMap_REye]
Bone0 = CC_Base_R_Eye
[BoneTypeOfBonesUnderHead]
CC_Base_JawRoot = Facial
CC_Base_Tongue01 = Facial
CC_Base_Tongue02 = Unused
CC_Base_Tongue03 = Unused
CC_Base_Teeth01 = Facial
CC_Base_Teeth02 = Facial
CC_Base_L_Eye = Facial
CC_Base_R_Eye = Facial
"""
RIGIFY_BASE_PROFILE_TEMPLATE = """
[BoneMapOption]
Prefix =
[BoneMap]
Rigify_Head = Head
Rigify_Hip = Hips
Rigify_L_Calf = LeftLeg
Rigify_L_CalfTwist = LeftLegRoll
Rigify_L_Clavicle = LeftShoulder
Rigify_L_Foot = LeftFoot
Rigify_L_Forearm = LeftForeArm
Rigify_L_ForearmTwist = LeftForeArmRoll
Rigify_L_Hand = LeftHand
Rigify_L_Index1 = LeftHandIndex1
Rigify_L_Index2 = LeftHandIndex2
Rigify_L_Index3 = LeftHandIndex3
Rigify_L_Mid1 = LeftHandMiddle1
Rigify_L_Mid2 = LeftHandMiddle2
Rigify_L_Mid3 = LeftHandMiddle3
Rigify_L_Pinky1 = LeftHandPinky1
Rigify_L_Pinky2 = LeftHandPinky2
Rigify_L_Pinky3 = LeftHandPinky3
Rigify_L_Ring1 = LeftHandRing1
Rigify_L_Ring2 = LeftHandRing2
Rigify_L_Ring3 = LeftHandRing3
Rigify_L_Thigh = LeftUpLeg
Rigify_L_ThighTwist = LeftUpLegRoll
Rigify_L_Thumb1 = LeftHandThumb1
Rigify_L_Thumb2 = LeftHandThumb2
Rigify_L_Thumb3 = LeftHandThumb3
Rigify_L_Upperarm = LeftArm
Rigify_L_UpperarmTwist = LeftArmRoll
Rigify_NeckTwist01 = Neck
Rigify_NeckTwist02 = Neck1
Rigify_R_Calf = RightLeg
Rigify_R_CalfTwist = RightLegRoll
Rigify_R_Clavicle = RightShoulder
Rigify_R_Foot = RightFoot
Rigify_R_Forearm = RightForeArm
Rigify_R_ForearmTwist = RightForeArmRoll
Rigify_R_Hand = RightHand
Rigify_R_Index1 = RightHandIndex1
Rigify_R_Index2 = RightHandIndex2
Rigify_R_Index3 = RightHandIndex3
Rigify_R_Mid1 = RightHandMiddle1
Rigify_R_Mid2 = RightHandMiddle2
Rigify_R_Mid3 = RightHandMiddle3
Rigify_R_Pinky1 = RightHandPinky1
Rigify_R_Pinky2 = RightHandPinky2
Rigify_R_Pinky3 = RightHandPinky3
Rigify_R_Ring1 = RightHandRing1
Rigify_R_Ring2 = RightHandRing2
Rigify_R_Ring3 = RightHandRing3
Rigify_R_Thigh = RightUpLeg
Rigify_R_ThighTwist = RightUpLegRoll
Rigify_R_Thumb1 = RightHandThumb1
Rigify_R_Thumb2 = RightHandThumb2
Rigify_R_Thumb3 = RightHandThumb3
Rigify_R_Upperarm = RightArm
Rigify_R_UpperarmTwist = RightArmRoll
Rigify_Spine01 = Spine1
Rigify_Spine02 = Spine2
Rigify_Waist = Spine
[BoneRotate]
$BONE_LIST
[RootTransform]
Value = 1.,1.,1.,1.,0.,0.,0.,1.,0.,0.,0.,1.,0.,0.,0.,
[FacialMap_LEye]
Bone0 = Rigify_L_Eye
[FacialMap_REye]
Bone0 = Rigify_R_Eye
[BoneTypeOfBonesUnderHead]
Rigify_JawRoot = Facial
Rigify_Tongue01 = Facial
Rigify_Tongue02 = Unused
Rigify_Tongue03 = Unused
Rigify_Teeth01 = Facial
Rigify_Teeth02 = Facial
Rigify_L_Eye = Facial
Rigify_R_Eye = Facial
"""
VRM_HIK_PROFILE_TEMPLATE = """
[BoneMapOption]
Prefix =
[BoneMap]
J_Bip_C_Chest = Spine1
J_Bip_C_Head = Head
J_Bip_C_Hips = Hips
J_Bip_C_Neck = Neck
J_Bip_C_Spine = Spine
J_Bip_C_UpperChest = Spine2
J_Bip_L_Foot = LeftFoot
J_Bip_L_Hand = LeftHand
J_Bip_L_Index1 = LeftHandIndex1
J_Bip_L_Index2 = LeftHandIndex2
J_Bip_L_Index3 = LeftHandIndex3
J_Bip_L_Little1 = LeftHandPinky1
J_Bip_L_Little2 = LeftHandPinky2
J_Bip_L_Little3 = LeftHandPinky3
J_Bip_L_LowerArm = LeftForeArm
J_Bip_L_LowerLeg = LeftLeg
J_Bip_L_Middle1 = LeftHandMiddle1
J_Bip_L_Middle2 = LeftHandMiddle2
J_Bip_L_Middle3 = LeftHandMiddle3
J_Bip_L_Ring1 = LeftHandRing1
J_Bip_L_Ring2 = LeftHandRing2
J_Bip_L_Ring3 = LeftHandRing3
J_Bip_L_Shoulder = LeftShoulder
J_Bip_L_Thumb1 = LeftHandThumb1
J_Bip_L_Thumb2 = LeftHandThumb2
J_Bip_L_Thumb3 = LeftHandThumb3
J_Bip_L_UpperArm = LeftArm
J_Bip_L_UpperLeg = LeftUpLeg
J_Bip_R_Foot = RightFoot
J_Bip_R_Hand = RightHand
J_Bip_R_Index1 = RightHandIndex1
J_Bip_R_Index2 = RightHandIndex2
J_Bip_R_Index3 = RightHandIndex3
J_Bip_R_Little1 = RightHandPinky1
J_Bip_R_Little2 = RightHandPinky2
J_Bip_R_Little3 = RightHandPinky3
J_Bip_R_LowerArm = RightForeArm
J_Bip_R_LowerLeg = RightLeg
J_Bip_R_Middle1 = RightHandMiddle1
J_Bip_R_Middle2 = RightHandMiddle2
J_Bip_R_Middle3 = RightHandMiddle3
J_Bip_R_Ring1 = RightHandRing1
J_Bip_R_Ring2 = RightHandRing2
J_Bip_R_Ring3 = RightHandRing3
J_Bip_R_Shoulder = RightShoulder
J_Bip_R_Thumb1 = RightHandThumb1
J_Bip_R_Thumb2 = RightHandThumb2
J_Bip_R_Thumb3 = RightHandThumb3
J_Bip_R_UpperArm = RightArm
J_Bip_R_UpperLeg = RightUpLeg
[BoneRotate]
$BONE_LIST
[RootTransform]
Value = 1.,100.,100.,100.,0.,0.,0.,1.,0.,0.,0.,1.,0.,0.,0.,
[BoneTypeOfBonesUnderHead]
J_Adj_L_FaceEye = Facial
J_Adj_R_FaceEye = Facial
"""