Flackern bei 2D Kamera

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Benutzeravatar
FSA9Code
Beiträge: 7
Registriert: 21.07.2018, 11:20

Flackern bei 2D Kamera

Beitrag von FSA9Code »

Guten Abend,

ich beschäftige mich aktuell mit der Kamera für ein 2D Spiel. Die Kamera wird direkt über der Spielfigur positioniert, die Spielfigur befindet sich also in der Mitte und die Umgebung bewegt sich. Leider tritt jetzt in gewissen Konstellationen ein Flackereffekt auf, wenn sich die Spielfigur und ein weiterer Sprite mit gleicher Geschwindigkeit in die gleiche Richtung bewegen:

Start --> Player (0f, 0.25f), Sprite (0f, 0.75f) --> wird gerendert auf Player (0, 0), Sprite (0, 0) --> Offset Player/ Sprite (0f, 0f)
Step 1, +(0f, 0.5f) --> Player (0f, 0.75f), Sprite (0f, 1.25f) --> wird gerendert auf Player (0, 0), Sprite (0,1) --> Offset Player/ Sprite (0, 1)
Step 2, +(0f, 0.5f) --> Player (0f, 1.25f), Sprite (0f, 1.75f) --> wird gerendert auf Player (0, 1), Sprite (0,1) --> Offset Player/ Sprite (0, 0)
Step 3, +(0f, 0.5f) --> Player (0f, 1.75f), Sprite (0f, 2.25f) --> wird gerendert auf Player (0, 1), Sprite (0,2) --> Offset Player/ Sprite (0, 1)
Step 4, +(0f, 0.5f) --> Player (0f, 2.25f), Sprite (0f, 2.75f) --> wird gerendert auf Player (0, 2), Sprite (0,2) --> Offset Player/ Sprite (0, 0)
Step 5, usw.

...der Offset zwischen Player und Sprite verändert sich in jedem Step um 1 Pixel, was sich in einem sehr bemerkbaren Flackern auswirkt.

Ich bin sicher nicht der Erste der auf dieses Problem gestoßen ist, gibt es dafür eine Lösung oder Workaround? Es sind alle Bewegungsrichtungen möglich, wenn es nur die Achsen wären könnten man z.B. auf ganzzahlige Richtungsvektoren beschränken.
Benutzeravatar
marcgfx
Establishment
Beiträge: 2050
Registriert: 18.10.2010, 23:26

Re: Flackern bei 2D Kamera

Beitrag von marcgfx »

Was ich empfehle ist die Kamera gleiten zu lassen, d.h du gibst der Kamera eine Zielposition und bewegst sie mit Lerp auf das Ziel hinzu.

//sowas in ungefähr
neuePosition = lerp(aktuellePosition, zielPosition, deltaTime);

edit: habe wohl die Frage falsch verstanden und es geht tatsächlich um die Pixel
Zuletzt geändert von marcgfx am 11.08.2020, 01:22, insgesamt 1-mal geändert.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2352
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Flackern bei 2D Kamera

Beitrag von Jonathan »

Wie und womit wird denn gerendert?
Wenn man texturierte Dreiecke rendert dann sollten doch auch eigentlich Eckpositionen zwischen Pixeln möglich sein und die Textur wird dann entsprechend gefiltert, so dass es flüssig aussieht.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
FSA9Code
Beiträge: 7
Registriert: 21.07.2018, 11:20

Re: Flackern bei 2D Kamera

Beitrag von FSA9Code »

Es werden Sprites ohne weitere Veränderung auf dem Bildschirm ausgegeben. Ich bin mit der korrekten Terminologie nicht vertraut, ich hoffe das klappt mit dem GIF, dann wird es verständlicher:
CamFlackern.gif
Auf die schwarze Figur wird die Kamera positioniert. Die Blaue bewegt sich mit der gleichen Geschwindigkeit und Richtung wie die Schwarze. Das Problem liegt in der Geschwingikeit von 0.5/frame und den unterschiedlichen Nachkommaanteil der beiden Positionen.
Benutzeravatar
starcow
Establishment
Beiträge: 523
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Flackern bei 2D Kamera

Beitrag von starcow »

Ich meine, dieses Problem muss gut (im Sinne von einfach und sauber) und ohne komplizierte Ausnahmen lösbar sein. Denn:
Die blaue Figur hat ja in jedem Frame genau den selben Abstand (Offset) zur schwarzen Figur (0.5). Und wenn sich dieser Offset als Fliesskommazahl nicht ändert, du folglich auch immer einen konstanten (den selben) Ganzzahlenwert bekommst und auch die schwarze Figur konstant (unbeweglich) im Bildzentrum bleibt - ja, dann _muss_ es vom Prinzip her möglich sein, das ganze "zitterfrei" gerendert zu bekommen.
Du musst deinen Prozess dahingehend ändern, dass du erstmal die Position der Sprites _relativ_ zur Kamera berechnest (als Flieskommazahl) - und erst danach die Werte rundest und renderst.
Ich würde wohl eine Kameraklasse dafür einsetzen, welche du dann frei wählbar an eine Figur "constrainen" kannst. Vor dem rendern werden dann alle Positionen relativ zu der Kameraposition berechnet.

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Jonathan
Establishment
Beiträge: 2352
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Flackern bei 2D Kamera

Beitrag von Jonathan »

Ok, deine Pixel scheinen relativ groß zu sein (1 Spiel Pixel = 8 Bildschirmpixel oder sowas). Dadurch verstärkt sich der Effekt natürlich.

Was wird denn überhaupt als Grundlage benutzt? Welche Sprache / Framework?

Ich sehe hier prinzipiell zwei Möglichkeiten. Entweder du behältst diese diskreten Pixelpositionen bei. Dann sollten alle Objektpositionen aber auch nur Integer sein und alle Geschwindigkeiten wären in Pixel pro Frame (als ganze zahl). Dadurch hast du keine komischen Rundungsfehler und wenn sich zwei Objekte mit der selben Geschwindigkeit bewegen bleibt auch der Abstand immer gleich. Was bedeutet es denn z.B. jetzt gerade wenn ein Objekt an Position 1.5 anstatt 1.0 ist? Es wird ja scheinbar in beiden Fällen gleich gezeichnet, wofür brauchst du die höhere Genauigkeit?

Die andere Lösung wäre es, die Fließkommapositionen beizubehalten und dann die Sprites ohne gerundete Positionen zu rendern. Da die Pixel sehr groß aussehen, sollte das eigentlich möglichsein (nochmal: Um welches Framework geht es hier?) und würde dann sehr weich aussehen. Die Frage ist natürlich ob das zum Stil passt.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Antworten