Prinzip und Implementierung des Godot-Bildschirm-Jitter-Effekts

Um mit Godot den Bildschirm-/Kamera-Shake-Effekt zu erzielen, habe ich einige Implementierungslösungen im Internet untersucht, aber die Ergebnisse waren alle unbefriedigend, also habe ich selbst eine implementiert.

Prinzip

Beim Rendervorgang ist es die Szenenkamera, die tatsächlich wackelt.
Der Jitter-Prozess entspricht einer physikalischen Schwingung (eine physikalische Größe ändert sich wiederholt in der Nähe eines bestimmten Wertes), auch Oszillation genannt.
Wenn ein Objekt vibriert, nimmt seine Amplitude allmählich ab und hört schließlich auf zu vibrieren. Diese Schwingbewegung wird gedämpft.
Kameraverwacklungen entsprechen der Definition einer gedämpften Vibration .

Um den Jitter-Effekt zu erzielen, kann es sich theoretisch entweder um die Vibration der Kamera in der Nähe der Gleichgewichtsposition (eingestellte Koordinaten) oder um die Vibration des Richtungswinkels handeln, in den die Kamera zeigt.
Aus Sicht der Implementierung ist es am bequemsten, diese für die Implementierung zu verwenden, da die Kameraklasse von Godot über die Attribute h_offset und v_offset verfügt.

Gemäß der dynamischen Gleichung gedämpfter Bewegung (Schwingungsgleichung) in der Physik kann die Bewegungsgleichung des Teilchens gelöst werden:
Bewegungsgleichungen für gedämpfte Schwingungen
Darüber hinaus müssen wir die Fälle überdämpfter Schwingung und kritischer Dämpfungsschwingung nicht diskutieren.
Obwohl die Bewegungsgleichungen eindimensional sind, können sie leicht auf mehrere Dimensionen erweitert werden.
Solange die mehrdimensionalen Systemparameter gleich sind und den physikalischen Gesetzen entsprechen, wird die endgültige Leistung „realer“ sein.
Unter Berücksichtigung der Initialisierungsbedingungen (t=0, x=0) und (t=Dauer, x=0) kann die Bewegungsgleichung der Kamera weiter vereinfacht werden, d. h. die Funktion der Kamerakoordinaten ändert sich mit der Zeit.

erreichen

GDScript-Skript zur Szenenkamera $Camera hinzufügen:

extends Camera

const amp = 1.0
const cycle = 2
const duration = 0.3
const beta = 3 / duration
const omega = 2 * PI / duration * cycle

var a: Vector2

func _ready():
	pass

func rnd_amp(amp_max: float):
	return rand_range(amp_max / 2, amp_max) * [1, -1][randi() % 2]

func _on_vibra_finished():
	h_offset = 0
	v_offset = 0

func damped_vibra(t: float):
	h_offset = a.x * exp(-beta * t) * sin(omega * t)
	v_offset = a.y * exp(-beta * t) * sin(omega * t)

func _on_Main_sig_bad():
	a = Vector2(rnd_amp(amp), rnd_amp(amp))
	var tween = create_tween()
	tween.connect("finished", self, "_on_vibra_finished")
	tween.tween_method(self, "damped_vibra", 0.0, duration, duration)

veranschaulichen

  • Verbinden Sie das externe Signal sig_bad mit der Methode _on_Main_sig_bad() im $Camera-Skript
  • Die Methode _on_Main_sig_bad() initialisiert die Vibrationsprozessparameter und löst den Tween-Prozess (Mehrfachinterpolation) aus
  • Das System löst die Funktion damped_vibra() in Intervallen über den Tween-Mechanismus aus. Die Funktion verwendet die Bewegungsgleichung der gedämpften Vibration, um die Kameraparameter h_offset und v_offset zu aktualisieren und so den Jitter-Effekt zu erzielen.
  • Wenn das Tweening endet, löst das fertige Signal die Funktion _on_vibra_finished() aus, um die Kameraparameter h_offset und v_offset zurückzusetzen

Referenz

Zhihu: Dämpfung der Bewegung, parametrische Resonanz
Baidu-Enzyklopädie: Dämpfung der Vibration
[Godot] Kameraverwacklung
Godot-Engine: Realisierung des Bildschirmvibrationseffekts
Godot-Shader zur Erzielung eines Verwacklungseffekts

おすすめ

転載: blog.csdn.net/feiyunw/article/details/127642982