biplan.gd 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. class_name Biplan
  2. extends SeatedVehicle
  3. const PLANE_FORWARD := Vector3.BACK # z increases when moving forward
  4. @export var thrust_power: float = 3500.0
  5. @export var turn_to_torque: float = 3000.0
  6. @export var move_to_pitch: float = 4000.0
  7. @export var wing_resistance: float = 2500.0
  8. @export var foil_resistance: float = 250.0
  9. @export var lift: float = 25.0
  10. var target_torque: float = 0.0
  11. var target_pitch: float = 0.0
  12. var target_rotation := Vector3.ZERO
  13. var target_thrust := Vector3.ZERO
  14. @onready var VerticalFoil : Node3D = $VerticalFoil
  15. func trigger_thrust(activate: bool) -> void:
  16. if activate:
  17. target_thrust = PLANE_FORWARD * thrust_power
  18. else:
  19. target_thrust = Vector3.ZERO
  20. func trigger_direction(dir: Vector2) -> void:
  21. target_torque = dir.x * turn_to_torque
  22. target_pitch = dir.y * move_to_pitch
  23. func _physics_process(_delta) -> void:
  24. # Command part
  25. _apply_plane_rotation()
  26. _apply_plane_thrust()
  27. # Air simulation part
  28. if is_sleeping():
  29. return
  30. _apply_wing_resistance()
  31. _apply_foil_resistance()
  32. _apply_lift()
  33. transform = transform.orthonormalized()
  34. func _apply_plane_rotation() -> void:
  35. var torque: Vector3 = transform.basis * Vector3(target_pitch, 0.0, target_torque)
  36. apply_torque(torque)
  37. func _apply_plane_thrust() -> void:
  38. var force: Vector3 = transform.basis * target_thrust
  39. apply_central_force(force)
  40. func _apply_wing_resistance() -> void:
  41. var vertical_speed = linear_velocity.dot(transform.basis * Vector3.UP)
  42. var local_wing_force = Vector3.UP * -wing_resistance * vertical_speed
  43. var wing_force = transform.basis * local_wing_force
  44. apply_central_force(wing_force)
  45. func _apply_foil_resistance() -> void:
  46. var horizontal_speed = linear_velocity.dot(transform.basis.x)
  47. var local_foil_force = transform.basis.x * -foil_resistance * horizontal_speed
  48. var foil_local_position: Vector3 = VerticalFoil.get_position()
  49. var foil_global_offset: Vector3 = transform.basis * foil_local_position
  50. apply_force(local_foil_force, foil_global_offset)
  51. func _apply_lift() -> void:
  52. var forward_speed = linear_velocity.dot(transform.basis * PLANE_FORWARD)
  53. if forward_speed < 0.0 :
  54. forward_speed = 0.0
  55. var local_lift_force = Vector3.UP * lift * forward_speed
  56. var lift_force = transform.basis * local_lift_force
  57. apply_central_force(lift_force)
  58. func _on_dir_changed(dir: Vector2) -> void:
  59. trigger_direction(dir)
  60. func _on_main_action(pressed: bool) -> void:
  61. trigger_thrust(pressed)