Skip to content

Commit

Permalink
Adding hand tracking support
Browse files Browse the repository at this point in the history
  • Loading branch information
BastiaanOlij committed Jan 8, 2021
1 parent 15d0abb commit 6f27b6e
Show file tree
Hide file tree
Showing 23 changed files with 1,531 additions and 31 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ OpenXR on desktop PCs usually requires using a loader provided by Khronos, you c
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.

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

### Compiling the plugin
If everything is in place compiling should be pretty straight forward
Expand Down
17 changes: 14 additions & 3 deletions demo/Main.tscn
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
[gd_scene load_steps=7 format=2]
[gd_scene load_steps=9 format=2]

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

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

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

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

[node name="MeshInstance2" type="MeshInstance" parent="FPSController/RightHand" index="0"]
[node name="MeshInstance2" type="MeshInstance" parent="FPSController/RightHandController" index="0"]
visible = false
mesh = SubResource( 2 )
material/0 = null

[node name="Left_hand" parent="FPSController" instance=ExtResource( 5 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 1, -0.5 )

[node name="Right_hand" parent="FPSController" instance=ExtResource( 6 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 1, -0.5 )

[node name="Table" parent="." instance=ExtResource( 3 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -6 )

Expand Down
8 changes: 8 additions & 0 deletions demo/addons/godot-openxr/OpenXRHand.gdns
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[gd_resource type="NativeScript" load_steps=2 format=2]

[ext_resource path="res://addons/godot-openxr/godot_openxr.gdnlib" type="GDNativeLibrary" id=1]

[resource]
resource_name = "OpenXRHand"
class_name = "OpenXRHand"
library = ExtResource( 1 )
8 changes: 8 additions & 0 deletions demo/addons/godot-openxr/OpenXRPose.gdns
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[gd_resource type="NativeScript" load_steps=2 format=2]

[ext_resource path="res://addons/godot-openxr/godot_openxr.gdnlib" type="GDNativeLibrary" id=1]

[resource]
resource_name = "OpenXRPose"
class_name = "OpenXRPose"
library = ExtResource( 1 )
8 changes: 8 additions & 0 deletions demo/addons/godot-openxr/OpenXRSkeleton.gdns
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[gd_resource type="NativeScript" load_steps=2 format=2]

[ext_resource path="res://addons/godot-openxr/godot_openxr.gdnlib" type="GDNativeLibrary" id=1]

[resource]
resource_name = "OpenXRSkeleton"
class_name = "OpenXRSkeleton"
library = ExtResource( 1 )
55 changes: 55 additions & 0 deletions demo/addons/godot-openxr/scenes/bone_material.tres
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
[gd_resource type="SpatialMaterial" format=2]

[resource]

resource_name = "Bone material"
render_priority = 0
flags_transparent = false
flags_unshaded = false
flags_vertex_lighting = false
flags_no_depth_test = false
flags_use_point_size = false
flags_world_triplanar = false
flags_fixed_size = false
flags_albedo_tex_force_srgb = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_specular_mode = 0
params_blend_mode = 0
params_cull_mode = 0
params_depth_draw_mode = 0
params_line_width = 1.0
params_point_size = 1.0
params_billboard_mode = 0
params_grow = false
params_use_alpha_scissor = false
albedo_color = Color( 1, 1, 1, 1 )
metallic = 0.0
metallic_specular = 0.5
metallic_texture_channel = 0
roughness = 0.7
roughness_texture_channel = 0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
depth_enabled = false
subsurf_scatter_enabled = false
transmission_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector3( 1, 1, 1 )
uv1_offset = Vector3( 0, 0, 0 )
uv1_triplanar = false
uv1_triplanar_sharpness = 1.0
uv2_scale = Vector3( 1, 1, 1 )
uv2_offset = Vector3( 0, 0, 0 )
uv2_triplanar = false
uv2_triplanar_sharpness = 1.0
proximity_fade_enable = false
distance_fade_enable = false
_sections_unfolded = [ "Albedo", "Resource", "Roughness" ]

55 changes: 55 additions & 0 deletions demo/addons/godot-openxr/scenes/center_ball_material.tres
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
[gd_resource type="SpatialMaterial" format=2]

[resource]

resource_name = "Center ball"
render_priority = 0
flags_transparent = false
flags_unshaded = false
flags_vertex_lighting = false
flags_no_depth_test = false
flags_use_point_size = false
flags_world_triplanar = false
flags_fixed_size = false
flags_albedo_tex_force_srgb = false
vertex_color_use_as_albedo = false
vertex_color_is_srgb = false
params_diffuse_mode = 0
params_specular_mode = 0
params_blend_mode = 0
params_cull_mode = 0
params_depth_draw_mode = 0
params_line_width = 1.0
params_point_size = 1.0
params_billboard_mode = 0
params_grow = false
params_use_alpha_scissor = false
albedo_color = Color( 0.949219, 0.241013, 0.241013, 1 )
metallic = 0.7
metallic_specular = 0.5
metallic_texture_channel = 0
roughness = 0.0
roughness_texture_channel = 0
emission_enabled = false
normal_enabled = false
rim_enabled = false
clearcoat_enabled = false
anisotropy_enabled = false
ao_enabled = false
depth_enabled = false
subsurf_scatter_enabled = false
transmission_enabled = false
refraction_enabled = false
detail_enabled = false
uv1_scale = Vector3( 1, 1, 1 )
uv1_offset = Vector3( 0, 0, 0 )
uv1_triplanar = false
uv1_triplanar_sharpness = 1.0
uv2_scale = Vector3( 1, 1, 1 )
uv2_offset = Vector3( 0, 0, 0 )
uv2_triplanar = false
uv2_triplanar_sharpness = 1.0
proximity_fade_enable = false
distance_fade_enable = false
_sections_unfolded = [ "Albedo", "Metallic", "Resource" ]

Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ func initialise() -> bool:
# increase our physics engine update speed
Engine.iterations_per_second = 144

# $Left_hand.set_physics_process(true)
return true
else:
return false
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8, 0 )
fov = 65.0
near = 0.1

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

[node name="RightHand" type="ARVRController" parent="."]
[node name="RightHandController" type="ARVRController" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 1, -0.5 )
controller_id = 2
32 changes: 32 additions & 0 deletions demo/addons/godot-openxr/scenes/hand.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
extends Spatial

####################################################################################
# and some process logic to make our hands work

func update_lengths():
# this probably is only needed once after tracking has been on for a few frames but...
for d in range(0,5):
# our 5 root nodes should be our 5 fingers
var finger = get_child(d)
if finger and finger.get_child_count() >= 2:
# our first node is our joint, and our second joint is the bone to that joint
var joint = finger.get_child(0)
var bone = finger.get_child(1)
while joint and bone:
var bone_len = joint.translation.length()

# use scale and translation to place our bone
bone.scale = Vector3(1.0, bone_len, 1.0)
bone.translation = Vector3(0.0, 0.0, -bone_len / 2.0)

if joint.get_child_count() >= 2:
bone = joint.get_child(1)
joint = joint.get_child(0)
else:
# the end...
joint = null
bone = null

func _physics_process(delta):
# (we do this in physics because OpenXR updates positions in physics)
update_lengths()
Loading

0 comments on commit 6f27b6e

Please sign in to comment.