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

83 lines
2.2 KiB
GDScript

extends Node3D
class_name OriginHands
@export var tracking : UltraleapDeviceNode
var gizmos : Array[Node3D] = []
var dry_run : bool = false
func _ready():
var scene : PackedScene = preload("res://models/Origin.tscn")
dry_run = true
var n : int = set_hand(tracking.get_last_frame().left_hand, 0)
n = set_hand(tracking.get_last_frame().right_hand, n)
dry_run = false
print(str(n) + " bones")
for i in range(n):
var instance : Node3D = scene.instantiate()
add_child(instance)
instance.owner = self
instance.name = "Joint" + str(i)
gizmos.append(instance)
func _process(_delta):
var n : int = set_hand(tracking.get_last_frame().left_hand, 0)
n = set_hand(tracking.get_last_frame().right_hand, n)
func set_hand(hand : UltraleapHand, index : int) -> int:
index = set_finger("thumb", hand, index)
index = set_finger("index", hand, index)
index = set_finger("middle", hand, index)
index = set_finger("ring", hand, index)
index = set_finger("pinky", hand, index)
index = set_arm(hand, index)
return index
func set_finger(finger_name : String, hand : UltraleapHand, index : int) -> int:
var finger : UltraleapDigit = hand.get(finger_name)
if finger_name != "thumb":
index = set_bone("metacarpal", finger, index)
index = set_bone("proximal", finger, index)
index = set_bone("intermediate", finger, index)
index = set_bone("distal", finger, index)
return index
func set_bone(bone_name : String, finger : UltraleapDigit, index : int):
if dry_run:
return index + 1
var bone_transform : Transform3D = tracking.global_transform * Transform3D(
Basis(finger.get(bone_name).rotation),
finger.get(bone_name).prev_joint
)
gizmos[index].global_transform = bone_transform
return index + 1
func set_arm(hand : UltraleapHand, index : int) -> int:
if dry_run:
return index + 2
var arm : UltraleapBone = hand.arm
var wrist_transform : Transform3D = tracking.global_transform * Transform3D(
Basis(arm.rotation),
arm.prev_joint
)
var elbow_transform : Transform3D = tracking.global_transform * Transform3D(
Basis(arm.rotation),
arm.next_joint
)
gizmos[index].global_transform = elbow_transform
gizmos[index + 1].global_transform = wrist_transform
return index + 2