58 lines
1.8 KiB
GDScript
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
|