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

58 lines
1.8 KiB
GDScript

extends Node3D
class_name TreeHands
@export var tracking : UltraleapDeviceNode
var bones : Array[Node3D] = []
var gizmo : PackedScene
func _ready():
gizmo = preload("res://models/Origin.tscn")
spawn_finger_gizmos(UltraleapDigit.new(), "thumb")
spawn_finger_gizmos(UltraleapDigit.new(), "index")
spawn_finger_gizmos(UltraleapDigit.new(), "middle")
spawn_finger_gizmos(UltraleapDigit.new(), "ring")
spawn_finger_gizmos(UltraleapDigit.new(), "pinky")
func _process(_delta):
if tracking == null:
return
var frame : UltraleapFrame = tracking.get_last_frame()
# Dirty hack to check if the device is initialised.
# Should implement something like a flag later
if frame == null:
return
if frame.is_left_hand_visible:
self.show()
set_hand(frame.left_hand)
else:
self.hide()
func spawn_finger_gizmos(finger : UltraleapDigit, fname : String):
var parent : Node3D = self as Node3D
if fname != "thumb":
parent = spawn_bone_gizmo(finger.metacarpal, parent, fname, "metacarpal")
parent = spawn_bone_gizmo(finger.proximal, parent, fname, "proximal")
parent = spawn_bone_gizmo(finger.intermediate, parent, fname, "intermediate")
parent = spawn_bone_gizmo(finger.distal, parent, fname, "distal")
func spawn_bone_gizmo(bone : UltraleapBone, parent : Node3D, fname : String, bname : String):
var instance : Node3D = gizmo.instantiate()
parent.add_child(instance)
instance.owner = parent
instance.name = fname + "_" + bname
bones.append(instance)
return instance
func set_hand(hand : UltraleapHand):
position = hand.palm.position
quaternion = hand.palm.orientation
for bone in bones:
var splitted : PackedStringArray = bone.name.split("_")
bone.position = hand.get(splitted[0]).get(splitted[1]).translation
bone.quaternion = hand.get(splitted[0]).get(splitted[1]).rotation