Introduces simpler rigger and origin hands
This commit is contained in:
parent
bbe54db220
commit
e78c1e0b27
|
@ -0,0 +1,156 @@
|
|||
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
|
|
@ -0,0 +1,57 @@
|
|||
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
|
Loading…
Reference in New Issue