godot-ultraleap-plugin/demo/scripts/HandRiggerTwo.gd

157 lines
4.4 KiB
GDScript

extends Node3D
@export var tracking : UltraleapDeviceNode
@export var handedness : UltraleapTypes.Chirality = UltraleapTypes.Chirality.Left
@export var skeleton : Skeleton3D
@export var ex_map : RigMap
@export var rig_settings : RigSettings
@export var use_interpolation : bool = true
var root_transform : Transform3D = Transform3D.IDENTITY
func _ready():
if skeleton == null:
return
func _process(_delta):
if tracking == null:
skeleton.hide()
return
if Engine.is_editor_hint() and not tracking.run_in_editor:
skeleton.reset_bone_poses()
skeleton.show()
return
var frame : UltraleapFrame = tracking.get_last_frame()
if frame == null:
skeleton.hide()
return
if use_interpolation:
var interpolated_frame : UltraleapFrame = tracking.get_interpolated_frame(Time.get_ticks_usec())
if interpolated_frame != null:
frame = interpolated_frame
if handedness == UltraleapTypes.Chirality.Left:
if frame.is_left_hand_visible:
skeleton.show()
set_hand(frame.left_hand)
else:
skeleton.hide()
else:
if frame.is_right_hand_visible:
skeleton.show()
set_hand(frame.right_hand)
else:
skeleton.hide()
func set_hand(hand : UltraleapHand):
root_transform = set_wrist(hand)
return
set_finger(hand.thumb)
set_finger(hand.index)
set_finger(hand.middle)
set_finger(hand.ring)
set_finger(hand.pinky)
return
set_palm(hand)
func set_palm(hand : UltraleapHand):
var palm_name : String = ex_map.get("palm")
var bone_idx : int = skeleton.find_bone(palm_name)
skeleton.set_bone_pose_rotation(bone_idx, hand.palm.orientation)
skeleton.set_bone_pose_position(bone_idx, hand.palm.position)
#skeleton.set_bone_pose_scale(bone_idx, global_bone_scale)
func set_wrist(hand : UltraleapHand):
var wrist_name : String = ex_map.get("wrist")
var bone_idx : int = skeleton.find_bone(wrist_name)
var wrist_transform : Transform3D = hand.wrist * rig_settings.bone_transform
skeleton.set_bone_pose_rotation(bone_idx, wrist_transform.basis.get_rotation_quaternion())
skeleton.set_bone_pose_position(bone_idx, wrist_transform.origin)
#skeleton.set_bone_pose_scale(bone_idx, global_bone_scale)
return Transform3D(
Basis.IDENTITY,
hand.palm.position - hand.arm.next_joint
)
func set_finger(finger : UltraleapDigit):
if finger.type != UltraleapDigit.FingerType.Thumb:
set_bone(finger, finger.metacarpal)
set_bone(finger, finger.proximal)
#return
set_bone(finger, finger.intermediate)
set_bone(finger, finger.distal)
func set_bone(finger : UltraleapDigit, bone : UltraleapBone):
var bone_name : String = bone_name_from_type(bone.type)
var finger_name : String = finger_name_from_type(finger.type)
if (
finger.get(bone_name) == null
or ex_map.get(finger_name + "_" + bone_name) == ""
):
return
var yo : Transform3D = root_transform if bone_name == "metacarpal" else Transform3D.IDENTITY
var t : Transform3D = Transform3D(
Basis(bone.rotation),
bone.translation
) * rig_settings.bone_transform
#t.origin = t.origin - yo.origin
#t = t * rig_settings.bone_transform
#set_bone_rotation(ex_map.get(finger_name + "_" + bone_name), t.basis.get_rotation_quaternion())
if rig_settings.set_joints_positions:
set_bone_position(ex_map.get(finger_name + "_" + bone_name), t.origin)
func set_bone_rotation(bone_name : String, bone_rotation : Quaternion):
var bone_idx : int = skeleton.find_bone(bone_name)
if bone_idx == -1:
return
skeleton.set_bone_pose_rotation(bone_idx, bone_rotation)
func set_bone_position(bone_name : String, bone_position : Vector3):
var bone_idx : int = skeleton.find_bone(bone_name)
if bone_idx == -1:
return
skeleton.set_bone_pose_position(bone_idx, bone_position)
func finger_name_from_type(finger_type: UltraleapDigit.FingerType) -> String:
return {
UltraleapDigit.FingerType.Thumb: "thumb",
UltraleapDigit.FingerType.Index: "index",
UltraleapDigit.FingerType.Middle: "middle",
UltraleapDigit.FingerType.Ring: "ring",
UltraleapDigit.FingerType.Pinky: "pinky"
}[finger_type] if finger_type != UltraleapDigit.FingerType.None else null
func bone_name_from_type(bone_type : UltraleapBone.BoneType) -> String:
return {
UltraleapBone.BoneType.Metacarpal: "metacarpal",
UltraleapBone.BoneType.Proximal: "proximal",
UltraleapBone.BoneType.Intermediate: "intermediate",
UltraleapBone.BoneType.Distal: "distal",
UltraleapBone.BoneType.Arm: "arm"
}[bone_type] if bone_type != UltraleapBone.BoneType.None else null