feat(*): Add basic flight data to HUD

This commit is contained in:
Josh Creek
2025-07-13 21:14:51 +01:00
parent 7fe9f8e263
commit 9ed5afa092
2 changed files with 99 additions and 1 deletions
+46
View File
@@ -46,3 +46,49 @@ offset_bottom = 62.0
grow_horizontal = 2 grow_horizontal = 2
label_settings = SubResource("LabelSettings_efag7") label_settings = SubResource("LabelSettings_efag7")
horizontal_alignment = 1 horizontal_alignment = 1
[node name="InfoPanel" type="VBoxContainer" parent="HUD/Control"]
layout_mode = 1
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = 10.0
offset_top = -200.0
offset_right = 300.0
offset_bottom = -10.0
grow_vertical = 0
[node name="SpeedLabel" type="Label" parent="HUD/Control/InfoPanel"]
layout_mode = 2
text = "Speed: 0.0 m/s"
label_settings = SubResource("LabelSettings_efag7")
[node name="AltitudeLabel" type="Label" parent="HUD/Control/InfoPanel"]
layout_mode = 2
text = "Altitude: 0.0 m"
label_settings = SubResource("LabelSettings_efag7")
[node name="AngularVelLabel" type="Label" parent="HUD/Control/InfoPanel"]
layout_mode = 2
text = "Angular Vel: 0.0 rad/s"
label_settings = SubResource("LabelSettings_efag7")
[node name="CameraModeLabel" type="Label" parent="HUD/Control/InfoPanel"]
layout_mode = 2
text = "Camera: Ball Cam"
label_settings = SubResource("LabelSettings_efag7")
[node name="AttitudeLabel" type="Label" parent="HUD/Control/InfoPanel"]
layout_mode = 2
text = "Pitch: 0° Roll: 0°"
label_settings = SubResource("LabelSettings_efag7")
[node name="HeadingLabel" type="Label" parent="HUD/Control/InfoPanel"]
layout_mode = 2
text = "Heading: 0°"
label_settings = SubResource("LabelSettings_efag7")
[node name="ThrustLabel" type="Label" parent="HUD/Control/InfoPanel"]
layout_mode = 2
text = "Thrust: 0%"
label_settings = SubResource("LabelSettings_efag7")
+53 -1
View File
@@ -6,7 +6,7 @@ extends RigidBody3D
@export var maneuvering_thrust = 75.0 # Side/vertical thruster power @export var maneuvering_thrust = 75.0 # Side/vertical thruster power
@export var vertical_thrust = 120.0 # Up/down thruster power @export var vertical_thrust = 120.0 # Up/down thruster power
@export var turbo_multiplier = 2.5 # Turbo boost multiplier @export var turbo_multiplier = 2.5 # Turbo boost multiplier
@export var max_speed = 25.0 # Maximum velocity @export var max_speed = 35.0 # Maximum velocity
@export var rotation_power = 20.0 # Angular thrust power @export var rotation_power = 20.0 # Angular thrust power
@export var max_angular_speed = 3.0 # Maximum rotation speed @export var max_angular_speed = 3.0 # Maximum rotation speed
@export var drag_coefficient = 0.98 # Linear drag (air resistance) @export var drag_coefficient = 0.98 # Linear drag (air resistance)
@@ -19,7 +19,16 @@ var camera_smoothing = 10.0
@onready var camera : Camera3D = get_node("Camera3D") @onready var camera : Camera3D = get_node("Camera3D")
@onready var ball = get_parent().get_node("Ball") @onready var ball = get_parent().get_node("Ball")
# HUD Nodes
@onready var timer_label = get_node("HUD/Control/TimerLabel") @onready var timer_label = get_node("HUD/Control/TimerLabel")
@onready var speed_label = get_node("HUD/Control/InfoPanel/SpeedLabel")
@onready var altitude_label = get_node("HUD/Control/InfoPanel/AltitudeLabel")
@onready var angular_vel_label = get_node("HUD/Control/InfoPanel/AngularVelLabel")
@onready var camera_mode_label = get_node("HUD/Control/InfoPanel/CameraModeLabel")
@onready var attitude_label = get_node("HUD/Control/InfoPanel/AttitudeLabel")
@onready var heading_label = get_node("HUD/Control/InfoPanel/HeadingLabel")
@onready var thrust_label = get_node("HUD/Control/InfoPanel/ThrustLabel")
var ball_cam_enabled = true var ball_cam_enabled = true
@@ -68,6 +77,7 @@ func _on_timer_updated(minutes: int, seconds: int):
func _physics_process(delta): func _physics_process(delta):
if camera: if camera:
_update_camera(delta) _update_camera(delta)
_update_hud()
func _update_camera(delta): func _update_camera(delta):
if ball_cam_enabled and ball: if ball_cam_enabled and ball:
@@ -272,3 +282,45 @@ func apply_drag_and_limits(state: PhysicsDirectBodyState3D, rotation_input: Vect
# Same concept for angular velocity # Same concept for angular velocity
# Physics: ω̂ = ω / |ω|, ω_limited = ω̂ * ω_max # Physics: ω̂ = ω / |ω|, ω_limited = ω̂ * ω_max
state.angular_velocity = state.angular_velocity.normalized() * max_angular_speed state.angular_velocity = state.angular_velocity.normalized() * max_angular_speed
func _update_hud():
# Update speed display
# Physics: |v| = √(vₓ² + vᵧ² + vᵤ²) (magnitude of velocity vector)
var current_speed = linear_velocity.length()
speed_label.text = "Speed: %.1f m/s" % current_speed
# Update altitude (Y position relative to ground level)
# Physics: Height measurement from reference point (y = 0)
var current_altitude = global_transform.origin.y
altitude_label.text = "Altitude: %.1f m" % current_altitude
# Update angular velocity
# Physics: |ω| = √(ωₓ² + ωᵧ² + ωᵤ²) (magnitude of angular velocity vector)
var angular_speed = angular_velocity.length()
angular_vel_label.text = "Angular Vel: %.2f rad/s" % angular_speed
# Update camera mode
var camera_mode = "Ball Cam" if ball_cam_enabled else "Ship Cam"
camera_mode_label.text = "Camera: %s" % camera_mode
# Calculate attitude (pitch and roll from ship orientation)
# Physics: Euler angles from rotation matrix
# Pitch = rotation around X-axis, Roll = rotation around Z-axis
var ship_rotation = global_transform.basis.get_euler(EULER_ORDER_XYZ)
var pitch_deg = rad_to_deg(ship_rotation.x)
var roll_deg = rad_to_deg(ship_rotation.z)
attitude_label.text = "Pitch: %.0f° Roll: %.0f°" % [pitch_deg, roll_deg]
# Calculate heading (yaw - direction ship is facing)
# Physics: Yaw = rotation around Y-axis (compass heading)
# Convert to 0-360° range for traditional compass display
var yaw_deg = rad_to_deg(ship_rotation.y)
var heading = fmod(yaw_deg + 360.0, 360.0) # Normalize to 0-360°
heading_label.text = "Heading: %.0f°" % heading
# Calculate current thrust percentage
# Physics: Thrust output as percentage of maximum available thrust
var thrust_input = get_thrust_input()
var thrust_magnitude = thrust_input.length()
var thrust_percent = thrust_magnitude * 100.0
thrust_label.text = "Thrust: %.0f%%" % thrust_percent