diff --git a/README.md b/README.md index fe1768d..0faa9b8 100644 --- a/README.md +++ b/README.md @@ -47,17 +47,30 @@ Ensure the existing project is configured with XR hand tracking. The demo projec The addon files need to be copied to the `/addons/hand_pose_detector` folder of the Godot project. -### Add Hand Pose Detectors +### Add Hand Pose Controllers -Add Hand Pose Detector nodes into the scene - one for each hand. +Add Hand Pose Controller nodes into the scene - one for each hand. These will detect hand poses and drive [XRController3D](https://docs.godotengine.org/en/latest/classes/class_xrcontroller3d.html) nodes. -![Add Hand Pose Detectors](/docs/add_hand_pose_detectors.png) +![Add Hand Pose Controller](/docs/add_hand_pose_controllers.png) -Configure the hand pose detectors with the pose-set to detect, and the hand tracker to monitor. +Add [XRController3D](https://docs.godotengine.org/en/latest/classes/class_xrcontroller3d.html) nodes for the virtual hand-driven controllers - one for each hand. -![Hand Pose Detector Settings](/docs/hand_pose_detector_settings.png) +![Add XRController3D](/docs/add_hand_pose_virtual_controllers.png) -Connect the hand pose detector signals as desired. +Configure the Hand Pose Controller nodes with: +- The [XRControllerTracker](https://docs.godotengine.org/en/latest/classes/class_xrcontrollertracker.html) name for the virtual controller +- The type of pose to drive (`Aim` is most widely supported) +- The hand pose action map for actions to trigger on the virtual controllers +- The [XRHandTracker](https://docs.godotengine.org/en/latest/classes/class_xrhandtracker.html) name for the hand +- The set of hand-poses to detect + +![Hand Pose Controller Settings](/docs/hand_pose_controller_settings.png) + +Configure the [XRController3D](https://docs.godotengine.org/en/latest/classes/class_xrcontroller3d.html) Virtual Controller nodes with the name of the [XRControllerTracker](https://docs.godotengine.org/en/latest/classes/class_xrcontrollertracker.html) for each hand. + +![Virtual Controller Settings](/docs/virtual_controller_settings.png) + +If needed, connect the hand pose detector signals. The preferred approach is to generate actions using the hand pose action map, and then detect those actions as if generated by a standing XR controller. ![Hand Pose Detector Signals](/docs/hand_pose_detector_signals.png) @@ -119,12 +132,6 @@ The inspect scene provided in the demo project can be used to inspect the flexio ![Inspect Scene](/docs/inspect_scene.png) -## Pose Driven XR Controllers - -The Hand Pose Detector addon includes a HandPoseController node which creates an XRControllerTracker capable of generating XR Input Actions in response to hand poses. - - - ## Licensing Code in this repository is licensed under the MIT license. diff --git a/VERSIONS.md b/VERSIONS.md index 6de96c7..9c53244 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -1,5 +1,6 @@ # 2.0.0 (in progress) - Rename Action-Set to Action-Map to better match OpenXR naming +- Modify HandPoseController to extend from HandPoseDetector (breaking change) # 1.3.0 - Fine-tune aim pose diff --git a/addons/hand_pose_detector/hand_pose_controller.gd b/addons/hand_pose_detector/hand_pose_controller.gd index 0a8eac1..b09c138 100644 --- a/addons/hand_pose_detector/hand_pose_controller.gd +++ b/addons/hand_pose_detector/hand_pose_controller.gd @@ -1,6 +1,6 @@ @tool class_name HandPoseController -extends Node +extends HandPoseDetector ## Hand Pose Controller Node @@ -57,66 +57,72 @@ const _POSE_TRANSFORMS_RIGHT : Array[Transform3D] = [ ] +@export_group("Controller", "controller_") + ## Name for the virtual controller tracker -@export var tracker_name : String = "/user/hand_pose_controller/left" +@export var controller_tracker_name : String = "/user/hand_pose_controller/left" ## Pose type -@export var pose_type : PoseType = PoseType.SKELETON +@export var controller_pose_type : PoseType = PoseType.SKELETON ## Hand poses generating boolean values -@export var action_map : HandPoseActionMap - +@export var controller_action_map : HandPoseActionMap -## Hand Pose Detector -var pose_detector : HandPoseDetector ## Controller Tracker -var tracker : XRControllerTracker +var controller_tracker : XRControllerTracker # Called when the node enters the scene tree for the first time. func _ready() -> void: + # Call the base + super() + # Skip if in editor if Engine.is_editor_hint(): set_process(false) return - # Get the pose detector - pose_detector = get_parent() as HandPoseDetector - if not pose_detector: - set_process(false) - return + # If the hand-pose-set is not specified then construct one dynamically + # from the controller action map. + if not hand_pose_set and controller_action_map: + hand_pose_set = HandPoseSet.new() + for action in controller_action_map.actions: + hand_pose_set.poses.append(action.pose) # Subscribe to the detector events - pose_detector.pose_started.connect(_pose_started) - pose_detector.pose_ended.connect(_pose_ended) + pose_started.connect(_pose_started) + pose_ended.connect(_pose_ended) # Create the controller tracker - tracker = XRControllerTracker.new() - tracker.name = tracker_name - XRServer.add_tracker(tracker) + controller_tracker = XRControllerTracker.new() + controller_tracker.name = controller_tracker_name + XRServer.add_tracker(controller_tracker) # Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(_delta: float) -> void: +func _process(delta: float) -> void: + # Call the base + super(delta) + # Skip if no trackers - if not pose_detector.tracker or not tracker: + if not hand_tracker or not controller_tracker: return # Get the hand tracker pose - var pose := pose_detector.tracker.get_pose(&"default") + var pose := hand_tracker.get_pose(&"default") if not pose: return # Get the conversion transform - var hand := pose_detector.tracker.hand + var hand := hand_tracker.hand # Get the conversion transform var conv_xform : Transform3D if hand == XRPositionalTracker.TrackerHand.TRACKER_HAND_LEFT: - conv_xform = _POSE_TRANSFORMS_LEFT[pose_type] + conv_xform = _POSE_TRANSFORMS_LEFT[controller_pose_type] else: - conv_xform = _POSE_TRANSFORMS_RIGHT[pose_type] + conv_xform = _POSE_TRANSFORMS_RIGHT[controller_pose_type] # Apply conversion to pose components var pose_transform := pose.transform * conv_xform @@ -124,8 +130,8 @@ func _process(_delta: float) -> void: var pose_angular := _rotate_angular_velocity(pose.angular_velocity, conv_xform.basis) # Update the controller tracker pose - tracker.hand = hand - tracker.set_pose( + controller_tracker.hand = hand + controller_tracker.set_pose( pose.name, pose_transform, pose_linear, @@ -135,23 +141,20 @@ func _process(_delta: float) -> void: # Customize properties func _validate_property(property: Dictionary) -> void: - if property.name == "tracker_name": + if property.name == "controller_tracker_name": property.hint = PROPERTY_HINT_ENUM_SUGGESTION property.hint_string = "/user/hand_pose_controller/left,/user/hand_pose_controller/right" + else: + super(property) # Get configuration warnings func _get_configuration_warnings() -> PackedStringArray: - var warnings := PackedStringArray() - - # Verify tracker name is set - if tracker_name == "": - warnings.append("Tracker name not set") + var warnings := super() - # Verify parent pose - var parent_pose_detector := get_parent() as HandPoseDetector - if not parent_pose_detector: - warnings.append("Must be child of HandPoseDetector node") + # Verify controller tracker name is set + if controller_tracker_name == "": + warnings.append("Controller racker name not set") # Return the warnings return warnings @@ -160,37 +163,37 @@ func _get_configuration_warnings() -> PackedStringArray: # Handle start of pose func _pose_started(p_name : String) -> void: # Skip if no tracker or action map - if not tracker or not action_map: + if not controller_tracker or not controller_action_map: return # Find the action - var action := action_map.get_action(p_name) + var action := controller_action_map.get_action(p_name) if not action: return # Set the input if action.action_type == HandPoseAction.ActionType.BOOL: - tracker.set_input(action.action_name, true) + controller_tracker.set_input(action.action_name, true) else: - tracker.set_input(action.action_name, 1.0) + controller_tracker.set_input(action.action_name, 1.0) # Handle end of pose func _pose_ended(p_name : String) -> void: # Skip if no tracker or action map - if not tracker or not action_map: + if not controller_tracker or not controller_action_map: return # Find the action - var action := action_map.get_action(p_name) + var action := controller_action_map.get_action(p_name) if not action: return # Set the input if action.action_type == HandPoseAction.ActionType.BOOL: - tracker.set_input(action.action_name, false) + controller_tracker.set_input(action.action_name, false) else: - tracker.set_input(action.action_name, 0.0) + controller_tracker.set_input(action.action_name, 0.0) # Returns an angular velocity rotated by the given basis matrix. diff --git a/addons/hand_pose_detector/hand_pose_controller.tscn b/addons/hand_pose_detector/hand_pose_controller.tscn index 84913fb..200106c 100644 --- a/addons/hand_pose_detector/hand_pose_controller.tscn +++ b/addons/hand_pose_detector/hand_pose_controller.tscn @@ -4,5 +4,4 @@ [node name="HandPoseController" type="Node"] script = ExtResource("1_peu0g") -tracker_name = null -pose_name = null +controller_pose_type = 1 diff --git a/addons/hand_pose_detector/hand_pose_detector.gd b/addons/hand_pose_detector/hand_pose_detector.gd index 5494139..5937463 100644 --- a/addons/hand_pose_detector/hand_pose_detector.gd +++ b/addons/hand_pose_detector/hand_pose_detector.gd @@ -15,14 +15,18 @@ signal pose_started(p_name : String) signal pose_ended(p_name : String) +@export_group("Hand", "hand_") + +## Name of the hand pose tracker +@export var hand_tracker_name : String = "/user/hand_tracker/left" + ## Current hand pose set @export var hand_pose_set : HandPoseSet -## Name of the hand pose tracker -@export var tracker_name : String = "/user/hand_tracker/left" ## Current hand tracker -var tracker : XRHandTracker +var hand_tracker : XRHandTracker + # Current hand pose data var _current_data : HandPoseData = HandPoseData.new() @@ -42,7 +46,7 @@ var _new_hold : float = 0.0 # Customize the properties func _validate_property(property: Dictionary) -> void: - if property.name == "tracker_name": + if property.name == "hand_tracker_name": property.hint = PROPERTY_HINT_ENUM_SUGGESTION property.hint_string = "/user/hand_tracker/left,/user/hand_tracker/right" @@ -62,12 +66,12 @@ func _process(delta: float) -> void: return # Skip if no tracker or hand pose set - if not tracker or not hand_pose_set: + if not hand_tracker or not hand_pose_set: return # If the palm is not tracked then skip pose detection. Any current pose will # remain active until we see the hand again. - var flags := tracker.get_hand_joint_flags(XRHandTracker.HAND_JOINT_PALM) + var flags := hand_tracker.get_hand_joint_flags(XRHandTracker.HAND_JOINT_PALM) if (flags & XRHandTracker.HAND_JOINT_FLAG_POSITION_TRACKED) == 0: return; if (flags & XRHandTracker.HAND_JOINT_FLAG_ORIENTATION_TRACKED) == 0: @@ -77,7 +81,7 @@ func _process(delta: float) -> void: var active_pos := _current_pose # Find the pose - _current_data.update(tracker) + _current_data.update(hand_tracker) var pose := hand_pose_set.find_pose(_current_data) # Manage current pose @@ -122,7 +126,19 @@ func _process(delta: float) -> void: pose_started.emit(active_pos.pose_name) +# Get configuration warnings +func _get_configuration_warnings() -> PackedStringArray: + var warnings := PackedStringArray() + + # Verify hand tracker name is set + if hand_tracker_name == "": + warnings.append("Hand tracker name not set") + + # Return the warnings + return warnings + + # If the tracker changed then try to get the updated handle func _on_tracker_changed(p_name : StringName, _type) -> void: - if p_name == tracker_name: - tracker = XRServer.get_tracker(tracker_name) + if p_name == hand_tracker_name: + hand_tracker = XRServer.get_tracker(hand_tracker_name) diff --git a/addons/hand_pose_detector/hand_pose_detector.tscn b/addons/hand_pose_detector/hand_pose_detector.tscn index 5b92930..6f161a7 100644 --- a/addons/hand_pose_detector/hand_pose_detector.tscn +++ b/addons/hand_pose_detector/hand_pose_detector.tscn @@ -4,4 +4,3 @@ [node name="HandPoseDetector" type="Node"] script = ExtResource("1_rrxmu") -tracker_name = "/user/hand_tracker/left" diff --git a/assets/inspect/pose_info.gd b/assets/inspect/pose_info.gd index 97edd6e..cf9b35e 100644 --- a/assets/inspect/pose_info.gd +++ b/assets/inspect/pose_info.gd @@ -4,7 +4,7 @@ extends Label3D ## Hand pose to diagnose -@export var pose : HandPose +@export var pose : HandPose ## Name of the hand pose tracker @export var tracker_name : String = "/user/hand_tracker/left" diff --git a/demo.tscn b/demo.tscn index 1313c67..8680a2d 100644 --- a/demo.tscn +++ b/demo.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=25 format=4 uid="uid://y0j46ct8rv7f"] +[gd_scene load_steps=24 format=4 uid="uid://y0j46ct8rv7f"] [ext_resource type="Script" path="res://demo.gd" id="1_3t01i"] [ext_resource type="PackedScene" uid="uid://cjcehqrfoxav3" path="res://addons/hand_pose_detector/hands/LeftHandHumanoid.gltf" id="2_qj6xm"] [ext_resource type="Texture2D" uid="uid://jmog4gftnc6" path="res://addons/hand_pose_detector/hands/hand.png" id="3_nkppy"] -[ext_resource type="PackedScene" uid="uid://df5hynbooj1uj" path="res://addons/hand_pose_detector/hand_pose_detector.tscn" id="3_sea3p"] [ext_resource type="Resource" uid="uid://ckjd0xa2a240p" path="res://addons/hand_pose_detector/poses/standard_pose_set.tres" id="4_aw253"] [ext_resource type="PackedScene" uid="uid://dabmoo0spa6vg" path="res://addons/hand_pose_detector/hands/RightHandHumanoid.gltf" id="4_uvuof"] [ext_resource type="PackedScene" uid="uid://bh8isvqs258cp" path="res://addons/hand_pose_detector/hand_pose_controller.tscn" id="5_0abgo"] @@ -128,15 +127,15 @@ bind/24/name = &"LeftLittleTip" bind/24/bone = -1 bind/24/pose = Transform3D(-0.0340048, -0.961705, 0.271969, 0.359157, -0.265706, -0.894655, 0.932658, 0.0672569, 0.354438, -0.0260868, -0.135553, 0.0427634) -[sub_resource type="Resource" id="Resource_vo1wg"] +[sub_resource type="Resource" id="Resource_pugay"] script = ExtResource("7_ownji") pose = ExtResource("8_pcf64") action_type = 0 action_name = "point_thumb_up" -[sub_resource type="Resource" id="Resource_xdjma"] +[sub_resource type="Resource" id="Resource_gbdrn"] script = ExtResource("9_ux58f") -actions = Array[ExtResource("7_ownji")]([SubResource("Resource_vo1wg")]) +actions = Array[ExtResource("7_ownji")]([SubResource("Resource_pugay")]) [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_073d2"] resource_name = "Hand" @@ -397,14 +396,10 @@ skin = SubResource("Skin_jphv2") [node name="XRHandModifier3D" type="XRHandModifier3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="1"] -[node name="LeftHandPose" parent="XROrigin3D/LeftTrackedHand" instance=ExtResource("3_sea3p")] +[node name="LeftHandPose" parent="XROrigin3D/LeftTrackedHand" instance=ExtResource("5_0abgo")] +controller_action_map = SubResource("Resource_gbdrn") hand_pose_set = ExtResource("4_aw253") -[node name="LeftHandPoseController" parent="XROrigin3D/LeftTrackedHand/LeftHandPose" instance=ExtResource("5_0abgo")] -tracker_name = "/user/hand_pose_controller/left" -pose_type = 1 -action_map = SubResource("Resource_xdjma") - [node name="RightTrackedHand" type="XRNode3D" parent="XROrigin3D"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 1, 0) tracker = &"/user/hand_tracker/right" @@ -521,14 +516,11 @@ skin = SubResource("Skin_ivlc3") [node name="XRHandModifier3D" type="XRHandModifier3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid/RightHandHumanoid/Skeleton3D" index="1"] hand_tracker = &"/user/hand_tracker/right" -[node name="RightHandPose" parent="XROrigin3D/RightTrackedHand" instance=ExtResource("3_sea3p")] +[node name="RightHandPose" parent="XROrigin3D/RightTrackedHand" instance=ExtResource("5_0abgo")] +controller_tracker_name = "/user/hand_pose_controller/right" +controller_action_map = SubResource("Resource_gbdrn") +hand_tracker_name = "/user/hand_tracker/right" hand_pose_set = ExtResource("4_aw253") -tracker_name = "/user/hand_tracker/right" - -[node name="RightHandPoseController" parent="XROrigin3D/RightTrackedHand/RightHandPose" instance=ExtResource("5_0abgo")] -tracker_name = "/user/hand_pose_controller/right" -pose_type = 1 -action_map = SubResource("Resource_xdjma") [node name="LeftPoseController" type="XRController3D" parent="XROrigin3D"] tracker = &"/user/hand_pose_controller/left" diff --git a/docs/add_hand_pose_controllers.png b/docs/add_hand_pose_controllers.png new file mode 100644 index 0000000..570dc4c Binary files /dev/null and b/docs/add_hand_pose_controllers.png differ diff --git a/docs/add_hand_pose_detectors.png b/docs/add_hand_pose_detectors.png deleted file mode 100644 index 0c862dc..0000000 Binary files a/docs/add_hand_pose_detectors.png and /dev/null differ diff --git a/docs/add_hand_pose_virtual_controllers.png b/docs/add_hand_pose_virtual_controllers.png new file mode 100644 index 0000000..4f9c8d8 Binary files /dev/null and b/docs/add_hand_pose_virtual_controllers.png differ diff --git a/docs/hand_pose_controller_settings.png b/docs/hand_pose_controller_settings.png new file mode 100644 index 0000000..a1da729 Binary files /dev/null and b/docs/hand_pose_controller_settings.png differ diff --git a/docs/hand_pose_detector_settings.png b/docs/hand_pose_detector_settings.png deleted file mode 100644 index 10dbf83..0000000 Binary files a/docs/hand_pose_detector_settings.png and /dev/null differ diff --git a/docs/virtual_controller_settings.png b/docs/virtual_controller_settings.png new file mode 100644 index 0000000..0c4f02b Binary files /dev/null and b/docs/virtual_controller_settings.png differ diff --git a/inspect.tscn b/inspect.tscn index bc3f28a..f02de0e 100644 --- a/inspect.tscn +++ b/inspect.tscn @@ -279,178 +279,102 @@ show_when_tracked = true [node name="LeftHandHumanoid" parent="XROrigin3D/LeftTrackedHand" instance=ExtResource("1_2xo61")] [node name="Skeleton3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid" index="0"] -bones/0/name = "LeftHand" -bones/0/parent = -1 bones/0/rest = Transform3D(1.78814e-07, -1.8388e-05, 1, -0.999999, 0.00166774, 1.78814e-07, -0.00166765, -0.999998, -1.83582e-05, 3.86425e-08, -1.86975e-05, 0.0271756) -bones/0/enabled = true bones/0/position = Vector3(3.86425e-08, -1.86975e-05, 0.0271756) bones/0/rotation = Quaternion(-0.499588, 0.500421, -0.499578, 0.500412) bones/0/scale = Vector3(1, 1, 1) -bones/1/name = "LeftThumbMetacarpal" -bones/1/parent = 0 bones/1/rest = Transform3D(0.546652, -0.612019, 0.571493, 0.469183, 0.789166, 0.396339, -0.69357, 0.0514748, 0.718548, -0.02, 0.0271729, 0.01) -bones/1/enabled = true bones/1/position = Vector3(-0.02, 0.0271729, 0.01) bones/1/rotation = Quaternion(-0.0986638, 0.361927, 0.309326, 0.873837) bones/1/scale = Vector3(1, 1, 1) -bones/2/name = "LeftThumbProximal" -bones/2/parent = 1 bones/2/rest = Transform3D(0.997668, -0.0459209, -0.0504877, 0.036618, 0.98445, -0.171807, 0.0575921, 0.169558, 0.983836, -2.79397e-09, 0.0449165, 4.65661e-10) -bones/2/enabled = true bones/2/position = Vector3(-2.79397e-09, 0.0449165, 4.65661e-10) bones/2/rotation = Quaternion(0.0857067, -0.0271357, 0.0207231, 0.995735) bones/2/scale = Vector3(1, 1, 1) -bones/3/name = "LeftThumbDistal" -bones/3/parent = 2 bones/3/rest = Transform3D(0.998052, -0.0580553, 0.0228638, 0.0577935, 0.998257, 0.0119478, -0.0235176, -0.0106032, 0.999667, 4.65661e-09, 0.0421479, 1.86265e-09) -bones/3/enabled = true bones/3/position = Vector3(4.65661e-09, 0.0421479, 1.86265e-09) bones/3/rotation = Quaternion(-0.00564059, 0.0116012, 0.0289768, 0.999497) bones/3/scale = Vector3(1, 1, 1) -bones/4/name = "LeftThumbTip" -bones/4/parent = 3 bones/4/rest = Transform3D(0.998218, 0.0565884, -0.0189201, -0.056539, 0.998395, 0.0031366, 0.0190672, -0.00206129, 0.999816, -2.79397e-09, 0.0307494, -2.79397e-09) -bones/4/enabled = true bones/4/position = Vector3(-2.79397e-09, 0.0307494, -2.79397e-09) bones/4/rotation = Quaternion(-0.00130005, -0.00950108, -0.0282945, 0.999554) bones/4/scale = Vector3(1, 1, 1) -bones/5/name = "LeftIndexMetacarpal" -bones/5/parent = 0 bones/5/rest = Transform3D(0.999999, 0.00117614, 7.19943e-05, -0.00117828, 0.998727, 0.0504232, -1.25979e-05, -0.0504232, 0.998728, -0.0224051, 0.0271772, -0.01) -bones/5/enabled = true bones/5/position = Vector3(-0.0224051, 0.0271772, -0.01) bones/5/rotation = Quaternion(-0.0252196, 2.11548e-05, -0.000588792, 0.999682) bones/5/scale = Vector3(1, 1, 1) -bones/6/name = "LeftIndexProximal" -bones/6/parent = 5 bones/6/rest = Transform3D(0.975244, -0.220783, -0.0124421, 0.220165, 0.964176, 0.147959, -0.0206705, -0.147035, 0.988915, 4.33062e-10, 0.0803676, -2.18051e-10) -bones/6/enabled = true bones/6/position = Vector3(4.33062e-10, 0.0803676, -2.18051e-10) bones/6/rotation = Quaternion(-0.0744182, 0.0020758, 0.111238, 0.991001) bones/6/scale = Vector3(1, 1, 1) -bones/7/name = "LeftIndexIntermediate" -bones/7/parent = 6 bones/7/rest = Transform3D(0.998482, 0.010944, -0.0539884, -0.0299241, 0.930611, -0.364783, 0.04625, 0.365845, 0.929526, 1.16415e-09, 0.0381163, 3.49246e-10) -bones/7/enabled = true bones/7/position = Vector3(1.16415e-09, 0.0381163, 3.49246e-10) bones/7/rotation = Quaternion(0.185973, -0.0255146, -0.0104025, 0.982168) bones/7/scale = Vector3(1, 1, 1) -bones/8/name = "LeftIndexDistal" -bones/8/parent = 7 bones/8/rest = Transform3D(0.999344, -0.0229881, -0.0279706, 0.0226341, 0.99966, -0.0129081, 0.0282579, 0.0122665, 0.999525, -8.73115e-11, 0.0301069, -1.86265e-09) -bones/8/enabled = true bones/8/position = Vector3(-8.73115e-11, 0.0301069, -1.86265e-09) bones/8/rotation = Quaternion(0.0062948, -0.0140597, 0.0114076, 0.999816) bones/8/scale = Vector3(1, 1, 1) -bones/9/name = "LeftIndexTip" -bones/9/parent = 8 bones/9/rest = Transform3D(0.99419, 0.107456, -0.00624832, -0.106381, 0.972095, -0.209079, -0.0163928, 0.208529, 0.977879, -6.40284e-10, 0.0271225, -1.65892e-09) -bones/9/enabled = true bones/9/position = Vector3(-6.40284e-10, 0.0271225, -1.65892e-09) bones/9/rotation = Quaternion(0.105139, 0.002554, -0.0538363, 0.992996) -bones/9/scale = Vector3(1, 1, 1) -bones/10/name = "LeftMiddleMetacarpal" -bones/10/parent = 0 bones/10/rest = Transform3D(0.997429, 0.0715693, 0.00366747, -0.0715777, 0.992433, 0.099763, 0.00350025, -0.099769, 0.995004, -0.00352759, 0.0271458, -0.01) -bones/10/enabled = true bones/10/position = Vector3(-0.00352759, 0.0271458, -0.01) bones/10/rotation = Quaternion(-0.0499776, 4.18839e-05, -0.0358546, 0.998107) bones/10/scale = Vector3(1, 1, 1) -bones/11/name = "LeftMiddleProximal" -bones/11/parent = 10 bones/11/rest = Transform3D(0.999713, 0.0239661, -0.000407946, -0.0238698, 0.993858, -0.108054, -0.00218418, 0.108032, 0.994145, -1.81899e-10, 0.0804633, -2.04591e-09) -bones/11/enabled = true bones/11/position = Vector3(-1.81899e-10, 0.0804633, -2.04591e-09) bones/11/rotation = Quaternion(0.0541047, 0.000444743, -0.0119774, 0.998463) bones/11/scale = Vector3(1, 1, 1) -bones/12/name = "LeftMiddleIntermediate" -bones/12/parent = 11 bones/12/rest = Transform3D(0.996861, -0.0770918, 0.0180526, 0.0789612, 0.98479, -0.154768, -0.00584665, 0.155708, 0.987786, 2.47383e-10, 0.0450034, 4.14548e-09) -bones/12/enabled = true bones/12/position = Vector3(2.47383e-10, 0.0450034, 4.14548e-09) bones/12/rotation = Quaternion(0.0779173, 0.00599777, 0.0391632, 0.996172) bones/12/scale = Vector3(1, 1, 1) -bones/13/name = "LeftMiddleDistal" -bones/13/parent = 12 bones/13/rest = Transform3D(0.999746, 0.0224583, -0.00187703, -0.0223003, 0.997856, 0.0615352, 0.00325498, -0.0614777, 0.998103, 1.10958e-10, 0.03174, 1.05001e-09) -bones/13/enabled = true bones/13/position = Vector3(1.10958e-10, 0.03174, 1.05001e-09) bones/13/rotation = Quaternion(-0.0307698, -0.00128369, -0.0111957, 0.999463) bones/13/scale = Vector3(1, 1, 1) -bones/14/name = "LeftMiddleTip" -bones/14/parent = 13 bones/14/rest = Transform3D(0.999753, -0.0205481, 0.008409, 0.0221425, 0.950535, -0.309827, -0.00162669, 0.309937, 0.950756, 6.36646e-10, 0.028247, 4.35375e-09) -bones/14/enabled = true bones/14/position = Vector3(6.36646e-10, 0.028247, 4.35375e-09) bones/14/rotation = Quaternion(0.156894, 0.00254055, 0.0108072, 0.987553) bones/14/scale = Vector3(1, 1, 1) -bones/15/name = "LeftRingMetacarpal" -bones/15/parent = 0 bones/15/rest = Transform3D(0.989862, 0.142005, 0.00260635, -0.142006, 0.989208, 0.0360713, 0.00254407, -0.0360757, 0.999346, 0.0131, 0.027118, -0.01) -bones/15/enabled = true bones/15/position = Vector3(0.0131, 0.027118, -0.01) bones/15/rotation = Quaternion(-0.0180856, 1.56121e-05, -0.0711949, 0.997298) bones/15/scale = Vector3(1, 1, 1) -bones/16/name = "LeftRingProximal" -bones/16/parent = 15 bones/16/rest = Transform3D(0.994778, 0.101692, -0.00866368, -0.101722, 0.994808, -0.00308186, 0.0083053, 0.00394705, 0.999958, 1.73168e-09, 0.0739439, 8.58563e-10) -bones/16/enabled = true bones/16/position = Vector3(1.73168e-09, 0.0739439, 8.58563e-10) bones/16/rotation = Quaternion(0.00175953, -0.0042478, -0.0509199, 0.998692) bones/16/scale = Vector3(1, 1, 1) -bones/17/name = "LeftRingIntermediate" -bones/17/parent = 16 bones/17/rest = Transform3D(0.998829, -0.0255095, 0.0411024, 0.0331103, 0.979961, -0.196418, -0.0352682, 0.197549, 0.979658, -3.79805e-09, 0.0401312, -1.78989e-09) -bones/17/enabled = true bones/17/position = Vector3(-3.79805e-09, 0.0401312, -1.78989e-09) bones/17/rotation = Quaternion(0.0990075, 0.0191926, 0.0147317, 0.994793) bones/17/scale = Vector3(1, 1, 1) -bones/18/name = "LeftRingDistal" -bones/18/parent = 17 bones/18/rest = Transform3D(0.999619, 0.00353939, 0.0273906, -0.0041651, 0.999731, 0.0228206, -0.0273024, -0.022926, 0.999364, 3.20142e-10, 0.0270401, -1.74623e-09) -bones/18/enabled = true bones/18/position = Vector3(3.20142e-10, 0.0270401, -1.74623e-09) bones/18/rotation = Quaternion(-0.0114385, 0.0136755, -0.00192643, 0.999839) bones/18/scale = Vector3(1, 1, 1) -bones/19/name = "LeftRingTip" -bones/19/parent = 18 bones/19/rest = Transform3D(0.998472, -0.0543893, -0.00972363, 0.0497911, 0.962035, -0.268346, 0.0239496, 0.267451, 0.963274, -3.24508e-09, 0.0329011, -1.74623e-09) -bones/19/enabled = true bones/19/position = Vector3(-3.24508e-09, 0.0329011, -1.74623e-09) bones/19/rotation = Quaternion(0.135244, -0.00849967, 0.0262968, 0.990427) bones/19/scale = Vector3(1, 1, 1) -bones/20/name = "LeftLittleMetacarpal" -bones/20/parent = 0 bones/20/rest = Transform3D(0.983157, 0.182689, 0.00527039, -0.182691, 0.981538, 0.0566277, 0.00517213, -0.0566367, 0.998381, 0.03, 0.0270896, 8.65159e-10) -bones/20/enabled = true bones/20/position = Vector3(0.03, 0.0270896, 8.65159e-10) bones/20/rotation = Quaternion(-0.0284477, 2.46805e-05, -0.0917695, 0.995374) bones/20/scale = Vector3(1, 1, 1) -bones/21/name = "LeftLittleProximal" -bones/21/parent = 20 bones/21/rest = Transform3D(0.984036, 0.177665, -0.0104169, -0.177811, 0.979002, -0.0996947, -0.00751406, 0.0999554, 0.994964, 3.36513e-10, 0.0657112, -3.63798e-10) -bones/21/enabled = true bones/21/position = Vector3(3.36513e-10, 0.0657112, -3.63798e-10) bones/21/rotation = Quaternion(0.0501767, -0.000729555, -0.0893392, 0.994736) bones/21/scale = Vector3(1, 1, 1) -bones/22/name = "LeftLittleIntermediate" -bones/22/parent = 21 bones/22/rest = Transform3D(0.99449, -0.0729023, 0.0753326, 0.0872473, 0.973965, -0.209235, -0.0581177, 0.214654, 0.974959, 2.07183e-09, 0.0331235, 0) -bones/22/enabled = true bones/22/position = Vector3(2.07183e-09, 0.0331235, 0) bones/22/rotation = Quaternion(0.10673, 0.0336011, 0.0403236, 0.992902) bones/22/scale = Vector3(1, 1, 1) -bones/23/name = "LeftLittleDistal" -bones/23/parent = 22 bones/23/rest = Transform3D(0.99926, 0.026051, 0.0282958, -0.0250496, 0.999067, -0.0351867, -0.029186, 0.0344519, 0.99898, -1.04046e-09, 0.0173016, 3.14321e-09) -bones/23/enabled = true bones/23/position = Vector3(-1.04046e-09, 0.0173016, 3.14321e-09) bones/23/rotation = Quaternion(0.0174155, 0.0143753, -0.0127795, 0.999663) bones/23/scale = Vector3(1, 1, 1) -bones/24/name = "LeftLittleTip" -bones/24/parent = 23 bones/24/rest = Transform3D(0.998816, -0.0281753, -0.0396661, 0.0252513, 0.997057, -0.0723805, 0.0415887, 0.0712931, 0.996588, -5.82077e-10, 0.01959, 8.3819e-09) -bones/24/enabled = true bones/24/position = Vector3(-5.82077e-10, 0.01959, 8.3819e-09) bones/24/rotation = Quaternion(0.0359523, -0.0203329, 0.0133693, 0.999057) bones/24/scale = Vector3(1, 1, 1) @@ -463,21 +387,21 @@ surface_material_override/0 = SubResource("StandardMaterial3D_uqtqc") [node name="XRHandModifier3D" type="XRHandModifier3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="1"] [node name="ThumbProximal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="2"] -transform = Transform3D(-0.648694, 0.204344, 0.733102, -0.555012, 0.532075, -0.639419, -0.520727, -0.821669, -0.231741, 0.0123109, 0.0475754, -0.0353648) +transform = Transform3D(-0.648694, 0.204343, 0.733103, -0.555014, 0.532075, -0.639418, -0.520726, -0.821669, -0.231741, 0.0123109, 0.0475754, -0.0353648) bone_name = "LeftThumbProximal" bone_idx = 2 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/ThumbProximal" instance=ExtResource("1_hotic")] [node name="ThumbDistal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="3"] -transform = Transform3D(-0.652862, 0.233875, 0.720468, -0.508143, 0.570149, -0.645539, -0.561749, -0.787548, -0.253387, 0.0209236, 0.0700013, -0.0699964) +transform = Transform3D(-0.652861, 0.233874, 0.720469, -0.508144, 0.570149, -0.645538, -0.561749, -0.787549, -0.253387, 0.0209235, 0.0700012, -0.0699965) bone_name = "LeftThumbDistal" bone_idx = 3 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/ThumbDistal" instance=ExtResource("1_hotic")] [node name="ThumbTip" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="4"] -transform = Transform3D(-0.651184, 0.19507, 0.733421, -0.551782, 0.54181, -0.634018, -0.521053, -0.817551, -0.245182, 0.0281151, 0.087533, -0.0942131) +transform = Transform3D(-0.651183, 0.195069, 0.733422, -0.551783, 0.54181, -0.634017, -0.521052, -0.817551, -0.245182, 0.028115, 0.087533, -0.0942131) bone_name = "LeftThumbTip" bone_idx = 4 @@ -485,21 +409,21 @@ bone_idx = 4 mesh = SubResource("SphereMesh_l375f") [node name="IndexProximal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="5"] -transform = Transform3D(-0.0317618, -0.19548, 0.980193, -0.975136, 0.221253, 0.0125266, -0.21932, -0.955423, -0.197647, -0.0140543, 0.0224711, -0.0802293) +transform = Transform3D(-0.0317611, -0.195481, 0.980193, -0.975136, 0.221252, 0.0125273, -0.219319, -0.955424, -0.197648, -0.0140544, 0.0224709, -0.0802293) bone_name = "LeftIndexProximal" bone_idx = 6 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/IndexProximal" instance=ExtResource("1_hotic")] [node name="IndexDistal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="6"] -transform = Transform3D(0.051258, 0.1879, 0.98085, -0.974995, 0.222064, 0.00841168, -0.216231, -0.956755, 0.194584, -0.0161964, 0.0369202, -0.145665) +transform = Transform3D(0.0512587, 0.187899, 0.98085, -0.974996, 0.222063, 0.00841285, -0.21623, -0.956756, 0.194583, -0.0161965, 0.0369199, -0.145665) bone_name = "LeftIndexDistal" bone_idx = 8 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/IndexDistal" instance=ExtResource("1_hotic")] [node name="IndexTip" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="7"] -transform = Transform3D(0.0148923, 0.3927, 0.919546, -0.993092, 0.112853, -0.0321113, -0.116383, -0.912716, 0.391668, -0.0111001, 0.0429431, -0.171614) +transform = Transform3D(0.0148931, 0.3927, 0.919546, -0.993093, 0.112852, -0.0321101, -0.116382, -0.912716, 0.391668, -0.0111003, 0.0429428, -0.171614) bone_name = "LeftIndexTip" bone_idx = 9 @@ -507,21 +431,21 @@ bone_idx = 9 mesh = SubResource("SphereMesh_l375f") [node name="MiddleProximal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="8"] -transform = Transform3D(0.00370937, 0.00840212, 0.999958, -0.995584, -0.0937702, 0.00448101, 0.093804, -0.995558, 0.00801718, -0.0180297, -0.00207136, -0.0798278) +transform = Transform3D(0.00371019, 0.00840171, 0.999958, -0.995584, -0.093771, 0.00448189, 0.0938046, -0.995558, 0.00801665, -0.0180297, -0.00207146, -0.0798279) bone_name = "LeftMiddleProximal" bone_idx = 11 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/MiddleProximal" instance=ExtResource("1_hotic")] [node name="MiddleDistal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="9"] -transform = Transform3D(-0.00192412, 0.102657, 0.994715, -0.999299, -0.0373781, 0.00192448, 0.0373782, -0.994014, 0.102657, -0.012456, -0.0067641, -0.15594) +transform = Transform3D(-0.00192332, 0.102656, 0.994715, -0.999299, -0.0373788, 0.00192543, 0.0373788, -0.994014, 0.102656, -0.0124561, -0.00676425, -0.15594) bone_name = "LeftMiddleDistal" bone_idx = 13 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/MiddleDistal" instance=ExtResource("1_hotic")] [node name="MiddleTip" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="10"] -transform = Transform3D(-0.00126867, 0.405917, 0.913909, -0.999884, -0.014399, 0.00500735, 0.0151921, -0.913796, 0.405888, -0.00955627, -0.00781992, -0.184018) +transform = Transform3D(-0.00126786, 0.405917, 0.913909, -0.999884, -0.0143993, 0.00500845, 0.0151926, -0.913796, 0.405888, -0.00955638, -0.00782009, -0.184018) bone_name = "LeftMiddleTip" bone_idx = 14 @@ -529,21 +453,21 @@ bone_idx = 14 mesh = SubResource("SphereMesh_l375f") [node name="RingProximal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="11"] -transform = Transform3D(0.0145049, -0.031703, 0.999392, -0.970672, -0.240321, 0.00646455, 0.23997, -0.970175, -0.0342591, -0.0126694, -0.0234518, -0.0731273) +transform = Transform3D(0.0145058, -0.0317035, 0.999392, -0.970672, -0.240322, 0.00646538, 0.239971, -0.970176, -0.0342598, -0.0126694, -0.0234519, -0.0731273) bone_name = "LeftRingProximal" bone_idx = 16 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/RingProximal" instance=ExtResource("1_hotic")] [node name="RingDistal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="12"] -transform = Transform3D(-0.0494087, 0.143267, 0.98845, -0.976848, -0.213183, -0.0179297, 0.208152, -0.966451, 0.150483, -0.00945323, -0.0387602, -0.138118) +transform = Transform3D(-0.0494078, 0.143267, 0.98845, -0.976848, -0.213184, -0.0179288, 0.208153, -0.966451, 0.150483, -0.00945331, -0.0387603, -0.138118) bone_name = "LeftRingDistal" bone_idx = 18 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/RingDistal" instance=ExtResource("1_hotic")] [node name="RingTip" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="13"] -transform = Transform3D(-0.0185268, 0.404878, 0.914183, -0.986399, -0.156755, 0.0494341, 0.163318, -0.900834, 0.402275, -0.00473959, -0.0457741, -0.169915) +transform = Transform3D(-0.018526, 0.404877, 0.914183, -0.986399, -0.156756, 0.0494352, 0.163319, -0.900834, 0.402275, -0.00473968, -0.0457743, -0.169915) bone_name = "LeftRingTip" bone_idx = 19 @@ -551,21 +475,21 @@ bone_idx = 19 mesh = SubResource("SphereMesh_l375f") [node name="PinkyProximal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="14"] -transform = Transform3D(0.00766499, 0.045248, 0.998946, -0.935528, -0.352493, 0.0231448, 0.353169, -0.93472, 0.039629, -0.0037233, -0.0418705, -0.0644819) +transform = Transform3D(0.00766593, 0.0452478, 0.998946, -0.935528, -0.352494, 0.0231457, 0.35317, -0.93472, 0.0396283, -0.00372333, -0.0418707, -0.0644819) bone_name = "LeftLittleProximal" bone_idx = 21 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/PinkyProximal" instance=ExtResource("1_hotic")] [node name="PinkyDistal" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="15"] -transform = Transform3D(-0.0810786, 0.289735, 0.953666, -0.955747, -0.294077, 0.00808847, 0.282795, -0.910808, 0.300757, 0.00223823, -0.0582203, -0.111493) +transform = Transform3D(-0.0810777, 0.289735, 0.953667, -0.955747, -0.294077, 0.00808961, 0.282796, -0.910809, 0.300757, 0.0022382, -0.0582204, -0.111492) bone_name = "LeftLittleDistal" bone_idx = 23 [node name="Axis" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D/PinkyDistal" instance=ExtResource("1_hotic")] [node name="PinkyTip" type="BoneAttachment3D" parent="XROrigin3D/LeftTrackedHand/LeftHandHumanoid/LeftHandHumanoid/Skeleton3D" index="16"] -transform = Transform3D(-0.0340046, 0.359157, 0.932657, -0.961705, -0.265706, 0.067257, 0.271969, -0.894654, 0.354438, 0.00791415, -0.0639813, -0.129335) +transform = Transform3D(-0.0340036, 0.359157, 0.932658, -0.961705, -0.265707, 0.0672583, 0.27197, -0.894654, 0.354438, 0.00791412, -0.0639814, -0.129335) bone_name = "LeftLittleTip" bone_idx = 24 @@ -582,178 +506,103 @@ show_when_tracked = true [node name="RightHandHumanoid2" parent="XROrigin3D/RightTrackedHand" instance=ExtResource("2_lordw")] [node name="Skeleton3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid" index="0"] -bones/0/name = "RightHand" -bones/0/parent = -1 bones/0/rest = Transform3D(1.78814e-07, 1.8388e-05, -1, 0.999999, 0.00166774, 1.78814e-07, 0.00166765, -0.999998, -1.83582e-05, -3.86425e-08, -1.86975e-05, 0.0271756) -bones/0/enabled = true bones/0/position = Vector3(-3.86425e-08, -1.86975e-05, 0.0271756) bones/0/rotation = Quaternion(-0.499588, -0.500421, 0.499578, 0.500412) bones/0/scale = Vector3(1, 1, 1) -bones/1/name = "RightThumbMetacarpal" -bones/1/parent = 0 bones/1/rest = Transform3D(0.546652, 0.612019, -0.571493, -0.469183, 0.789166, 0.396339, 0.69357, 0.0514748, 0.718548, 0.02, 0.0271729, 0.01) -bones/1/enabled = true bones/1/position = Vector3(0.02, 0.0271729, 0.01) bones/1/rotation = Quaternion(-0.0986638, -0.361927, -0.309326, 0.873837) bones/1/scale = Vector3(1, 1, 1) -bones/2/name = "RightThumbProximal" -bones/2/parent = 1 bones/2/rest = Transform3D(0.997668, 0.0459209, 0.0504877, -0.036618, 0.98445, -0.171807, -0.0575921, 0.169558, 0.983836, 2.79397e-09, 0.0449165, 4.65661e-10) -bones/2/enabled = true bones/2/position = Vector3(2.79397e-09, 0.0449165, 4.65661e-10) bones/2/rotation = Quaternion(0.0857067, 0.0271357, -0.0207231, 0.995735) bones/2/scale = Vector3(1, 1, 1) -bones/3/name = "RightThumbDistal" -bones/3/parent = 2 bones/3/rest = Transform3D(0.998052, 0.0580553, -0.0228638, -0.0577935, 0.998257, 0.0119478, 0.0235176, -0.0106032, 0.999667, -4.65661e-09, 0.0421479, 1.86265e-09) -bones/3/enabled = true bones/3/position = Vector3(-4.65661e-09, 0.0421479, 1.86265e-09) bones/3/rotation = Quaternion(-0.00564059, -0.0116012, -0.0289768, 0.999497) bones/3/scale = Vector3(1, 1, 1) -bones/4/name = "RightThumbTip" -bones/4/parent = 3 bones/4/rest = Transform3D(0.997637, -0.0565883, 0.0389741, 0.0564645, 0.998395, 0.00427204, -0.0391533, -0.00206129, 0.999231, 2.79397e-09, 0.0307494, -2.79397e-09) -bones/4/enabled = true bones/4/position = Vector3(2.79397e-09, 0.0307494, -2.79397e-09) bones/4/rotation = Quaternion(-0.00158427, 0.0195434, 0.02828, 0.999408) bones/4/scale = Vector3(1, 1, 1) -bones/5/name = "RightIndexMetacarpal" -bones/5/parent = 0 bones/5/rest = Transform3D(0.999999, -0.00117614, -7.19943e-05, 0.00117828, 0.998727, 0.0504232, 1.25979e-05, -0.0504232, 0.998728, 0.0224051, 0.0271772, -0.01) -bones/5/enabled = true bones/5/position = Vector3(0.0224051, 0.0271772, -0.01) bones/5/rotation = Quaternion(-0.0252196, -2.11548e-05, 0.000588792, 0.999682) bones/5/scale = Vector3(1, 1, 1) -bones/6/name = "RightIndexProximal" -bones/6/parent = 5 bones/6/rest = Transform3D(0.975244, 0.220783, 0.0124421, -0.220165, 0.964176, 0.147959, 0.0206705, -0.147035, 0.988915, -4.33062e-10, 0.0803676, -2.18051e-10) -bones/6/enabled = true bones/6/position = Vector3(-4.33062e-10, 0.0803676, -2.18051e-10) bones/6/rotation = Quaternion(-0.0744182, -0.0020758, -0.111238, 0.991001) bones/6/scale = Vector3(1, 1, 1) -bones/7/name = "RightIndexIntermediate" -bones/7/parent = 6 bones/7/rest = Transform3D(0.998482, -0.010944, 0.0539884, 0.0299241, 0.930611, -0.364783, -0.04625, 0.365845, 0.929526, -1.16415e-09, 0.0381163, 3.49246e-10) -bones/7/enabled = true bones/7/position = Vector3(-1.16415e-09, 0.0381163, 3.49246e-10) bones/7/rotation = Quaternion(0.185973, 0.0255146, 0.0104025, 0.982168) bones/7/scale = Vector3(1, 1, 1) -bones/8/name = "RightIndexDistal" -bones/8/parent = 7 bones/8/rest = Transform3D(0.99934, 0.0229911, 0.0281253, -0.0226349, 0.99966, -0.0129208, -0.0284128, 0.0122756, 0.999521, 8.73115e-11, 0.0301069, -1.86265e-09) -bones/8/enabled = true bones/8/position = Vector3(8.73115e-11, 0.0301069, -1.86265e-09) bones/8/rotation = Quaternion(0.00630027, 0.0141371, -0.0114086, 0.999815) bones/8/scale = Vector3(1, 1, 1) -bones/9/name = "RightIndexTip" -bones/9/parent = 8 bones/9/rest = Transform3D(0.99415, -0.107491, 0.0105786, 0.107326, 0.972099, -0.208576, 0.0121365, 0.208492, 0.977949, 9.8953e-10, 0.0271217, -1.39698e-09) -bones/9/enabled = true bones/9/position = Vector3(9.8953e-10, 0.0271217, -1.39698e-09) bones/9/rotation = Quaternion(0.105002, -0.000392217, 0.0540827, 0.993) bones/9/scale = Vector3(1, 1, 1) -bones/10/name = "RightMiddleMetacarpal" -bones/10/parent = 0 bones/10/rest = Transform3D(0.997429, -0.0715693, -0.00366747, 0.0715777, 0.992433, 0.099763, -0.00350025, -0.099769, 0.995004, 0.00352759, 0.0271458, -0.01) -bones/10/enabled = true bones/10/position = Vector3(0.00352759, 0.0271458, -0.01) bones/10/rotation = Quaternion(-0.0499776, -4.18839e-05, 0.0358546, 0.998107) bones/10/scale = Vector3(1, 1, 1) -bones/11/name = "RightMiddleProximal" -bones/11/parent = 10 bones/11/rest = Transform3D(0.999713, -0.0239661, 0.000407946, 0.0238698, 0.993858, -0.108054, 0.00218418, 0.108032, 0.994145, 1.81899e-10, 0.0804633, -2.04591e-09) -bones/11/enabled = true bones/11/position = Vector3(1.81899e-10, 0.0804633, -2.04591e-09) bones/11/rotation = Quaternion(0.0541047, -0.000444743, 0.0119774, 0.998463) bones/11/scale = Vector3(1, 1, 1) -bones/12/name = "RightMiddleIntermediate" -bones/12/parent = 11 bones/12/rest = Transform3D(0.996861, 0.0770919, -0.0180526, -0.0789612, 0.98479, -0.154768, 0.00584665, 0.155708, 0.987786, -2.47383e-10, 0.0450034, 4.14548e-09) -bones/12/enabled = true bones/12/position = Vector3(-2.47383e-10, 0.0450034, 4.14548e-09) bones/12/rotation = Quaternion(0.0779173, -0.00599777, -0.0391632, 0.996172) bones/12/scale = Vector3(1, 1, 1) -bones/13/name = "RightMiddleDistal" -bones/13/parent = 12 bones/13/rest = Transform3D(0.999729, -0.0224545, -0.00615632, 0.0227903, 0.997855, 0.0613626, 0.00476525, -0.0614863, 0.998096, 1.437e-10, 0.03174, 1.05956e-09) -bones/13/enabled = true bones/13/position = Vector3(1.437e-10, 0.03174, 1.05956e-09) bones/13/rotation = Quaternion(-0.0307288, -0.00273187, 0.0113173, 0.99946) bones/13/scale = Vector3(1, 1, 1) -bones/14/name = "RightMiddleTip" -bones/14/parent = 13 bones/14/rest = Transform3D(0.999734, 0.0230609, -0.000902223, -0.0222452, 0.952487, -0.303766, -0.00614577, 0.303705, 0.952746, 1.04774e-09, 0.0282475, 1.437e-09) -bones/14/enabled = true bones/14/position = Vector3(1.04774e-09, 0.0282475, 1.437e-09) bones/14/rotation = Quaternion(0.153705, 0.00132674, -0.0114635, 0.988049) bones/14/scale = Vector3(1, 1, 1) -bones/15/name = "RightRingMetacarpal" -bones/15/parent = 0 bones/15/rest = Transform3D(0.989862, -0.142005, -0.00260635, 0.142006, 0.989208, 0.0360713, -0.00254407, -0.0360757, 0.999346, -0.0131, 0.027118, -0.01) -bones/15/enabled = true bones/15/position = Vector3(-0.0131, 0.027118, -0.01) bones/15/rotation = Quaternion(-0.0180856, -1.56121e-05, 0.0711949, 0.997298) bones/15/scale = Vector3(1, 1, 1) -bones/16/name = "RightRingProximal" -bones/16/parent = 15 bones/16/rest = Transform3D(0.994778, -0.101692, 0.00866368, 0.101722, 0.994808, -0.00308186, -0.0083053, 0.00394705, 0.999958, -1.73168e-09, 0.0739439, 8.58563e-10) -bones/16/enabled = true bones/16/position = Vector3(-1.73168e-09, 0.0739439, 8.58563e-10) bones/16/rotation = Quaternion(0.00175953, 0.0042478, 0.0509199, 0.998692) bones/16/scale = Vector3(1, 1, 1) -bones/17/name = "RightRingIntermediate" -bones/17/parent = 16 bones/17/rest = Transform3D(0.998829, 0.0255095, -0.0411024, -0.0331103, 0.979961, -0.196418, 0.0352682, 0.197549, 0.979658, 3.79805e-09, 0.0401312, -1.78989e-09) -bones/17/enabled = true bones/17/position = Vector3(3.79805e-09, 0.0401312, -1.78989e-09) bones/17/rotation = Quaternion(0.0990075, -0.0191926, -0.0147317, 0.994793) bones/17/scale = Vector3(1, 1, 1) -bones/18/name = "RightRingDistal" -bones/18/parent = 17 bones/18/rest = Transform3D(0.999619, -0.00353939, -0.0273906, 0.0041651, 0.999731, 0.0228206, 0.0273024, -0.022926, 0.999364, -3.20142e-10, 0.0270401, -1.74623e-09) -bones/18/enabled = true bones/18/position = Vector3(-3.20142e-10, 0.0270401, -1.74623e-09) bones/18/rotation = Quaternion(-0.0114385, -0.0136755, 0.00192643, 0.999839) bones/18/scale = Vector3(1, 1, 1) -bones/19/name = "RightRingTip" -bones/19/parent = 18 bones/19/rest = Transform3D(0.998472, 0.0543893, 0.00972363, -0.0497911, 0.962035, -0.268346, -0.0239496, 0.267451, 0.963274, 3.24508e-09, 0.0329011, -1.74623e-09) -bones/19/enabled = true bones/19/position = Vector3(3.24508e-09, 0.0329011, -1.74623e-09) bones/19/rotation = Quaternion(0.135244, 0.00849967, -0.0262968, 0.990427) bones/19/scale = Vector3(1, 1, 1) -bones/20/name = "RightLittleMetacarpal" -bones/20/parent = 0 bones/20/rest = Transform3D(0.983157, -0.182689, -0.00527039, 0.182691, 0.981538, 0.0566277, -0.00517213, -0.0566367, 0.998381, -0.03, 0.0270896, 8.65159e-10) -bones/20/enabled = true bones/20/position = Vector3(-0.03, 0.0270896, 8.65159e-10) bones/20/rotation = Quaternion(-0.0284477, -2.46805e-05, 0.0917695, 0.995374) bones/20/scale = Vector3(1, 1, 1) -bones/21/name = "RightLittleProximal" -bones/21/parent = 20 bones/21/rest = Transform3D(0.984036, -0.177665, 0.0104169, 0.177811, 0.979002, -0.0996947, 0.00751406, 0.0999554, 0.994964, -3.36513e-10, 0.0657112, -3.63798e-10) -bones/21/enabled = true bones/21/position = Vector3(-3.36513e-10, 0.0657112, -3.63798e-10) bones/21/rotation = Quaternion(0.0501767, 0.000729555, 0.0893392, 0.994736) bones/21/scale = Vector3(1, 1, 1) -bones/22/name = "RightLittleIntermediate" -bones/22/parent = 21 bones/22/rest = Transform3D(0.99449, 0.0729023, -0.0753326, -0.0872473, 0.973965, -0.209235, 0.0581177, 0.214654, 0.974959, -2.07183e-09, 0.0331235, 0) -bones/22/enabled = true bones/22/position = Vector3(-2.07183e-09, 0.0331235, 0) bones/22/rotation = Quaternion(0.10673, -0.0336011, -0.0403236, 0.992902) bones/22/scale = Vector3(1, 1, 1) -bones/23/name = "RightLittleDistal" -bones/23/parent = 22 bones/23/rest = Transform3D(0.99926, -0.026051, -0.0282958, 0.0250496, 0.999067, -0.0351867, 0.029186, 0.0344519, 0.99898, 1.04046e-09, 0.0173016, 3.14321e-09) -bones/23/enabled = true bones/23/position = Vector3(1.04046e-09, 0.0173016, 3.14321e-09) bones/23/rotation = Quaternion(0.0174155, -0.0143753, 0.0127795, 0.999663) bones/23/scale = Vector3(1, 1, 1) -bones/24/name = "RightLittleTip" -bones/24/parent = 23 bones/24/rest = Transform3D(0.998816, 0.0281753, 0.0396661, -0.0252513, 0.997057, -0.0723805, -0.0415887, 0.0712931, 0.996588, 5.82077e-10, 0.01959, 8.3819e-09) -bones/24/enabled = true bones/24/position = Vector3(5.82077e-10, 0.01959, 8.3819e-09) bones/24/rotation = Quaternion(0.0359523, 0.0203329, -0.0133693, 0.999057) bones/24/scale = Vector3(1, 1, 1) @@ -767,21 +616,21 @@ surface_material_override/0 = SubResource("StandardMaterial3D_lnvj1") hand_tracker = &"/user/hand_tracker/right" [node name="ThumbProximal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="2"] -transform = Transform3D(-0.648694, -0.204344, -0.733102, 0.555012, 0.532075, -0.639419, 0.520727, -0.821669, -0.231741, -0.0123109, 0.0475754, -0.0353648) +transform = Transform3D(-0.648694, -0.204343, -0.733103, 0.555014, 0.532075, -0.639418, 0.520726, -0.821669, -0.231741, -0.0123109, 0.0475754, -0.0353648) bone_name = "RightThumbProximal" bone_idx = 2 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/ThumbProximal" instance=ExtResource("1_hotic")] [node name="ThumbDistal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="3"] -transform = Transform3D(-0.652862, -0.233875, -0.720468, 0.508143, 0.570149, -0.645539, 0.561749, -0.787548, -0.253387, -0.0209236, 0.0700013, -0.0699964) +transform = Transform3D(-0.652861, -0.233874, -0.720469, 0.508144, 0.570149, -0.645538, 0.561749, -0.787549, -0.253387, -0.0209235, 0.0700012, -0.0699965) bone_name = "RightThumbDistal" bone_idx = 3 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/ThumbDistal" instance=ExtResource("1_hotic")] [node name="ThumbTip" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="4"] -transform = Transform3D(-0.636315, -0.19507, -0.746358, 0.56441, 0.54181, -0.622803, 0.525874, -0.817551, -0.234663, -0.0281151, 0.087533, -0.0942131) +transform = Transform3D(-0.636315, -0.195069, -0.746359, 0.564411, 0.54181, -0.622802, 0.525874, -0.817551, -0.234663, -0.028115, 0.087533, -0.0942131) bone_name = "RightThumbTip" bone_idx = 4 @@ -789,21 +638,21 @@ bone_idx = 4 mesh = SubResource("SphereMesh_l375f") [node name="IndexProximal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="5"] -transform = Transform3D(-0.0317618, 0.19548, -0.980193, 0.975136, 0.221253, 0.0125266, 0.21932, -0.955423, -0.197647, 0.0140543, 0.0224711, -0.0802293) +transform = Transform3D(-0.0317611, 0.195481, -0.980193, 0.975136, 0.221252, 0.0125273, 0.219319, -0.955424, -0.197648, 0.0140544, 0.0224709, -0.0802293) bone_name = "RightIndexProximal" bone_idx = 6 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/IndexProximal" instance=ExtResource("1_hotic")] [node name="IndexDistal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="6"] -transform = Transform3D(0.0514106, -0.187908, -0.98084, 0.974994, 0.222067, 0.00856074, 0.216203, -0.956753, 0.194626, 0.0161964, 0.0369202, -0.145665) +transform = Transform3D(0.0514112, -0.187908, -0.98084, 0.974994, 0.222066, 0.00856185, 0.216202, -0.956754, 0.194625, 0.0161965, 0.0369199, -0.145665) bone_name = "RightIndexDistal" bone_idx = 8 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/IndexDistal" instance=ExtResource("1_hotic")] [node name="IndexTip" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="7"] -transform = Transform3D(0.0190384, -0.392689, -0.919474, 0.993227, 0.112853, -0.0276318, 0.114616, -0.912721, 0.392177, 0.0111, 0.042943, -0.171613) +transform = Transform3D(0.0190391, -0.392688, -0.919475, 0.993227, 0.112852, -0.0276306, 0.114615, -0.912722, 0.392177, 0.0111002, 0.0429427, -0.171613) bone_name = "RightIndexTip" bone_idx = 9 @@ -811,21 +660,21 @@ bone_idx = 9 mesh = SubResource("SphereMesh_l375f") [node name="MiddleProximal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="8"] -transform = Transform3D(0.00370937, -0.00840212, -0.999958, 0.995584, -0.0937702, 0.00448101, -0.093804, -0.995558, 0.00801718, 0.0180297, -0.00207136, -0.0798278) +transform = Transform3D(0.00371019, -0.00840171, -0.999958, 0.995584, -0.093771, 0.00448189, -0.0938046, -0.995558, 0.00801665, 0.0180297, -0.00207146, -0.0798279) bone_name = "RightMiddleProximal" bone_idx = 11 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/MiddleProximal" instance=ExtResource("1_hotic")] [node name="MiddleDistal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="9"] -transform = Transform3D(-0.00991634, -0.102648, -0.994668, 0.999283, -0.0373743, -0.0061054, -0.0365484, -0.994015, 0.102945, 0.012456, -0.0067641, -0.15594) +transform = Transform3D(-0.00991553, -0.102648, -0.994668, 0.999283, -0.0373749, -0.00610445, -0.036549, -0.994015, 0.102945, 0.0124561, -0.00676425, -0.15594) bone_name = "RightMiddleDistal" bone_idx = 13 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/MiddleDistal" instance=ExtResource("1_hotic")] [node name="MiddleTip" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="10"] -transform = Transform3D(-0.00151726, -0.400086, -0.916476, 0.999885, -0.0144084, 0.00463456, -0.0150593, -0.916364, 0.400062, 0.00955647, -0.00781982, -0.184018) +transform = Transform3D(-0.00151647, -0.400086, -0.916476, 0.999886, -0.0144087, 0.00463568, -0.0150599, -0.916364, 0.400062, 0.00955657, -0.00782, -0.184018) bone_name = "RightMiddleTip" bone_idx = 14 @@ -833,21 +682,21 @@ bone_idx = 14 mesh = SubResource("SphereMesh_l375f") [node name="RingProximal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="11"] -transform = Transform3D(0.0145049, 0.031703, -0.999392, 0.970672, -0.240321, 0.00646455, -0.23997, -0.970175, -0.0342591, 0.0126694, -0.0234518, -0.0731273) +transform = Transform3D(0.0145058, 0.0317035, -0.999392, 0.970672, -0.240322, 0.00646538, -0.239971, -0.970176, -0.0342598, 0.0126694, -0.0234519, -0.0731273) bone_name = "RightRingProximal" bone_idx = 16 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/RingProximal" instance=ExtResource("1_hotic")] [node name="RingDistal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="12"] -transform = Transform3D(-0.0494087, -0.143267, -0.98845, 0.976848, -0.213183, -0.0179297, -0.208152, -0.966451, 0.150483, 0.00945323, -0.0387602, -0.138118) +transform = Transform3D(-0.0494078, -0.143267, -0.98845, 0.976848, -0.213184, -0.0179288, -0.208153, -0.966451, 0.150483, 0.00945331, -0.0387603, -0.138118) bone_name = "RightRingDistal" bone_idx = 18 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/RingDistal" instance=ExtResource("1_hotic")] [node name="RingTip" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="13"] -transform = Transform3D(-0.0185268, -0.404878, -0.914183, 0.986399, -0.156755, 0.0494341, -0.163318, -0.900834, 0.402275, 0.00473959, -0.0457741, -0.169915) +transform = Transform3D(-0.018526, -0.404877, -0.914183, 0.986399, -0.156756, 0.0494352, -0.163319, -0.900834, 0.402275, 0.00473968, -0.0457743, -0.169915) bone_name = "RightRingTip" bone_idx = 19 @@ -855,21 +704,21 @@ bone_idx = 19 mesh = SubResource("SphereMesh_l375f") [node name="PinkyProximal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="14"] -transform = Transform3D(0.00766499, -0.045248, -0.998946, 0.935528, -0.352493, 0.0231448, -0.353169, -0.93472, 0.039629, 0.0037233, -0.0418705, -0.0644819) +transform = Transform3D(0.00766593, -0.0452478, -0.998946, 0.935528, -0.352494, 0.0231457, -0.35317, -0.93472, 0.0396283, 0.00372333, -0.0418707, -0.0644819) bone_name = "RightLittleProximal" bone_idx = 21 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/PinkyProximal" instance=ExtResource("1_hotic")] [node name="PinkyDistal" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="15"] -transform = Transform3D(-0.0810786, -0.289735, -0.953666, 0.955747, -0.294077, 0.00808847, -0.282795, -0.910808, 0.300757, -0.00223823, -0.0582203, -0.111493) +transform = Transform3D(-0.0810777, -0.289735, -0.953667, 0.955747, -0.294077, 0.00808961, -0.282796, -0.910809, 0.300757, -0.0022382, -0.0582204, -0.111492) bone_name = "RightLittleDistal" bone_idx = 23 [node name="Axis" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D/PinkyDistal" instance=ExtResource("1_hotic")] [node name="PinkyTip" type="BoneAttachment3D" parent="XROrigin3D/RightTrackedHand/RightHandHumanoid2/RightHandHumanoid/Skeleton3D" index="16"] -transform = Transform3D(-0.0340046, -0.359157, -0.932657, 0.961705, -0.265706, 0.067257, -0.271969, -0.894654, 0.354438, -0.00791415, -0.0639813, -0.129335) +transform = Transform3D(-0.0340036, -0.359157, -0.932658, 0.961705, -0.265707, 0.0672583, -0.27197, -0.894654, 0.354438, -0.00791412, -0.0639814, -0.129335) bone_name = "RightLittleTip" bone_idx = 24