Skip to content

Conversation

BastiaanOlij
Copy link
Contributor

@BastiaanOlij BastiaanOlij commented Jan 27, 2024

This demo shows off how to create a vehicle centric XR game using OpenXR.

The basic idea is a simple go-kart race game.
Important here is the use of the "local" reference space.

It also shows mixing traditional inputs (keyboard/gamepad/steering wheel) with XR input.

If the player uses their controllers and holds them near the steering wheel, they will snap into place and the player will be able to turn the wheel. The triggers on the controller are used to accelerate (right controller) and brake (left controller)

@BastiaanOlij
Copy link
Contributor Author

For those who are interested in this, recording of the stream in which I build the first part of this demo: https://youtube.com/live/eWpNwrPTiqw

@BastiaanOlij
Copy link
Contributor Author

I've added a Gokart model from sketchfab that is CC-BY-4.0, hopefully that is acceptable here, else I'll need to look into another one.

This also has a little display on the steering wheel that we've used to display FPS and velocity information. Nice little touch.

Also added a polyhaven skytexture.

@capnm
Copy link
Contributor

capnm commented Feb 11, 2024

xr/openxr_vehicle_movement/assets/uv.jpg

Maybe you could add a separate licences folder, e.g. this one states that the generated textures are of free use.
https://uvchecker.vinzi.xyz/EULA.html
https://uvchecker.vinzi.xyz/

@BastiaanOlij BastiaanOlij force-pushed the openxr_vehicle_demo branch 6 times, most recently from d6df5e8 to 98483a9 Compare March 13, 2024 06:09
@BastiaanOlij
Copy link
Contributor Author

xr/openxr_vehicle_movement/assets/uv.jpg

Maybe you could add a separate licences folder, e.g. this one states that the generated textures are of free use. https://uvchecker.vinzi.xyz/EULA.html https://uvchecker.vinzi.xyz/

I ended up removing it as I only used it temporarily.

@BastiaanOlij BastiaanOlij marked this pull request as ready for review March 13, 2024 06:10
@BastiaanOlij BastiaanOlij force-pushed the openxr_vehicle_demo branch 3 times, most recently from d77ba52 to 3a74158 Compare March 18, 2024 02:34
@BastiaanOlij BastiaanOlij force-pushed the openxr_vehicle_demo branch from 3a74158 to 670de95 Compare June 2, 2024 03:54
Comment on lines +1 to +7
extends CanvasLayer

func set_velocity(p_velocity : float):
%Velocity.text = "Velocity: %0.2f kmph (%0.2f m/s)" % [ p_velocity * 3.6, p_velocity ]

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please follow the GDScript style guide, and use static typing, for all code in the demos.

We should fix all warnings before merging, such as by adding _ before delta.

Kilometers per hour is km/h not kmph. Also, I'd argue we should use meters per second as the primary (or only) unit, since it's the unit of velocity Godot users are working with in code.

Suggested change
extends CanvasLayer
func set_velocity(p_velocity : float):
%Velocity.text = "Velocity: %0.2f kmph (%0.2f m/s)" % [ p_velocity * 3.6, p_velocity ]
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
extends CanvasLayer
func set_velocity(p_velocity: float) -> void:
%Velocity.text = "Velocity: %0.2f m/s (%0.2f km/h)" % [p_velocity, p_velocity * 3.6]
func _process(_delta: float) -> void:

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All file names should use snake_case, only composed of lowercase, underscores, dots, and maybe numbers.

]
}
},
"name": "Material.004"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should ideally clean up the original 3D model file, at least such that it will have human-readable names for its parts, but we could go even further, such as including physics in the model. I could work on this but it's not a high priority for me.

Comment on lines +6 to +7
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
func _process(delta):

@@ -0,0 +1,8 @@
extends CanvasLayer

func set_velocity(p_velocity : float):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
func set_velocity(p_velocity : float):
func set_velocity(p_velocity: float):


## Input and the action map

This demo uses Godots standard input map to allow for keyboard and gamepad input.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This demo uses Godots standard input map to allow for keyboard and gamepad input.
This demo uses Godot's standard input map to allow for keyboard and gamepad input.

There is also an action map setup so you can use the XR controllers.
Move your hands close enough to the steering wheel so they grab the wheel,
this will disable traditional input and enable you to control the steering wheel with your hands.
You can then use the trigger on the left controller to accellerate, and the trigger on the right controller to break.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
You can then use the trigger on the left controller to accellerate, and the trigger on the right controller to break.
You can then use the trigger on the left controller to accelerate, and the trigger on the right controller to break.

$Label3D.visible = false
set_process(false)
else:
# Update fade
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Update fade
# Update fade.

For all

if is_inside_tree():
_update_tires()

func _update_tires():
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
func _update_tires():
func _update_tires():

if material:
material.set_shader_parameter("albedo_texture", %InfoViewport.get_texture())

# Called every frame. 'delta' is the elapsed time since the previous frame.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Called every frame. 'delta' is the elapsed time since the previous frame.
# Called every frame. 'delta' is the elapsed time since the previous frame.


# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
# Check steering
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Check steering
# Check steering.

For all

steering_input = 1.0
else:
steering_input = Input.get_axis("turn_left", "turn_right")
steering = steering_input * -MAX_STEERING_ANGLE
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
steering = steering_input * -MAX_STEERING_ANGLE
steering = steering_input * -MAX_STEERING_ANGLE

elif just_pressed_accel:
reverse = false

if !reverse:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if !reverse:
if not reverse:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants