Skip to content

Commit d0aafbd

Browse files
committed
Adding HTC tracker support
1 parent 35b870b commit d0aafbd

20 files changed

+1109
-390
lines changed

Diff for: demo/Main.tscn

+32-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[gd_scene load_steps=29 format=2]
1+
[gd_scene load_steps=30 format=2]
22

33
[ext_resource path="res://Main.gd" type="Script" id=1]
44
[ext_resource path="res://scenes/Ground.tscn" type="PackedScene" id=2]
@@ -24,6 +24,7 @@
2424
[ext_resource path="res://scenes/BallCourt.tscn" type="PackedScene" id=22]
2525
[ext_resource path="res://addons/godot-openxr/scenes/controller.gd" type="Script" id=23]
2626
[ext_resource path="res://scenes/AimPointer.tscn" type="PackedScene" id=24]
27+
[ext_resource path="res://assets/htc/vr_tracker_vive_3_0/vr_tracker_vive_3_0.obj" type="ArrayMesh" id=25]
2728

2829
[sub_resource type="CapsuleMesh" id=1]
2930
radius = 0.1
@@ -139,6 +140,12 @@ material/0 = null
139140
[node name="LeftHand" parent="FPController" instance=ExtResource( 14 )]
140141
motion_range = 1
141142

143+
[node name="Skeleton" parent="FPController/LeftHand/HandModel/Armature001" index="0"]
144+
motion_range = 1
145+
146+
[node name="vr_glove_left_slim" parent="FPController/LeftHand/HandModel/Armature001/Skeleton" index="0"]
147+
material/0 = null
148+
142149
[node name="IndexTip" parent="FPController/LeftHand/HandModel/Armature001/Skeleton" index="1"]
143150
transform = Transform( 0.19221, -0.669965, -0.717079, 0.977075, 0.19881, 0.076153, 0.0915428, -0.715277, 0.692819, 0.0345973, 0.0355402, -0.164767 )
144151

@@ -151,6 +158,12 @@ material/0 = null
151158
motion_range = 1
152159
albedo_texture = ExtResource( 5 )
153160

161+
[node name="Skeleton" parent="FPController/RightHand/HandModel/Armature" index="0"]
162+
motion_range = 1
163+
164+
[node name="vr_glove_right_slim" parent="FPController/RightHand/HandModel/Armature/Skeleton" index="0"]
165+
material/0 = null
166+
154167
[node name="IndexTip" parent="FPController/RightHand/HandModel/Armature/Skeleton" index="1"]
155168
transform = Transform( 0.19221, 0.669966, 0.717078, -0.091543, -0.715277, 0.69282, 0.977075, -0.19881, -0.0761527, -0.0345978, -0.164767, -0.0355401 )
156169

@@ -203,6 +216,24 @@ show_target = true
203216
active_button = 7
204217
collide_with_areas = true
205218

219+
[node name="HTCTrackerCamera" parent="FPController" instance=ExtResource( 7 )]
220+
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0 )
221+
action = "godot/aim_pose"
222+
path = "/user/vive_tracker_htcx/role/camera"
223+
224+
[node name="MeshInstance" type="MeshInstance" parent="FPController/HTCTrackerCamera"]
225+
mesh = ExtResource( 25 )
226+
material/0 = null
227+
228+
[node name="HTCTrackerKeyboard" parent="FPController" instance=ExtResource( 7 )]
229+
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.3, 0 )
230+
action = "godot/aim_pose"
231+
path = "/user/vive_tracker_htcx/role/keyboard"
232+
233+
[node name="MeshInstance" type="MeshInstance" parent="FPController/HTCTrackerKeyboard"]
234+
mesh = ExtResource( 25 )
235+
material/0 = null
236+
206237
[node name="Table" parent="." instance=ExtResource( 3 )]
207238
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -6 )
208239

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
"thumbnail": "vive_controller_thumbnail.png",
3+
"components": {
4+
"body": {
5+
"filename": "vr_tracker_vive_3_0.obj",
6+
"component_local": {
7+
"origin": [ 0.0, 0.0, 0.0 ],
8+
"rotate_xyz": [ 0.0, 0.0, 0.0 ]
9+
}
10+
},
11+
"back": {
12+
"component_local": {
13+
"origin": [ 0.0, 0.0, 0.0 ],
14+
"rotate_xyz": [ 0.0, 0.0, 180.0 ]
15+
}
16+
},
17+
"pistol": {
18+
"component_local": {
19+
"origin": [ 0.0, 0.0, 0.0 ],
20+
"rotate_xyz": [ -30.0, 0.0, 180.0 ]
21+
}
22+
},
23+
"front_rolled": {
24+
"component_local": {
25+
"origin": [ 0.0, 0.0, 0.01 ],
26+
"rotate_xyz": [ 90.0, 180.0, 0.0 ]
27+
}
28+
},
29+
"front": {
30+
"component_local": {
31+
"origin": [ 0.0, 0.0, 0.01 ],
32+
"rotate_xyz": [ 90.0, 0.0, 0.0 ]
33+
}
34+
}
35+
}
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
newmtl VIVE_Tracker_3_0_
2+
illum 4
3+
Kd 0.50 0.50 0.50
4+
Ka 0.00 0.00 0.00
5+
Tf 1.00 1.00 1.00
6+
Ni 1.00
7+
newmtl VIVE_Tracker_CUI__
8+
illum 4
9+
Kd 0.50 0.50 0.50
10+
Ka 0.00 0.00 0.00
11+
Tf 1.00 1.00 1.00
12+
Ni 1.00
13+
newmtl initialShadingGroup
14+
illum 4
15+
Kd 0.50 0.50 0.50
16+
Ka 0.00 0.00 0.00
17+
Tf 1.00 1.00 1.00
18+
Ni 1.00
19+
newmtl vr_tracker_vive_3_0_SG
20+
illum 4
21+
Kd 0.00 0.00 0.00
22+
Ka 0.00 0.00 0.00
23+
Tf 1.00 1.00 1.00
24+
map_Kd vr_tracker_vive_3_0_diff.png
25+
Ni 1.00
26+
Ks 0.00 0.00 0.00
27+
map_Ks vr_tracker_vive_3_0_Spec.png
28+
Ns 18.00
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[remap]
2+
3+
importer="wavefront_obj"
4+
type="Mesh"
5+
path="res://.import/vr_tracker_vive_3_0.obj-a53b4a08c4f66629a29ada7de74481d0.mesh"
6+
7+
[deps]
8+
9+
files=[ "res://.import/vr_tracker_vive_3_0.obj-a53b4a08c4f66629a29ada7de74481d0.mesh" ]
10+
11+
source_file="res://assets/htc/vr_tracker_vive_3_0/vr_tracker_vive_3_0.obj"
12+
dest_files=[ "res://.import/vr_tracker_vive_3_0.obj-a53b4a08c4f66629a29ada7de74481d0.mesh", "res://.import/vr_tracker_vive_3_0.obj-a53b4a08c4f66629a29ada7de74481d0.mesh" ]
13+
14+
[params]
15+
16+
generate_tangents=true
17+
scale_mesh=Vector3( 1, 1, 1 )
18+
offset_mesh=Vector3( 0, 0, 0 )
19+
octahedral_compression=true
20+
optimize_mesh_flags=4286
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="StreamTexture"
5+
path.s3tc="res://.import/vr_tracker_vive_3_0_Spec.png-5f0e428f46dc6136a4fa36515f0fab6c.s3tc.stex"
6+
path.etc2="res://.import/vr_tracker_vive_3_0_Spec.png-5f0e428f46dc6136a4fa36515f0fab6c.etc2.stex"
7+
path.etc="res://.import/vr_tracker_vive_3_0_Spec.png-5f0e428f46dc6136a4fa36515f0fab6c.etc.stex"
8+
metadata={
9+
"imported_formats": [ "s3tc", "etc2", "etc" ],
10+
"vram_texture": true
11+
}
12+
13+
[deps]
14+
15+
source_file="res://assets/htc/vr_tracker_vive_3_0/vr_tracker_vive_3_0_Spec.png"
16+
dest_files=[ "res://.import/vr_tracker_vive_3_0_Spec.png-5f0e428f46dc6136a4fa36515f0fab6c.s3tc.stex", "res://.import/vr_tracker_vive_3_0_Spec.png-5f0e428f46dc6136a4fa36515f0fab6c.etc2.stex", "res://.import/vr_tracker_vive_3_0_Spec.png-5f0e428f46dc6136a4fa36515f0fab6c.etc.stex" ]
17+
18+
[params]
19+
20+
compress/mode=2
21+
compress/lossy_quality=0.7
22+
compress/hdr_mode=0
23+
compress/bptc_ldr=0
24+
compress/normal_map=0
25+
flags/repeat=0
26+
flags/filter=true
27+
flags/mipmaps=false
28+
flags/anisotropic=false
29+
flags/srgb=2
30+
process/fix_alpha_border=true
31+
process/premult_alpha=false
32+
process/HDR_as_SRGB=false
33+
process/invert_color=false
34+
process/normal_map_invert_y=false
35+
stream=false
36+
size_limit=0
37+
detect_3d=true
38+
svg/scale=1.0
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="StreamTexture"
5+
path.s3tc="res://.import/vr_tracker_vive_3_0_diff.png-073876868edc19f3fac2656e5573f296.s3tc.stex"
6+
path.etc2="res://.import/vr_tracker_vive_3_0_diff.png-073876868edc19f3fac2656e5573f296.etc2.stex"
7+
path.etc="res://.import/vr_tracker_vive_3_0_diff.png-073876868edc19f3fac2656e5573f296.etc.stex"
8+
metadata={
9+
"imported_formats": [ "s3tc", "etc2", "etc" ],
10+
"vram_texture": true
11+
}
12+
13+
[deps]
14+
15+
source_file="res://assets/htc/vr_tracker_vive_3_0/vr_tracker_vive_3_0_diff.png"
16+
dest_files=[ "res://.import/vr_tracker_vive_3_0_diff.png-073876868edc19f3fac2656e5573f296.s3tc.stex", "res://.import/vr_tracker_vive_3_0_diff.png-073876868edc19f3fac2656e5573f296.etc2.stex", "res://.import/vr_tracker_vive_3_0_diff.png-073876868edc19f3fac2656e5573f296.etc.stex" ]
17+
18+
[params]
19+
20+
compress/mode=2
21+
compress/lossy_quality=0.7
22+
compress/hdr_mode=0
23+
compress/bptc_ldr=0
24+
compress/normal_map=0
25+
flags/repeat=0
26+
flags/filter=true
27+
flags/mipmaps=false
28+
flags/anisotropic=false
29+
flags/srgb=2
30+
process/fix_alpha_border=true
31+
process/premult_alpha=false
32+
process/HDR_as_SRGB=false
33+
process/invert_color=false
34+
process/normal_map_invert_y=false
35+
stream=false
36+
size_limit=0
37+
detect_3d=true
38+
svg/scale=1.0

Diff for: demo/scenes/Screen.gd

+4
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,7 @@ func _on_ToggleBounds_pressed():
2626
func _on_TogglePassthrough_pressed():
2727
if fp_controller:
2828
fp_controller.enable_passthrough = !fp_controller.enable_passthrough
29+
30+
31+
func _on_Quit_pressed():
32+
get_tree().quit()

Diff for: demo/scenes/Screen.tscn

+9-3
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@ margin_right = 267.0
3838
margin_bottom = 338.0
3939
custom_fonts/font = ExtResource( 1 )
4040
text = "Press me!!"
41-
__meta__ = {
42-
"_edit_use_anchors_": false
43-
}
4441

4542
[node name="Count" type="Label" parent="."]
4643
margin_left = 290.0
@@ -78,6 +75,15 @@ __meta__ = {
7875
"_edit_use_anchors_": false
7976
}
8077

78+
[node name="Quit" type="Button" parent="."]
79+
margin_left = 470.0
80+
margin_top = 347.0
81+
margin_right = 587.0
82+
margin_bottom = 385.0
83+
custom_fonts/font = ExtResource( 1 )
84+
text = "Quit"
85+
8186
[connection signal="pressed" from="Button" to="." method="_on_Button_pressed"]
8287
[connection signal="pressed" from="ToggleBounds" to="." method="_on_ToggleBounds_pressed"]
8388
[connection signal="pressed" from="TogglePassthrough" to="." method="_on_TogglePassthrough_pressed"]
89+
[connection signal="pressed" from="Quit" to="." method="_on_Quit_pressed"]

Diff for: src/ARVRInterface.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "openxr/extensions/xr_fb_foveation_extension_wrapper.h"
1010
#include "openxr/extensions/xr_fb_passthrough_extension_wrapper.h"
1111
#include "openxr/extensions/xr_fb_swapchain_update_state_extension_wrapper.h"
12+
#include "openxr/extensions/xr_htc_vive_tracker_extension_wrapper.h"
1213
#include <ARVRInterface.hpp>
1314
#include <MainLoop.hpp>
1415

@@ -128,6 +129,7 @@ godot_bool godot_arvr_initialize(void *p_data) {
128129
arvr_data->openxr_api->register_extension_wrapper<XRFbDisplayRefreshRateExtensionWrapper>();
129130
arvr_data->openxr_api->register_extension_wrapper<XRExtHandTrackingExtensionWrapper>();
130131
arvr_data->openxr_api->register_extension_wrapper<XRFbPassthroughExtensionWrapper>();
132+
arvr_data->openxr_api->register_extension_wrapper<XRHTCViveTrackerExtensionWrapper>();
131133

132134
// not initialise
133135
arvr_data->openxr_api->initialize();

Diff for: src/gdclasses/OpenXRPose.cpp

+37-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ void OpenXRPose::_register_methods() {
1818
&OpenXRPose::get_invisible_if_inactive,
1919
true);
2020

21+
register_method("get_invisible_if_no_confidence", &OpenXRPose::get_invisible_if_no_confidence);
22+
register_method("set_invisible_if_no_confidence", &OpenXRPose::set_invisible_if_no_confidence);
23+
register_property<OpenXRPose, bool>(
24+
"invisible_if_no_confidence",
25+
&OpenXRPose::set_invisible_if_no_confidence,
26+
&OpenXRPose::get_invisible_if_no_confidence,
27+
true);
28+
2129
// For now these are hard coded based on our actions
2230
// As our actions JSON is parsed after initialisation we can't really present the dropdown (yet)
2331
// For now this will do
@@ -45,7 +53,15 @@ void OpenXRPose::_register_methods() {
4553
GODOT_METHOD_RPC_MODE_DISABLED,
4654
GODOT_PROPERTY_USAGE_DEFAULT,
4755
GODOT_PROPERTY_HINT_ENUM,
48-
"/user/hand/left,/user/hand/right,/user/treadmill");
56+
"/user/hand/left,/user/hand/right,/user/treadmill"
57+
",/user/vive_tracker_htcx/role/left_foot,/user/vive_tracker_htcx/role/right_foot"
58+
",/user/vive_tracker_htcx/role/left_shoulder,/user/vive_tracker_htcx/role/right_shoulder"
59+
",/user/vive_tracker_htcx/role/left_elbow,/user/vive_tracker_htcx/role/right_elbow"
60+
",/user/vive_tracker_htcx/role/left_knee,/user/vive_tracker_htcx/role/right_knee"
61+
",/user/vive_tracker_htcx/role/waist"
62+
",/user/vive_tracker_htcx/role/chest"
63+
",/user/vive_tracker_htcx/role/camera"
64+
",/user/vive_tracker_htcx/role/keyboard");
4965

5066
register_method("is_active", &OpenXRPose::is_active);
5167
register_method("get_tracking_confidence", &OpenXRPose::get_tracking_confidence);
@@ -119,14 +135,16 @@ bool OpenXRPose::check_action_and_path() {
119135
}
120136

121137
void OpenXRPose::_physics_process(float delta) {
138+
bool visible = true;
139+
122140
if (openxr_api == nullptr || hand_tracking_wrapper == nullptr) {
123141
return;
124142
} else if (!openxr_api->is_initialised()) {
125143
return;
126144
}
127145

128146
if (invisible_if_inactive) {
129-
set_visible(is_active());
147+
visible = is_active();
130148
}
131149

132150
ARVRServer *server = ARVRServer::get_singleton();
@@ -149,7 +167,16 @@ void OpenXRPose::_physics_process(float delta) {
149167
Transform t;
150168
confidence = _action->get_as_pose(_path, ws, t);
151169
set_transform(reference_frame * t);
170+
} else {
171+
// we're not tracking anything...
172+
confidence = TRACKING_CONFIDENCE_NONE;
173+
}
174+
175+
if (invisible_if_no_confidence && confidence == TRACKING_CONFIDENCE_NONE) {
176+
visible = false;
152177
}
178+
179+
set_visible(visible);
153180
}
154181

155182
bool OpenXRPose::is_active() {
@@ -184,6 +211,14 @@ void OpenXRPose::set_invisible_if_inactive(bool hide) {
184211
invisible_if_inactive = hide;
185212
}
186213

214+
bool OpenXRPose::get_invisible_if_no_confidence() const {
215+
return invisible_if_no_confidence;
216+
}
217+
218+
void OpenXRPose::set_invisible_if_no_confidence(bool hide) {
219+
invisible_if_no_confidence = hide;
220+
}
221+
187222
String OpenXRPose::get_action() const {
188223
return action;
189224
}

Diff for: src/gdclasses/OpenXRPose.h

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class OpenXRPose : public Spatial {
1717
TrackingConfidence confidence = TRACKING_CONFIDENCE_NONE;
1818
XRExtHandTrackingExtensionWrapper *hand_tracking_wrapper = nullptr;
1919
bool invisible_if_inactive = true;
20+
bool invisible_if_no_confidence = true;
2021
String action;
2122
String path;
2223

@@ -39,6 +40,8 @@ class OpenXRPose : public Spatial {
3940

4041
bool get_invisible_if_inactive() const;
4142
void set_invisible_if_inactive(bool hide);
43+
bool get_invisible_if_no_confidence() const;
44+
void set_invisible_if_no_confidence(bool hide);
4245

4346
String get_action() const;
4447
void set_action(const String p_action);

0 commit comments

Comments
 (0)