Skip to content

Commit a36ac79

Browse files
Update Physics Movement to v0.2.0:
- updated project to Godot v4.2 - player rotation moved to _physics_process and fixed visual glitching - extended thrusters to work in 4 directions and moved controls to left joystick - added thrusters brake - created custom OpenXR action map with Touch controller bindings - added finger micromovement: fingers now wiggle a little when hand is moving - updated project to work properly on Meta Quest 3: increased physics tick rate to 144Hz, disabled v-sync and switched WorldEnvironment from clear color to procedural sky in example scenes
1 parent 42a4bfd commit a36ac79

File tree

14 files changed

+383
-928
lines changed

14 files changed

+383
-928
lines changed

README.MD

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ Physics-based XR movement. Player hands collide with environment and can grab or
1717
- Fingers curl around grabbed objects geometry
1818
- Players can move themselves by pushing away from objects
1919
- Heavier objects allow for stronger push
20-
- Players can move in space with thrusters (button activated)
20+
- Players can move in space with thrusters
21+
- Players can brake in space with thruster brake
2122
- Players can hit objects with their head and push themselves away
2223
- Ghost hand appears when controller hand gets far from physics one
24+
- Physics hand is teleported to controller position if it gets too far from it (ex. hand got stuck)
2325
- Body snap rotation
2426
- Body XYZ rotation around static object using hands (trigger activated)
27+
- Fingers wiggle a little when hand is moving
2528

2629
[Read more](/addons/xr-kit/physics-movement/)
2730

@@ -92,6 +95,7 @@ For plugin to be fully compatible with all OpenXR runtimes, it needs hand models
9295

9396
| Headset | Runtime | Compatible |
9497
|---|---|:---:|
98+
| Meta Quest 3 | SteamVR | Yes |
9599
| HP Reverb G2 | SteamVR | Yes |
96100
| Pico 4 | Standalone | No hand tracking |
97101
| Meta Quest 2 | Standalone | Hand tracking only (no controllers)

addons/xr-kit/README.MD

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ Physics-based XR movement. Player hands collide with environment and can grab or
1717
- Fingers curl around grabbed objects geometry
1818
- Players can move themselves by pushing away from objects
1919
- Heavier objects allow for stronger push
20-
- Players can move in space with thrusters (button activated)
20+
- Players can move in space with thrusters
21+
- Players can brake in space with thruster brake
2122
- Players can hit objects with their head and push themselves away
2223
- Ghost hand appears when controller hand gets far from physics one
24+
- Physics hand is teleported to controller position if it gets too far from it (ex. hand got stuck)
2325
- Body snap rotation
2426
- Body XYZ rotation around static object using hands (trigger activated)
27+
- Fingers wiggle a little when hand is moving
2528

2629
[Read more](/addons/xr-kit/physics-movement/)
2730

@@ -74,7 +77,7 @@ Smooth VR preview for recording in native monitor resolution.
7477

7578
## Getting started
7679

77-
Repository contains Godot 4.0.2 project with XR and main scene preconfigured. Releases are reduced to addon files only.
80+
Repository contains Godot 4.2 project with XR and main scene preconfigured. Releases are reduced to addon files only.
7881

7982
Latest release is available in Godot's Asset Library under the name [XR Kit](https://godotengine.org/asset-library/asset/1870) or on [releases page](https://github.com/patrykkalinowski/godot-xr-kit/releases/latest).
8083

@@ -92,6 +95,7 @@ For plugin to be fully compatible with all OpenXR runtimes, it needs hand models
9295

9396
| Headset | Runtime | Compatible |
9497
|---|---|:---:|
98+
| Meta Quest 3 | SteamVR | Yes |
9599
| HP Reverb G2 | SteamVR | Yes |
96100
| Pico 4 | Standalone | No hand tracking |
97101
| Meta Quest 2 | Standalone | Hand tracking only (no controllers)

addons/xr-kit/examples/playground.tscn

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
[gd_scene load_steps=12 format=3 uid="uid://b5lkb7q5glrr1"]
1+
[gd_scene load_steps=14 format=3 uid="uid://b5lkb7q5glrr1"]
22

33
[ext_resource type="PackedScene" uid="uid://kl4nx8ivav56" path="res://addons/xr-kit/physics-movement/scenes/player.tscn" id="1_4muep"]
44

5+
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_bcjol"]
6+
7+
[sub_resource type="Sky" id="Sky_atmsh"]
8+
sky_material = SubResource("ProceduralSkyMaterial_bcjol")
9+
510
[sub_resource type="Environment" id="Environment_64oha"]
6-
ambient_light_source = 2
7-
ambient_light_color = Color(1, 1, 1, 1)
8-
ambient_light_energy = 0.2
11+
background_mode = 2
12+
sky = SubResource("Sky_atmsh")
913

1014
[sub_resource type="BoxShape3D" id="BoxShape3D_5q7sa"]
1115
size = Vector3(0.3, 0.3, 0.3)
@@ -191,8 +195,10 @@ text = "Static
191195
[node name="Label3D" type="Label3D" parent="."]
192196
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.658925, -1.49391)
193197
pixel_size = 0.001
194-
text = "Press B/Y and A/X keys on controller to enable thrusters and move in space
198+
alpha_antialiasing_mode = 1
199+
texture_filter = 5
200+
text = "Move left joystick on controller to enable thrusters and move in space. Click joystick to brake.
195201
196-
Try grabbing objects with different weights and see how they influence your movement
202+
Try grabbing objects with different weights and see how they influence your movement.
197203
198-
Grab static object and hold trigger to rotate around it in XYZ axis. Try with two hands, too"
204+
Grab static object and hold trigger to rotate around it in XYZ axis. Try with two hands, too."

addons/xr-kit/examples/smooth_input_filter.tscn

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[gd_scene load_steps=14 format=3 uid="uid://b700ov8sanfbn"]
1+
[gd_scene load_steps=16 format=3 uid="uid://b700ov8sanfbn"]
22

33
[ext_resource type="Script" path="res://addons/xr-kit/physics-movement/scripts/player.gd" id="1_egmgq"]
44
[ext_resource type="PackedScene" uid="uid://dqnmcsaa6hvy3" path="res://addons/xr-kit/smooth-input-filter/scenes/smooth_open_xr_hand.tscn" id="5_2qybv"]
@@ -261,7 +261,14 @@ _surfaces = [{
261261
}]
262262
blend_shape_mode = 0
263263

264+
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_qpdn8"]
265+
266+
[sub_resource type="Sky" id="Sky_554u1"]
267+
sky_material = SubResource("ProceduralSkyMaterial_qpdn8")
268+
264269
[sub_resource type="Environment" id="Environment_xj8r2"]
270+
background_mode = 2
271+
sky = SubResource("Sky_554u1")
265272

266273
[node name="Player" type="Node3D" node_paths=PackedStringArray("origin", "camera")]
267274
script = ExtResource("1_egmgq")
@@ -282,13 +289,7 @@ tracker = &"left_hand"
282289
tracker = &"right_hand"
283290

284291
[node name="OpenXRHand Left" type="OpenXRHand" parent="XROrigin3D"]
285-
_import_path = NodePath("")
286-
unique_name_in_owner = false
287-
process_mode = 0
288-
process_priority = 0
289-
editor_description = ""
290292
hand_skeleton = NodePath("Skeleton3D")
291-
script = null
292293

293294
[node name="Skeleton3D" type="Skeleton3D" parent="XROrigin3D/OpenXRHand Left"]
294295
bones/0/name = "Wrist_L"
@@ -674,14 +675,8 @@ mesh = SubResource("ArrayMesh_j33p5")
674675
skin = SubResource("Skin_lvfor")
675676

676677
[node name="OpenXRHand Right" type="OpenXRHand" parent="XROrigin3D"]
677-
_import_path = NodePath("")
678-
unique_name_in_owner = false
679-
process_mode = 0
680-
process_priority = 0
681-
editor_description = ""
682678
hand = 1
683679
hand_skeleton = NodePath("Skeleton3D")
684-
script = null
685680

686681
[node name="Skeleton3D" type="Skeleton3D" parent="XROrigin3D/OpenXRHand Right"]
687682
bones/0/name = "Wrist_R"

addons/xr-kit/physics-movement/README.MD

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@ Scripts and scenes for physics-based XR movement. Player hands collide with envi
1515
- Fingers curl around grabbed objects geometry
1616
- Players can move themselves by pushing away from objects
1717
- Heavier objects allow for stronger push
18-
- Players can move in space with thrusters (button activated)
18+
- Players can move in space with thrusters
19+
- Players can brake in space with thruster brake
1920
- Players can hit objects with their head and push themselves away
2021
- Ghost hand appears when controller hand gets far from physics one
22+
- Physics hand is teleported to controller position if it gets too far from it (ex. hand got stuck)
2123
- Body snap rotation
2224
- Body XYZ rotation around static object using hands (trigger activated)
25+
- Fingers wiggle a little when hand is moving
2326

2427
## How does it work
2528

@@ -34,6 +37,8 @@ Provided hand models use OpenXR convention of 26 joints for hand tracking: 4 joi
3437
![OpenXR Hands](/screenshots/openxr_hands.png)
3538
*Source: https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#_conventions_of_hand_joints*
3639

40+
Custom OpenXR Action Map is provided for control scheme used by Physics Movement, you can find it in `addons/xr-kit/physics-movement` folder.
41+
3742
## Getting started
3843

3944
`/addons/xr-kit/physics_movement/scenes/player.tscn` contains everything needed for physics movement, including XR interface initialization.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
[gd_resource type="OpenXRActionMap" load_steps=19 format=3 uid="uid://5b4j7sj3746e"]
2+
3+
[sub_resource type="OpenXRAction" id="OpenXRAction_ug10a"]
4+
resource_name = "trigger"
5+
localized_name = "Trigger"
6+
toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right")
7+
8+
[sub_resource type="OpenXRAction" id="OpenXRAction_ikrgt"]
9+
resource_name = "thruster"
10+
localized_name = "Thruster"
11+
action_type = 2
12+
toplevel_paths = PackedStringArray("/user/hand/left")
13+
14+
[sub_resource type="OpenXRAction" id="OpenXRAction_mrsxk"]
15+
resource_name = "grip"
16+
localized_name = "Grip"
17+
toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right")
18+
19+
[sub_resource type="OpenXRAction" id="OpenXRAction_358r6"]
20+
resource_name = "thruster_brake"
21+
localized_name = "Thruster Brake"
22+
action_type = 0
23+
toplevel_paths = PackedStringArray("/user/hand/left")
24+
25+
[sub_resource type="OpenXRAction" id="OpenXRAction_301i5"]
26+
resource_name = "rotate"
27+
localized_name = "Rotate"
28+
action_type = 2
29+
toplevel_paths = PackedStringArray("/user/hand/right")
30+
31+
[sub_resource type="OpenXRAction" id="OpenXRAction_lfmcc"]
32+
resource_name = "grip_click"
33+
localized_name = "Grip Click"
34+
action_type = 0
35+
toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right")
36+
37+
[sub_resource type="OpenXRAction" id="OpenXRAction_3j8lo"]
38+
resource_name = "trigger_click"
39+
localized_name = "Trigger Click"
40+
action_type = 0
41+
toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right")
42+
43+
[sub_resource type="OpenXRAction" id="OpenXRAction_qggp4"]
44+
resource_name = "free_rotation"
45+
localized_name = "Rotate freely while holding an object"
46+
action_type = 0
47+
toplevel_paths = PackedStringArray("/user/hand/left", "/user/hand/right")
48+
49+
[sub_resource type="OpenXRActionSet" id="OpenXRActionSet_mhyx4"]
50+
resource_name = "xrkit"
51+
localized_name = "XR Kit Action Set"
52+
actions = [SubResource("OpenXRAction_ug10a"), SubResource("OpenXRAction_ikrgt"), SubResource("OpenXRAction_mrsxk"), SubResource("OpenXRAction_358r6"), SubResource("OpenXRAction_301i5"), SubResource("OpenXRAction_lfmcc"), SubResource("OpenXRAction_3j8lo"), SubResource("OpenXRAction_qggp4")]
53+
54+
[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_rytyh"]
55+
action = SubResource("OpenXRAction_ikrgt")
56+
paths = PackedStringArray("/user/hand/left/input/thumbstick")
57+
58+
[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_0dw4u"]
59+
action = SubResource("OpenXRAction_358r6")
60+
paths = PackedStringArray("/user/hand/left/input/thumbstick/click")
61+
62+
[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ubj08"]
63+
action = SubResource("OpenXRAction_301i5")
64+
paths = PackedStringArray("/user/hand/right/input/thumbstick")
65+
66+
[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_icpc6"]
67+
action = SubResource("OpenXRAction_ug10a")
68+
paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value")
69+
70+
[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_bmyjf"]
71+
action = SubResource("OpenXRAction_mrsxk")
72+
paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value")
73+
74+
[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_dsmkp"]
75+
action = SubResource("OpenXRAction_lfmcc")
76+
paths = PackedStringArray("/user/hand/left/input/squeeze/value", "/user/hand/right/input/squeeze/value")
77+
78+
[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_ghpoo"]
79+
action = SubResource("OpenXRAction_3j8lo")
80+
paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value")
81+
82+
[sub_resource type="OpenXRIPBinding" id="OpenXRIPBinding_vorgf"]
83+
action = SubResource("OpenXRAction_qggp4")
84+
paths = PackedStringArray("/user/hand/left/input/trigger/value", "/user/hand/right/input/trigger/value")
85+
86+
[sub_resource type="OpenXRInteractionProfile" id="OpenXRInteractionProfile_i6s3d"]
87+
interaction_profile_path = "/interaction_profiles/oculus/touch_controller"
88+
bindings = [SubResource("OpenXRIPBinding_rytyh"), SubResource("OpenXRIPBinding_0dw4u"), SubResource("OpenXRIPBinding_ubj08"), SubResource("OpenXRIPBinding_icpc6"), SubResource("OpenXRIPBinding_bmyjf"), SubResource("OpenXRIPBinding_dsmkp"), SubResource("OpenXRIPBinding_ghpoo"), SubResource("OpenXRIPBinding_vorgf")]
89+
90+
[resource]
91+
action_sets = [SubResource("OpenXRActionSet_mhyx4")]
92+
interaction_profiles = [SubResource("OpenXRInteractionProfile_i6s3d")]

addons/xr-kit/physics-movement/scenes/player.tscn

Lines changed: 83 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -495,13 +495,13 @@ collision_layer = 2048
495495
collision_mask = 3585
496496
mass = 10.0
497497
gravity_scale = 0.0
498+
can_sleep = false
499+
freeze = true
500+
freeze_mode = 1
498501
custom_integrator = true
499502
continuous_cd = true
500503
max_contacts_reported = 1
501504
contact_monitor = true
502-
can_sleep = false
503-
freeze = true
504-
freeze_mode = 1
505505
script = ExtResource("3_ecrt7")
506506
body = NodePath("../../..")
507507
camera = NodePath("..")
@@ -1136,12 +1136,47 @@ bones/25/scale = Vector3(1, 1, 1)
11361136
mesh = SubResource("ArrayMesh_u3sx3")
11371137
skin = SubResource("Skin_v5ql8")
11381138

1139+
[node name="ThumbFingerIK" type="SkeletonIK3D" parent="PhysicsHandLeft/Skeleton3D"]
1140+
process_priority = 1
1141+
root_bone = &"Thumb_Proximal_L"
1142+
tip_bone = &"Thumb_Tip_L"
1143+
override_tip_basis = false
1144+
min_distance = 0.001
1145+
1146+
[node name="IndexFingerIK" type="SkeletonIK3D" parent="PhysicsHandLeft/Skeleton3D"]
1147+
process_priority = 1
1148+
root_bone = &"Index_Proximal_L"
1149+
tip_bone = &"Index_Tip_L"
1150+
override_tip_basis = false
1151+
min_distance = 0.001
1152+
1153+
[node name="MiddleFingerIK" type="SkeletonIK3D" parent="PhysicsHandLeft/Skeleton3D"]
1154+
process_priority = 1
1155+
root_bone = &"Middle_Proximal_L"
1156+
tip_bone = &"Middle_Tip_L"
1157+
override_tip_basis = false
1158+
min_distance = 0.001
1159+
1160+
[node name="RingFingerIK" type="SkeletonIK3D" parent="PhysicsHandLeft/Skeleton3D"]
1161+
process_priority = 1
1162+
root_bone = &"Ring_Proximal_L"
1163+
tip_bone = &"Ring_Tip_L"
1164+
override_tip_basis = false
1165+
min_distance = 0.001
1166+
1167+
[node name="LittleFingerIK" type="SkeletonIK3D" parent="PhysicsHandLeft/Skeleton3D"]
1168+
process_priority = 1
1169+
root_bone = &"Little_Proximal_L"
1170+
tip_bone = &"Little_Tip_L"
1171+
override_tip_basis = false
1172+
min_distance = 0.001
1173+
11391174
[node name="PhysicsHandRight" type="RigidBody3D" parent="." node_paths=PackedStringArray("origin", "camera", "controller", "physics_skeleton", "controller_skeleton", "body", "controller_hand_mesh", "wrist_raycast", "wrist_joint")]
11401175
collision_layer = 1024
11411176
collision_mask = 513
11421177
gravity_scale = 0.0
1143-
continuous_cd = true
11441178
can_sleep = false
1179+
continuous_cd = true
11451180
script = ExtResource("10_7gjb2")
11461181
origin = NodePath("../Body/XROrigin3D")
11471182
camera = NodePath("../Body/XROrigin3D/XRCamera3D")
@@ -1355,12 +1390,50 @@ bones/25/scale = Vector3(1, 1, 1)
13551390
mesh = SubResource("ArrayMesh_8jodk")
13561391
skin = SubResource("Skin_n5id7")
13571392

1358-
[connection signal="button_pressed" from="Body/XROrigin3D/XRController3D Left" to="PhysicsHandLeft" method="_on_xr_controller_3d_button_pressed"]
1359-
[connection signal="button_released" from="Body/XROrigin3D/XRController3D Left" to="PhysicsHandLeft" method="_on_xr_controller_3d_button_released"]
1360-
[connection signal="turned" from="Body/XROrigin3D/XRController3D Left" to="Body" method="_on_turned"]
1361-
[connection signal="button_pressed" from="Body/XROrigin3D/XRController3D Right" to="PhysicsHandRight" method="_on_xr_controller_3d_button_pressed"]
1362-
[connection signal="button_released" from="Body/XROrigin3D/XRController3D Right" to="PhysicsHandRight" method="_on_xr_controller_3d_button_released"]
1363-
[connection signal="turned" from="Body/XROrigin3D/XRController3D Right" to="Body" method="_on_turned"]
1393+
[node name="ThumbFingerIK" type="SkeletonIK3D" parent="PhysicsHandRight/Skeleton3D"]
1394+
process_priority = 1
1395+
root_bone = &"Thumb_Metacarpal_R"
1396+
tip_bone = &"Thumb_Distal_R"
1397+
min_distance = 0.001
1398+
1399+
[node name="IndexFingerIK" type="SkeletonIK3D" parent="PhysicsHandRight/Skeleton3D"]
1400+
process_priority = 1
1401+
root_bone = &"Index_Metacarpal_R"
1402+
tip_bone = &"Index_Distal_R"
1403+
min_distance = 0.001
1404+
1405+
[node name="MiddleFingerIK" type="SkeletonIK3D" parent="PhysicsHandRight/Skeleton3D"]
1406+
process_priority = 1
1407+
root_bone = &"Middle_Metacarpal_R"
1408+
tip_bone = &"Middle_Distal_R"
1409+
min_distance = 0.001
1410+
1411+
[node name="RingFingerIK" type="SkeletonIK3D" parent="PhysicsHandRight/Skeleton3D"]
1412+
process_priority = 1
1413+
root_bone = &"Ring_Metacarpal_R"
1414+
tip_bone = &"Ring_Distal_R"
1415+
min_distance = 0.001
1416+
1417+
[node name="LittleFingerIK" type="SkeletonIK3D" parent="PhysicsHandRight/Skeleton3D"]
1418+
process_priority = 1
1419+
root_bone = &"Little_Metacarpal_R"
1420+
tip_bone = &"Little_Distal_R"
1421+
min_distance = 0.001
1422+
1423+
[connection signal="button_pressed" from="Body/XROrigin3D/XRController3D Left" to="Body/XROrigin3D/XRController3D Left" method="_on_button_pressed"]
1424+
[connection signal="button_released" from="Body/XROrigin3D/XRController3D Left" to="Body/XROrigin3D/XRController3D Left" method="_on_button_released"]
1425+
[connection signal="grab" from="Body/XROrigin3D/XRController3D Left" to="PhysicsHandLeft" method="_on_grab"]
1426+
[connection signal="input_vector2_changed" from="Body/XROrigin3D/XRController3D Left" to="Body/XROrigin3D/XRController3D Left" method="_on_input_vector_2_changed"]
1427+
[connection signal="thruster" from="Body/XROrigin3D/XRController3D Left" to="Body" method="_on_thruster"]
1428+
[connection signal="thruster_brake" from="Body/XROrigin3D/XRController3D Left" to="Body" method="_on_thruster_brake"]
1429+
[connection signal="turned_x" from="Body/XROrigin3D/XRController3D Left" to="Body" method="_on_turned_x"]
1430+
[connection signal="button_pressed" from="Body/XROrigin3D/XRController3D Right" to="Body/XROrigin3D/XRController3D Right" method="_on_button_pressed"]
1431+
[connection signal="button_released" from="Body/XROrigin3D/XRController3D Right" to="Body/XROrigin3D/XRController3D Right" method="_on_button_released"]
1432+
[connection signal="grab" from="Body/XROrigin3D/XRController3D Right" to="PhysicsHandRight" method="_on_grab"]
1433+
[connection signal="input_vector2_changed" from="Body/XROrigin3D/XRController3D Right" to="Body/XROrigin3D/XRController3D Right" method="_on_input_vector_2_changed"]
1434+
[connection signal="thruster" from="Body/XROrigin3D/XRController3D Right" to="Body" method="_on_thruster"]
1435+
[connection signal="thruster_brake" from="Body/XROrigin3D/XRController3D Right" to="Body" method="_on_thruster_brake"]
1436+
[connection signal="turned_x" from="Body/XROrigin3D/XRController3D Right" to="Body" method="_on_turned_x"]
13641437
[connection signal="new_pose" from="Body/XROrigin3D/OpenXRHand Left/HandPoseRecognition" to="PhysicsHandLeft" method="_on_hand_pose_recognition_new_pose"]
13651438
[connection signal="new_pose" from="Body/XROrigin3D/OpenXRHand Right/HandPoseRecognition" to="PhysicsHandRight" method="_on_hand_pose_recognition_new_pose"]
13661439
[connection signal="dropped_held_object" from="PhysicsHandLeft" to="Body" method="_on_hand_dropped_held_object"]

0 commit comments

Comments
 (0)