83 lines
2.2 KiB
GDScript
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
|