Realistische Kamera- / Bildschirmerschütterung von der Explosion

36

Ich möchte die Kamera während einer Explosion ein wenig herumschütteln, und ich habe ein paar verschiedene Funktionen ausprobiert, um sie herumzuschaukeln, und nichts scheint das wirklich zu geben. Typ Gefühl, das ich suche. Ich habe einige willkürliche, relativ hochfrequente Sinuswellenmuster mit einer gewissen linearen Dämpfung sowie ein Rechteckwellenmuster ausprobiert. Ich habe versucht, nur eine, zwei und alle drei Achsen zu bewegen (obwohl der Dolly-Effekt in diesem Fall kaum spürbar war).

Kennt jemand ein gutes Kameraerschütterungsmuster?

falstro
quelle
2
Versuchen Sie, einige Filmaufnahmen von Kameraerschütterungen nach Explosionen zu finden, und beobachten Sie sie in Zeitlupe, um zu sehen, wie die Kamera wackelt, und stützen Sie Ihren Code darauf.
Skizz
Ich habe genau das gleiche Problem - das Wackeln sieht einfach zu glatt aus
Iain
Das größte Problem, dem ich bei der Implementierung eines Kamera-Shakes gegenüberstehe, ist, dass sich der Spielercharakter (auf den die Kamera fokussiert) anscheinend anstelle der Kamera bewegt. Das Seltsame ist, dass sich die Kamera bewegt, wenn Sie die Umgebung betrachten, die Sie bemerken, aber da Sie sich so auf den Spielercharakter konzentrieren, wird Ihre Wahrnehmung verfälscht. Ich versuche immer noch, dieses Problem zu lösen - wahrscheinlich indem ich das Sichtfeld ändere, wenn sich die Kamera vom Player weg / auf ihn zubewegt.
Kaj

Antworten:

35

Ich habe ein anständiges Verwackeln der Kamera durch Anwenden von Perlin-Rauschen auf die Ausrichtung der Kamera. Es gibt Ihnen einen anständigen großen Ruck mit höherfrequentem Rütteln und kann wirklich gut aussehen.

http://mrl.nyu.edu/~perlin/doc/oscar.html enthält weitere Details und Beispielcode zum Erzeugen von Rauschen.

James Sutherland
quelle
3
Oh, Lärm, warum habe ich nicht daran gedacht? Nach allem, was passiert ist, habe ich einen ziemlich kurzen Lärmstoß, nicht wahr? Ausgezeichnete Idee!
Falstro
Gute Idee, gibt es etwas, das Sie nicht mit Perlin-Rauschen lösen können? : P
Cubed2D
1
Lärm ist definitiv der richtige Weg, wenn Sie sich den Effekt Ihres Nachhineins vorstellen, seine kurzen Änderungen zufälliger Bewegungen in verschiedene Richtungen. Da es sich aber nicht um einen Krampf handeln kann, sind kurze Abschnitte der Gleichmäßigkeit erforderlich. Klingt nach einer perfekten Verwendung für Perlin-Geräusche.
verzögert
17

Wenn Sie sich auf diese ruckelnde Bildschirmerschütterung aus einer Explosion beziehen, habe ich versucht, dies in meinem Prototyp-Spiel zu implementieren (es ist 2D, sollte aber, wie ich erwarte, recht gut in 3D übersetzt werden). Schauen Sie sich das Youtube-Video an und sehen Sie, ob Sie danach suchen - der Screen Shake startet gegen 1:35

Wie auch immer, ich habe es geschafft, ein Ansichtsfenster für den Bildschirm zu erstellen und den Mittelpunkt zu speichern ( centre).

Wenn eine Explosion radiuslosgeht , erstelle ich einen Zufallswert von ~ 30px. Ich versetze dann das Ansichtsfenster centrein zufälliger Richtung um so viele Pixel.

Für jedes nachfolgende Update (zwischen dem Zeichnen auf den Bildschirm) verkleinere ich um radius10-20% und versetze das Ansichtsfenster um so viele Pixel von centreneuem. Anstatt jedoch einen zufälligen Winkel für diesen Versatz zu wählen, nehme ich stattdessen den vorherigen Ansichtsfensterwinkel von centreund füge 180 +/- 60 Grad hinzu.

Im Grunde genommen versetze ich das Ansichtsfenster bei jedem Update (oder 10-20 ms oder so) um eine abnehmende Anzahl von Pixeln vom centreBildschirm.

Hier ist ein Pseudocode:

viewportCentre = (400,300) //Lets say screen size is 800 x 600
radius = 30.0
randomAngle = rand()%360
offset = ( sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) // set centre of viewport
draw()  

while(true)  //update about every 10-20ms
{ 
    radius *=0.9 //diminish radius each frame
    randomAngle +=(180 +\- rand()%60) //pick new angle 
    offset = (sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
    viewport.setCentre(viewportCentre + offset) //set centre of viewport
    draw() //redraw
}

Normalerweise beende ich die Bildschirmschüttelung, wenn der Radius unter 2,0 sinkt centre. An diesem Punkt setze ich das Ansichtsfenster zurück auf .

Miklatov
quelle
4
Ich mag diese Implementierung sehr, funktioniert perfekt für kleine 2D-Spiele. Als Kommentar ist es äquivalent zu tun randomAngle += (150 + rand()%60), um alle +/- Probleme loszuwerden.
Krøllebølle
2
Dein Video ist ausgefallen.
Tara
Welche Art der Berechnung von "+/-"? Ich habe so etwas noch nie gesehen.
Yoo Matsuo
4

Um ein Verwacklungsgefühl zu korrigieren, geht es weniger um die Bewegungsrichtung als vielmehr um Beschleunigungskurven.

Kameraverwacklungen tauchen in den Bereich der Animation ein und daher gelten alle Regeln der Handlung / Reaktion. Wenn Sie sich linear von Punkt zu Punkt bewegen, fühlt es sich glatt und gleichmäßig an und wirkt nicht wie ein Aufprall.

Wenn Sie den Kopf hin und her schütteln, bemerken Sie, dass er sich in der Mitte zwischen Richtungswechsel am schnellsten bewegt und auf jeder Seite langsamer wird, wenn Sie erst abbremsen und dann in die neue Richtung starten müssen.

Hier finden Sie eine Auflistung verschiedener Beschleunigungsfunktionen , die Sie auf Ihre Bewegung anwenden können. Möglicherweise möchten Sie nur die erste Bewegung mit EaseOut deaktivieren, damit sie sich etwas abrupter anfühlt, und dann mit EaseInOut den Rest, um die Kopf- / Kamerabewegung zu simulieren.

wkerslake
quelle
1
Ich denke, eine Lockerung würde es immer noch zu glatt machen. Das Perlin-Rauschen scheint eine gute Idee zu sein, oder ein einfacher Zufall, bei dem der Zufallsbereich mit der Zeit auf Null abfällt, damit er ausgeblendet wird Selbst macht die Kamera das Gefühl, als wäre sie auf einer Feder, fühlt sich meiner Erfahrung nach nicht richtig an, wenn die Kamera verwackelt.
Kaj
3

wkerslake hat recht, verwackelte kameras wirken komplexer als man denkt.

Wenn Sie eine verwackelte Kamera emulieren, müssen Sie überlegen, welchen Kameratyp (Operator) Sie nachahmen möchten. Das Gewicht der Kamera beeinflusst die Trägheit, z. Schwere Kameras gleichen kleine „zufällige“ Bewegungen aus. Ein Kameramann auf einer Schiene oder in einem Auto fügt zusätzliches Rauschen hinzu.

Die Verwendung von Perlin- oder Simplex-Rauschen ist definitiv eine Option. Dann geht es darum, das richtige Gleichgewicht zwischen verschiedenen Rauschverhältnissen zu finden. Die Interpolation zwischen Werten ist jedoch weniger rechenintensiv und kann genauso effektiv sein.

Vor einiger Zeit habe ich ein Maya-Skript gefunden, das eine Menge Dinge richtig zu machen scheint. Sie könnten einen Blick auf, dass .

Vielleicht möchten Sie auch einen Blick auf Gran Turismo (5) werfen , dessen Team beeindruckende Arbeit darin geleistet hat, verschiedene Arten von Verwacklungen mit Echtzeitkameras auszuführen, wenn Sie sich eine Wiederholung im Spiel ansehen.


quelle
2

Wenn Sie eine dynamische Objektphysik haben (wahrscheinlich nicht das richtige Wort, aber so wie ich es meine), bei der Objekte, die nicht repariert wurden, durch die Explosion "weggeblasen" würden, könnte die Kamera als solches Objekt betroffen sein.
Der einzige Unterschied wäre, nur die Drehung / Neigung / Gier / Roll der Kamera und nicht die Position zu ändern.
Sonst vielleicht eine Zufallszahlenfolge generieren und diese irgendwie in Rotation umwandeln? Denken Sie, dass eine Höhenkarte, Graustufen-Inhalte ein Beispiel sein könnten. Sie sind nicht völlig verschieden, sondern zufällig.

Die kommunistische Ente
quelle
+ 1 interessante Idee, ich denke, ich werde die Geräuschbewegung ausprobieren, und wenn ich sie zum Laufen gebracht habe, werde ich versuchen, einen smoth dolly-Effekt hinzuzufügen, so als ob die Kamera an einer Feder befestigt und nach hinten gedrückt wäre durch den Schock.
Falstro