From 56c5ee15e0f1a90ccc9ddf68b7ec5e9269e665c8 Mon Sep 17 00:00:00 2001 From: rodolpheh Date: Mon, 6 Nov 2023 22:52:47 +0000 Subject: [PATCH] Make cube demo XR compatible --- demo/export_presets.cfg | 6 +++++- demo/project.godot | 8 +++++++- demo/scenes/Players/Player.tscn | 7 +++++++ demo/scenes/Players/XRPlayer.tscn | 11 +++++++++++ demo/scenes/RiggedHand.tscn | 6 +----- demo/scripts/CubeApplication.gd | 31 +++++++++++++++++++++++++++++++ demo/scripts/CubeSpawner.gd | 17 ++++++++++++----- demo/scripts/HandRigger.gd | 3 ++- demo/scripts/PinchDetector.gd | 12 ++++++++++-- 9 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 demo/scenes/Players/Player.tscn create mode 100644 demo/scenes/Players/XRPlayer.tscn diff --git a/demo/export_presets.cfg b/demo/export_presets.cfg index 3f336f9..15adfe7 100644 --- a/demo/export_presets.cfg +++ b/demo/export_presets.cfg @@ -86,7 +86,7 @@ name="Android" platform="Android" runnable=true dedicated_server=false -custom_features="" +custom_features="openxr" export_filter="all_resources" include_filter="" exclude_filter="" @@ -104,6 +104,10 @@ gradle_build/use_gradle_build=true gradle_build/export_format=0 gradle_build/min_sdk="29" gradle_build/target_sdk="" +plugins/GodotOpenXRMeta=false +plugins/GodotOpenXRLynx=false +plugins/GodotOpenXRKHR=false +plugins/GodotOpenXRPico=true plugins/UltraleapBinder=true architectures/armeabi-v7a=false architectures/arm64-v8a=true diff --git a/demo/project.godot b/demo/project.godot index fad76ac..a54ed11 100644 --- a/demo/project.godot +++ b/demo/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="UltraleapPluginDemo" -run/main_scene="res://main.tscn" +run/main_scene="res://scenes/RiggedHand.tscn" config/features=PackedStringArray("4.1", "Forward Plus") config/icon="res://icon.svg" @@ -84,9 +84,15 @@ paths=["res://addons/godot_ultraleap_plugin/godot_ultraleap_plugin.gdextension"] [physics] common/physics_ticks_per_second=120 +3d/default_gravity=0.0 [rendering] textures/vram_compression/import_etc2_astc=true lights_and_shadows/directional_shadow/soft_shadow_filter_quality=5 anti_aliasing/quality/msaa_3d=3 + +[xr] + +openxr/enabled.openxr=true +shaders/enabled.openxr=true diff --git a/demo/scenes/Players/Player.tscn b/demo/scenes/Players/Player.tscn new file mode 100644 index 0000000..97bb801 --- /dev/null +++ b/demo/scenes/Players/Player.tscn @@ -0,0 +1,7 @@ +[gd_scene format=3 uid="uid://bnd6tg32nxvmv"] + +[node name="Player" type="Node3D"] + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.903336, 0.428935, 0, -0.428935, 0.903336, 0, 0.33, 0.355) +near = 0.001 diff --git a/demo/scenes/Players/XRPlayer.tscn b/demo/scenes/Players/XRPlayer.tscn new file mode 100644 index 0000000..3469326 --- /dev/null +++ b/demo/scenes/Players/XRPlayer.tscn @@ -0,0 +1,11 @@ +[gd_scene format=3 uid="uid://cjktnaeh5lf7n"] + +[node name="XRPlayer" type="Node3D"] + +[node name="XROrigin3D" type="XROrigin3D" parent="."] + +[node name="XRCamera3D" type="XRCamera3D" parent="XROrigin3D"] +near = 0.001 + +[node name="DeviceContainer" type="Node3D" parent="XROrigin3D/XRCamera3D"] +transform = Transform3D(-1, 0, -8.74228e-08, 8.74228e-08, -4.37114e-08, -1, -3.82137e-15, -1, 4.37114e-08, 0, 0, 0) diff --git a/demo/scenes/RiggedHand.tscn b/demo/scenes/RiggedHand.tscn index ac2497e..0436372 100644 --- a/demo/scenes/RiggedHand.tscn +++ b/demo/scenes/RiggedHand.tscn @@ -188,6 +188,7 @@ radius = 0.00197651 height = 0.0197651 [node name="RiggedHand" type="Node3D" node_paths=PackedStringArray("origin_hands", "rigged_hands", "spawner")] +process_mode = 4 script = ExtResource("1_58k8d") origin_hands = NodePath("HandTracking/Debug/OriginHands") rigged_hands = NodePath("Scene/XRToolsHands") @@ -852,10 +853,6 @@ shape = SubResource("CapsuleShape3D_yy4pl") visible = false update_mode = 1 -[node name="Camera3D" type="Camera3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 0.903336, 0.428935, 0, -0.428935, 0.903336, 0, 0.33, 0.355) -near = 0.001 - [node name="HandTracking" type="Node3D" parent="."] [node name="UltraleapHandTracking" type="UltraleapHandTracking" parent="HandTracking"] @@ -863,7 +860,6 @@ script = ExtResource("1_r2upn") [node name="UltraleapDeviceNode" type="UltraleapDeviceNode" parent="HandTracking"] tracker = NodePath("../UltraleapHandTracking") -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.252083, 0, 0) [node name="HandRiggers" type="Node3D" parent="HandTracking"] diff --git a/demo/scripts/CubeApplication.gd b/demo/scripts/CubeApplication.gd index 74c15c7..12593f4 100644 --- a/demo/scripts/CubeApplication.gd +++ b/demo/scripts/CubeApplication.gd @@ -4,6 +4,37 @@ extends Node3D @export var rigged_hands : Node3D @export var spawner : CubeSpawner @export var cube_material : PhysicsMaterial +@export var xr : bool = true + +var xr_interface: XRInterface + +func _ready(): + if not xr: + var player : Resource = load("res://scenes/Players/Player.tscn") + var player_node : Node3D = player.instantiate() + add_child(player_node) + + return + xr_interface = XRServer.find_interface("OpenXR") + if xr_interface and xr_interface.is_initialized(): + print("OpenXR initialised successfully") + + var player : Resource = load("res://scenes/Players/XRPlayer.tscn") + var player_node : Node3D = player.instantiate() + add_child(player_node) + + var source : UltraleapDeviceNode = $HandTracking/UltraleapDeviceNode + var target : Node3D = player_node.get_node("XROrigin3D").get_node("XRCamera3D").get_node("DeviceContainer") + + source.reparent(target, false) + + # Turn off v-sync! + DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) + + # Change our main viewport to output to the HMD + get_viewport().use_xr = true + else: + print("OpenXR not initialized, please check if your headset is connected") func disable_gravity(): PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 0) diff --git a/demo/scripts/CubeSpawner.gd b/demo/scripts/CubeSpawner.gd index 3daebf9..bb75b42 100644 --- a/demo/scripts/CubeSpawner.gd +++ b/demo/scripts/CubeSpawner.gd @@ -53,7 +53,10 @@ func _physics_process(delta): var left_hand : UltraleapHand = left_hand_pinch_detector.hand var right_hand : UltraleapHand = right_hand_pinch_detector.hand - var dist : float = left_hand.thumb.distal.next_joint.distance_to(right_hand.thumb.distal.next_joint) + #var dist : float = left_hand.thumb.distal.next_joint.distance_to(right_hand.thumb.distal.next_joint) + var dist : float = left_hand_pinch_detector.pinch_transform.origin.distance_to( + right_hand_pinch_detector.pinch_transform.origin + ) # Detect when they just got pinched if !both_pinched && dist <= pinch_distance: @@ -81,10 +84,14 @@ func _physics_process(delta): var size : float = clamp(dist - size_offset, min_cube_size, max_cube_size) spawn_size = Vector3(size, size, size) - spawn_position = (right_hand.thumb.distal.next_joint + left_hand.thumb.distal.next_joint) / 2 - - var line : Vector3 = right_hand.thumb.distal.next_joint - left_hand.thumb.distal.next_joint - + #spawn_position = (right_hand.thumb.distal.next_joint + left_hand.thumb.distal.next_joint) / 2 + spawn_position = left_hand_pinch_detector.pinch_transform.interpolate_with( + right_hand_pinch_detector.pinch_transform, 0.5 + ).origin + + #var line : Vector3 = right_hand.thumb.distal.next_joint - left_hand.thumb.distal.next_joint + var line : Vector3 = right_hand_pinch_detector.pinch_transform.origin - left_hand_pinch_detector.pinch_transform.origin + # Meh... Calculating the euler angles. Feels like it could be better... var z_angle : float = -atan2(line.y, line.x) var y_angle : float = -atan2(line.z, line.x) diff --git a/demo/scripts/HandRigger.gd b/demo/scripts/HandRigger.gd index 89c2d15..3d55999 100644 --- a/demo/scripts/HandRigger.gd +++ b/demo/scripts/HandRigger.gd @@ -50,8 +50,9 @@ func _process(_delta): skeleton.hide() func set_hand(hand : UltraleapHand): + transform_offset = tracking.global_transform.inverse() if rig_settings.set_arm: - transform_offset = set_arm(hand) + transform_offset *= set_arm(hand) if rig_settings.set_palm: set_palm(hand) diff --git a/demo/scripts/PinchDetector.gd b/demo/scripts/PinchDetector.gd index 3284ce4..254f065 100644 --- a/demo/scripts/PinchDetector.gd +++ b/demo/scripts/PinchDetector.gd @@ -14,6 +14,8 @@ signal unpinched var is_pinched : bool = false var hand : UltraleapHand = null +var pinch_transform : Transform3D = Transform3D.IDENTITY + func _ready(): pass @@ -36,6 +38,11 @@ func _process(_delta): var pinch_strength : float = hand.pinch_strength + var pinch_position : Vector3 = (hand.index.distal.next_joint + hand.thumb.distal.next_joint) / 2.0 + var pinch_base : Basis = Basis(hand.thumb.distal.rotation.slerp(hand.index.distal.rotation, 0.5)) + + pinch_transform = tracking.global_transform * Transform3D(pinch_base, pinch_position) + if pinch_strength > pinch_threshold && !is_pinched: is_pinched = true pinched.emit() @@ -46,5 +53,6 @@ func _process(_delta): if debug: display.set_pinch_strength(pinch_strength) - display.set_pinch_position((hand.index.distal.next_joint + hand.thumb.distal.next_joint) / 2.0) - display.set_pinch_rotation(hand.thumb.distal.rotation.slerp(hand.index.distal.rotation, 0.5)) + display.set_pinch_position(pinch_transform.origin) + display.set_pinch_rotation(pinch_transform.basis.get_rotation_quaternion()) +