Files
frog/scripts/camera_shake.gd
T
E250429F 3e857fa9f3 credit
2026-09-17 23:19:43 +02:00

66 lines
1.7 KiB
GDScript

extends Camera3D
## Fait légèrement trembler la caméra pour simuler les secousses d'une voiture.
## Attache ce script directement sur chaque Camera3D du groupe "cinematic_cams"
@export_group("Intensité")
@export var position_amplitude: float = 0.01 # amplitude du déplacement (en mètres)
@export var rotation_amplitude: float = 0.2 # amplitude de la rotation (en degrés)
@export var frequency: float = 0.5 # vitesse du tremblement (plus haut = plus nerveux)
var _noise: FastNoiseLite
var _time: float = 0.0
var _last_offset_pos: Vector3 = Vector3.ZERO
var _last_offset_rot: Vector3 = Vector3.ZERO
var _shaking: bool = false
func _ready() -> void:
_noise = FastNoiseLite.new()
_noise.seed = randi()
_noise.frequency = 1.0
start_shake()
func start_shake() -> void:
_shaking = true
func stop_shake() -> void:
_shaking = false
# retire proprement le dernier offset appliqué pour ne pas laisser la caméra décalée
position -= _last_offset_pos
rotation -= _last_offset_rot
_last_offset_pos = Vector3.ZERO
_last_offset_rot = Vector3.ZERO
func _process(delta: float) -> void:
if not _shaking:
return
_time += delta * frequency
# retire l'offset de la frame précédente avant d'en calculer un nouveau
position -= _last_offset_pos
rotation -= _last_offset_rot
var offset_pos := Vector3(
_noise.get_noise_2d(_time, 0.0),
_noise.get_noise_2d(0.0, _time),
_noise.get_noise_2d(_time, _time)
) * position_amplitude
var offset_rot := Vector3(
_noise.get_noise_2d(_time, 100.0),
_noise.get_noise_2d(100.0, _time),
_noise.get_noise_2d(_time, -_time)
) * deg_to_rad(rotation_amplitude)
position += offset_pos
rotation += offset_rot
_last_offset_pos = offset_pos
_last_offset_rot = offset_rot