Make cube demo XR compatible
This commit is contained in:
parent
d5ed6a0d32
commit
56c5ee15e0
|
@ -86,7 +86,7 @@ name="Android"
|
||||||
platform="Android"
|
platform="Android"
|
||||||
runnable=true
|
runnable=true
|
||||||
dedicated_server=false
|
dedicated_server=false
|
||||||
custom_features=""
|
custom_features="openxr"
|
||||||
export_filter="all_resources"
|
export_filter="all_resources"
|
||||||
include_filter=""
|
include_filter=""
|
||||||
exclude_filter=""
|
exclude_filter=""
|
||||||
|
@ -104,6 +104,10 @@ gradle_build/use_gradle_build=true
|
||||||
gradle_build/export_format=0
|
gradle_build/export_format=0
|
||||||
gradle_build/min_sdk="29"
|
gradle_build/min_sdk="29"
|
||||||
gradle_build/target_sdk=""
|
gradle_build/target_sdk=""
|
||||||
|
plugins/GodotOpenXRMeta=false
|
||||||
|
plugins/GodotOpenXRLynx=false
|
||||||
|
plugins/GodotOpenXRKHR=false
|
||||||
|
plugins/GodotOpenXRPico=true
|
||||||
plugins/UltraleapBinder=true
|
plugins/UltraleapBinder=true
|
||||||
architectures/armeabi-v7a=false
|
architectures/armeabi-v7a=false
|
||||||
architectures/arm64-v8a=true
|
architectures/arm64-v8a=true
|
||||||
|
|
|
@ -11,7 +11,7 @@ config_version=5
|
||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="UltraleapPluginDemo"
|
config/name="UltraleapPluginDemo"
|
||||||
run/main_scene="res://main.tscn"
|
run/main_scene="res://scenes/RiggedHand.tscn"
|
||||||
config/features=PackedStringArray("4.1", "Forward Plus")
|
config/features=PackedStringArray("4.1", "Forward Plus")
|
||||||
config/icon="res://icon.svg"
|
config/icon="res://icon.svg"
|
||||||
|
|
||||||
|
@ -84,9 +84,15 @@ paths=["res://addons/godot_ultraleap_plugin/godot_ultraleap_plugin.gdextension"]
|
||||||
[physics]
|
[physics]
|
||||||
|
|
||||||
common/physics_ticks_per_second=120
|
common/physics_ticks_per_second=120
|
||||||
|
3d/default_gravity=0.0
|
||||||
|
|
||||||
[rendering]
|
[rendering]
|
||||||
|
|
||||||
textures/vram_compression/import_etc2_astc=true
|
textures/vram_compression/import_etc2_astc=true
|
||||||
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=5
|
lights_and_shadows/directional_shadow/soft_shadow_filter_quality=5
|
||||||
anti_aliasing/quality/msaa_3d=3
|
anti_aliasing/quality/msaa_3d=3
|
||||||
|
|
||||||
|
[xr]
|
||||||
|
|
||||||
|
openxr/enabled.openxr=true
|
||||||
|
shaders/enabled.openxr=true
|
||||||
|
|
7
demo/scenes/Players/Player.tscn
Normal file
7
demo/scenes/Players/Player.tscn
Normal file
|
@ -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
|
11
demo/scenes/Players/XRPlayer.tscn
Normal file
11
demo/scenes/Players/XRPlayer.tscn
Normal file
|
@ -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)
|
|
@ -188,6 +188,7 @@ radius = 0.00197651
|
||||||
height = 0.0197651
|
height = 0.0197651
|
||||||
|
|
||||||
[node name="RiggedHand" type="Node3D" node_paths=PackedStringArray("origin_hands", "rigged_hands", "spawner")]
|
[node name="RiggedHand" type="Node3D" node_paths=PackedStringArray("origin_hands", "rigged_hands", "spawner")]
|
||||||
|
process_mode = 4
|
||||||
script = ExtResource("1_58k8d")
|
script = ExtResource("1_58k8d")
|
||||||
origin_hands = NodePath("HandTracking/Debug/OriginHands")
|
origin_hands = NodePath("HandTracking/Debug/OriginHands")
|
||||||
rigged_hands = NodePath("Scene/XRToolsHands")
|
rigged_hands = NodePath("Scene/XRToolsHands")
|
||||||
|
@ -852,10 +853,6 @@ shape = SubResource("CapsuleShape3D_yy4pl")
|
||||||
visible = false
|
visible = false
|
||||||
update_mode = 1
|
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="HandTracking" type="Node3D" parent="."]
|
||||||
|
|
||||||
[node name="UltraleapHandTracking" type="UltraleapHandTracking" parent="HandTracking"]
|
[node name="UltraleapHandTracking" type="UltraleapHandTracking" parent="HandTracking"]
|
||||||
|
@ -863,7 +860,6 @@ script = ExtResource("1_r2upn")
|
||||||
|
|
||||||
[node name="UltraleapDeviceNode" type="UltraleapDeviceNode" parent="HandTracking"]
|
[node name="UltraleapDeviceNode" type="UltraleapDeviceNode" parent="HandTracking"]
|
||||||
tracker = NodePath("../UltraleapHandTracking")
|
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"]
|
[node name="HandRiggers" type="Node3D" parent="HandTracking"]
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,37 @@ extends Node3D
|
||||||
@export var rigged_hands : Node3D
|
@export var rigged_hands : Node3D
|
||||||
@export var spawner : CubeSpawner
|
@export var spawner : CubeSpawner
|
||||||
@export var cube_material : PhysicsMaterial
|
@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():
|
func disable_gravity():
|
||||||
PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 0)
|
PhysicsServer3D.area_set_param(get_viewport().find_world_3d().space, PhysicsServer3D.AREA_PARAM_GRAVITY, 0)
|
||||||
|
|
|
@ -53,7 +53,10 @@ func _physics_process(delta):
|
||||||
var left_hand : UltraleapHand = left_hand_pinch_detector.hand
|
var left_hand : UltraleapHand = left_hand_pinch_detector.hand
|
||||||
var right_hand : UltraleapHand = right_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
|
# Detect when they just got pinched
|
||||||
if !both_pinched && dist <= pinch_distance:
|
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)
|
var size : float = clamp(dist - size_offset, min_cube_size, max_cube_size)
|
||||||
|
|
||||||
spawn_size = Vector3(size, size, size)
|
spawn_size = Vector3(size, size, size)
|
||||||
spawn_position = (right_hand.thumb.distal.next_joint + left_hand.thumb.distal.next_joint) / 2
|
#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(
|
||||||
var line : Vector3 = right_hand.thumb.distal.next_joint - left_hand.thumb.distal.next_joint
|
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...
|
# Meh... Calculating the euler angles. Feels like it could be better...
|
||||||
var z_angle : float = -atan2(line.y, line.x)
|
var z_angle : float = -atan2(line.y, line.x)
|
||||||
var y_angle : float = -atan2(line.z, line.x)
|
var y_angle : float = -atan2(line.z, line.x)
|
||||||
|
|
|
@ -50,8 +50,9 @@ func _process(_delta):
|
||||||
skeleton.hide()
|
skeleton.hide()
|
||||||
|
|
||||||
func set_hand(hand : UltraleapHand):
|
func set_hand(hand : UltraleapHand):
|
||||||
|
transform_offset = tracking.global_transform.inverse()
|
||||||
if rig_settings.set_arm:
|
if rig_settings.set_arm:
|
||||||
transform_offset = set_arm(hand)
|
transform_offset *= set_arm(hand)
|
||||||
if rig_settings.set_palm:
|
if rig_settings.set_palm:
|
||||||
set_palm(hand)
|
set_palm(hand)
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,8 @@ signal unpinched
|
||||||
var is_pinched : bool = false
|
var is_pinched : bool = false
|
||||||
var hand : UltraleapHand = null
|
var hand : UltraleapHand = null
|
||||||
|
|
||||||
|
var pinch_transform : Transform3D = Transform3D.IDENTITY
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -36,6 +38,11 @@ func _process(_delta):
|
||||||
|
|
||||||
var pinch_strength : float = hand.pinch_strength
|
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:
|
if pinch_strength > pinch_threshold && !is_pinched:
|
||||||
is_pinched = true
|
is_pinched = true
|
||||||
pinched.emit()
|
pinched.emit()
|
||||||
|
@ -46,5 +53,6 @@ func _process(_delta):
|
||||||
|
|
||||||
if debug:
|
if debug:
|
||||||
display.set_pinch_strength(pinch_strength)
|
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_position(pinch_transform.origin)
|
||||||
display.set_pinch_rotation(hand.thumb.distal.rotation.slerp(hand.index.distal.rotation, 0.5))
|
display.set_pinch_rotation(pinch_transform.basis.get_rotation_quaternion())
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue