66 lines
1.7 KiB
GDScript
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
|