Skip to content

Commit 6f27b6e

Browse files
committed
Adding hand tracking support
1 parent 15d0abb commit 6f27b6e

23 files changed

+1531
-31
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ OpenXR on desktop PCs usually requires using a loader provided by Khronos, you c
5555
On Linux the loader and include files should be installed system wide via package manager (or manually) within the `/usr` folder structure and they should be picked up automatically.
5656

5757
On Windows a precompiled version of the loaded can be found in `openxr_loader_windows`, currently only the x86 version is used.
58+
You can download the latest version from: https://github.com/KhronosGroup/OpenXR-SDK/releases
5859

5960
### Compiling the plugin
6061
If everything is in place compiling should be pretty straight forward

demo/Main.tscn

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
[gd_scene load_steps=7 format=2]
1+
[gd_scene load_steps=9 format=2]
22

33
[ext_resource path="res://Main.gd" type="Script" id=1]
44
[ext_resource path="res://Ground.tscn" type="PackedScene" id=2]
55
[ext_resource path="res://Table.tscn" type="PackedScene" id=3]
66
[ext_resource path="res://addons/godot-openxr/scenes/first_person_controller_vr.tscn" type="PackedScene" id=4]
7+
[ext_resource path="res://addons/godot-openxr/scenes/left_hand.tscn" type="PackedScene" id=5]
8+
[ext_resource path="res://addons/godot-openxr/scenes/right_hand.tscn" type="PackedScene" id=6]
79

810
[sub_resource type="CubeMesh" id=1]
911
size = Vector3( 0.1, 0.5, 0.1 )
@@ -22,14 +24,23 @@ directional_shadow_max_distance = 20.0
2224

2325
[node name="FPSController" parent="." instance=ExtResource( 4 )]
2426

25-
[node name="MeshInstance" type="MeshInstance" parent="FPSController/LeftHand" index="0"]
27+
[node name="MeshInstance" type="MeshInstance" parent="FPSController/LeftHandController" index="0"]
28+
transform = Transform( 1, 2.98023e-08, 0, 0, 1, -2.98023e-08, 0, -2.98023e-08, 1, -1.90735e-06, 0, 0 )
29+
visible = false
2630
mesh = SubResource( 1 )
2731
material/0 = null
2832

29-
[node name="MeshInstance2" type="MeshInstance" parent="FPSController/RightHand" index="0"]
33+
[node name="MeshInstance2" type="MeshInstance" parent="FPSController/RightHandController" index="0"]
34+
visible = false
3035
mesh = SubResource( 2 )
3136
material/0 = null
3237

38+
[node name="Left_hand" parent="FPSController" instance=ExtResource( 5 )]
39+
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 1, -0.5 )
40+
41+
[node name="Right_hand" parent="FPSController" instance=ExtResource( 6 )]
42+
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 1, -0.5 )
43+
3344
[node name="Table" parent="." instance=ExtResource( 3 )]
3445
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -6 )
3546

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[gd_resource type="NativeScript" load_steps=2 format=2]
2+
3+
[ext_resource path="res://addons/godot-openxr/godot_openxr.gdnlib" type="GDNativeLibrary" id=1]
4+
5+
[resource]
6+
resource_name = "OpenXRHand"
7+
class_name = "OpenXRHand"
8+
library = ExtResource( 1 )
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[gd_resource type="NativeScript" load_steps=2 format=2]
2+
3+
[ext_resource path="res://addons/godot-openxr/godot_openxr.gdnlib" type="GDNativeLibrary" id=1]
4+
5+
[resource]
6+
resource_name = "OpenXRPose"
7+
class_name = "OpenXRPose"
8+
library = ExtResource( 1 )
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[gd_resource type="NativeScript" load_steps=2 format=2]
2+
3+
[ext_resource path="res://addons/godot-openxr/godot_openxr.gdnlib" type="GDNativeLibrary" id=1]
4+
5+
[resource]
6+
resource_name = "OpenXRSkeleton"
7+
class_name = "OpenXRSkeleton"
8+
library = ExtResource( 1 )
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
[gd_resource type="SpatialMaterial" format=2]
2+
3+
[resource]
4+
5+
resource_name = "Bone material"
6+
render_priority = 0
7+
flags_transparent = false
8+
flags_unshaded = false
9+
flags_vertex_lighting = false
10+
flags_no_depth_test = false
11+
flags_use_point_size = false
12+
flags_world_triplanar = false
13+
flags_fixed_size = false
14+
flags_albedo_tex_force_srgb = false
15+
vertex_color_use_as_albedo = false
16+
vertex_color_is_srgb = false
17+
params_diffuse_mode = 0
18+
params_specular_mode = 0
19+
params_blend_mode = 0
20+
params_cull_mode = 0
21+
params_depth_draw_mode = 0
22+
params_line_width = 1.0
23+
params_point_size = 1.0
24+
params_billboard_mode = 0
25+
params_grow = false
26+
params_use_alpha_scissor = false
27+
albedo_color = Color( 1, 1, 1, 1 )
28+
metallic = 0.0
29+
metallic_specular = 0.5
30+
metallic_texture_channel = 0
31+
roughness = 0.7
32+
roughness_texture_channel = 0
33+
emission_enabled = false
34+
normal_enabled = false
35+
rim_enabled = false
36+
clearcoat_enabled = false
37+
anisotropy_enabled = false
38+
ao_enabled = false
39+
depth_enabled = false
40+
subsurf_scatter_enabled = false
41+
transmission_enabled = false
42+
refraction_enabled = false
43+
detail_enabled = false
44+
uv1_scale = Vector3( 1, 1, 1 )
45+
uv1_offset = Vector3( 0, 0, 0 )
46+
uv1_triplanar = false
47+
uv1_triplanar_sharpness = 1.0
48+
uv2_scale = Vector3( 1, 1, 1 )
49+
uv2_offset = Vector3( 0, 0, 0 )
50+
uv2_triplanar = false
51+
uv2_triplanar_sharpness = 1.0
52+
proximity_fade_enable = false
53+
distance_fade_enable = false
54+
_sections_unfolded = [ "Albedo", "Resource", "Roughness" ]
55+
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
[gd_resource type="SpatialMaterial" format=2]
2+
3+
[resource]
4+
5+
resource_name = "Center ball"
6+
render_priority = 0
7+
flags_transparent = false
8+
flags_unshaded = false
9+
flags_vertex_lighting = false
10+
flags_no_depth_test = false
11+
flags_use_point_size = false
12+
flags_world_triplanar = false
13+
flags_fixed_size = false
14+
flags_albedo_tex_force_srgb = false
15+
vertex_color_use_as_albedo = false
16+
vertex_color_is_srgb = false
17+
params_diffuse_mode = 0
18+
params_specular_mode = 0
19+
params_blend_mode = 0
20+
params_cull_mode = 0
21+
params_depth_draw_mode = 0
22+
params_line_width = 1.0
23+
params_point_size = 1.0
24+
params_billboard_mode = 0
25+
params_grow = false
26+
params_use_alpha_scissor = false
27+
albedo_color = Color( 0.949219, 0.241013, 0.241013, 1 )
28+
metallic = 0.7
29+
metallic_specular = 0.5
30+
metallic_texture_channel = 0
31+
roughness = 0.0
32+
roughness_texture_channel = 0
33+
emission_enabled = false
34+
normal_enabled = false
35+
rim_enabled = false
36+
clearcoat_enabled = false
37+
anisotropy_enabled = false
38+
ao_enabled = false
39+
depth_enabled = false
40+
subsurf_scatter_enabled = false
41+
transmission_enabled = false
42+
refraction_enabled = false
43+
detail_enabled = false
44+
uv1_scale = Vector3( 1, 1, 1 )
45+
uv1_offset = Vector3( 0, 0, 0 )
46+
uv1_triplanar = false
47+
uv1_triplanar_sharpness = 1.0
48+
uv2_scale = Vector3( 1, 1, 1 )
49+
uv2_offset = Vector3( 0, 0, 0 )
50+
uv2_triplanar = false
51+
uv2_triplanar_sharpness = 1.0
52+
proximity_fade_enable = false
53+
distance_fade_enable = false
54+
_sections_unfolded = [ "Albedo", "Metallic", "Resource" ]
55+

demo/addons/godot-openxr/scenes/first_person_controller_vr.gd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ func initialise() -> bool:
1313
# increase our physics engine update speed
1414
Engine.iterations_per_second = 144
1515

16+
# $Left_hand.set_physics_process(true)
1617
return true
1718
else:
1819
return false

demo/addons/godot-openxr/scenes/first_person_controller_vr.tscn

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8, 0 )
1010
fov = 65.0
1111
near = 0.1
1212

13-
[node name="LeftHand" type="ARVRController" parent="."]
13+
[node name="LeftHandController" type="ARVRController" parent="."]
1414
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 1, -0.5 )
1515

16-
[node name="RightHand" type="ARVRController" parent="."]
16+
[node name="RightHandController" type="ARVRController" parent="."]
1717
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 1, -0.5 )
1818
controller_id = 2
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
extends Spatial
2+
3+
####################################################################################
4+
# and some process logic to make our hands work
5+
6+
func update_lengths():
7+
# this probably is only needed once after tracking has been on for a few frames but...
8+
for d in range(0,5):
9+
# our 5 root nodes should be our 5 fingers
10+
var finger = get_child(d)
11+
if finger and finger.get_child_count() >= 2:
12+
# our first node is our joint, and our second joint is the bone to that joint
13+
var joint = finger.get_child(0)
14+
var bone = finger.get_child(1)
15+
while joint and bone:
16+
var bone_len = joint.translation.length()
17+
18+
# use scale and translation to place our bone
19+
bone.scale = Vector3(1.0, bone_len, 1.0)
20+
bone.translation = Vector3(0.0, 0.0, -bone_len / 2.0)
21+
22+
if joint.get_child_count() >= 2:
23+
bone = joint.get_child(1)
24+
joint = joint.get_child(0)
25+
else:
26+
# the end...
27+
joint = null
28+
bone = null
29+
30+
func _physics_process(delta):
31+
# (we do this in physics because OpenXR updates positions in physics)
32+
update_lengths()

0 commit comments

Comments
 (0)