def insert_bone (si_bone, armdat):
"""Create bone and insert into armature.
Uses:
node.id as as bone name (these are used in morph formulas)
node_instance.id as custom property bdst_instance_id (these are used in poses / scene.animations)
"""
bname = si_bone.node.id
b_info = bone_info(bone=si_bone, bname=bname)
b_bone = armdat.edit_bones.new(name=bname)
b_bone.bdst_instance_id = si_bone.id
orient = si_bone.orientation
b_bone.use_deform = True
b_bone.use_inherit_scale = si_bone.inherits_scale
center_point = si_bone.center_point
end_point = si_bone.end_point
if center_point == end_point:
end_point = (end_point[0], end_point[1], end_point[2] + 0.3)
len = (mathutils.Vector(center_point) - mathutils.Vector(end_point)).length
b_bone.head = (0,0,0)
rot_order = si_bone.rotation_order
if si_bone.rotation_order[0] == "X":
sign = 1 if center_point[0] < end_point[0] else -1
b_bone.bdst_sign = "+X" if sign == 1 else "-X"
b_info.rotation_order = swap_rot(rot_order, {"X": "Y", "Y": "X", "Z": "Z"})
b_bone.tail = (sign * len, 0, 0)
elif si_bone.rotation_order[0] == "Y":
sign = 1 if center_point[1] < end_point[1] else -1
b_bone.bdst_sign = "+Y" if sign == 1 else "-Y"
b_info.rotation_order = swap_rot(rot_order, {"X": "X", "Y": "Y", "Z": "Z"})
b_bone.tail = (0, sign * len, 0)
else:
sign = 1 if center_point[2] < end_point[2] else -1
b_bone.bdst_sign = "+Z" if sign == 1 else "-Z"
b_info.rotation_order = swap_rot(rot_order, {"X": "X", "Y": "Z", "Z": "Y"})
b_bone.tail = (0, 0, sign * len)
b_bone.roll = 0
rot = mathutils.Euler(((orient[0]), (-orient[1]), (orient[2])), "XZY").to_matrix().to_4x4()
b_bone.transform(rot)
b_bone.translate(mathutils.Vector(center_point))
b_bone.bdst_center_point = center_point
b_bone.bdst_end_point = end_point
b_bone.bdst_orientation = orient
b_info.roots.append(bname)
b_info.leaf = bname
return [b_info]
评论列表
文章目录