Forum: PC-Programmierung Animationen und Überlagerung der animierten Objekte


von Jumbo (Gast)


Lesenswert?

Hallo,

ich habe ein eher ungewöhnliches Problem mit animierten Objekten, dass 
mir unabhängig von der Programmiersprache zu sein scheint:

In einer View-Ebene animiere ich Wolken unterschiedlicher Größe und 
Geschwindigkeit. Die Wolken bewegen sich alle in die selbe Richtung und 
Treten nach Verlassen des Viewports einfach auf der gegenüberliegenden 
Seite wieder in die View ein. Kleine Wolken sollen weiter entfernt 
erscheinen und bewegen sich dementsprechend langsam über die X-Achse. 
Größere Wolken sollen näher zum Betrachter hin erscheinen und bewegen 
sich daher schneller über die X-Achse. Die Objekte verteile ich über 
X/Y-Koordinaten auf der View und berechne dann dynamisch die zwei 
Teil-Strecken und -Zeiträume(einmal von den Start-Koordinaten bis zum 
Verlassen der View und dann auf der gegenüberliegenden Seite vom 
Wiedereintritt in die View bis zum Erreichen der Start-Koordinaten. Dort 
wiederholt sich die Animation dann.). Das funktioniert auch soweit und 
sieht direkt nach dem Start der Animation auch ausreichend realistisch 
aus.

Das Problem: Es gibt durch die unterschiedlichen Geschwindigkeiten der 
Wolken immer wieder mal ein "Zusammentreffen" mehrerer oder sogar aller 
Wolken, vergleichbar mit der Planeten-Konjunktion in der Astronomie bzw. 
so etwas wie eine Interferenz der Animations-Objekte.

Was ist hier die sinnvollste Lösung, um derartige "Konjunktionen" zu 
verhindern oder zumindest zu minimieren, wenn die Geschwindigkeit der 
einzelnen Wolken für den Betrachter nahezu konstant erscheinen soll?

Gibt es eine Formel oder ein Programm, mit dem man derartige 
Konjunktionen vorhersagen bzw. minimieren kann? Je länger es bis zur 
Konjunktion dauert, desto besser...ich hatte mir schon überlegt, die 
Wolken auf einen identischen X-Wert zu legen und dann die Animation so 
lange laufen zu lassen, bis die Wolken weit genug auseinander sind und 
diese gemessenen Werte dann als optimale Start-Werte zu benutzen. Diese 
Werte gelten dann aber wohl nur für eine Auflösung...

Oder gibt es Algorithmen, mit denen man diese Konjunktionen generell 
verhindern kann? Ich überlege gerade, ob es mit einer größeren Menge an 
animierten Wolken besser funktioniert, wenn man immer nur eine 
variierende kleine Auswahl an Sprites animiert, bei der die 
Geschwindigkeiten so gewählt sind, dass keine Konjunktions-Gefahr droht.

Viele Grüße,
Jumbo

von Karl H. (kbuchegg)


Lesenswert?

Jumbo schrieb:

> Was ist hier die sinnvollste Lösung, um derartige "Konjunktionen" zu
> verhindern oder zumindest zu minimieren

Wozu verhindern?

Du brauchst 2 Dinge
* zum einen darfst du nur das Innere einer Wolke malen. D.h. wenn du 
eine Bitmap für die Wolke hinzeichnest, dann dürfen auch wirklich nur 
die Pixel gesetzt werden, die zur Wolke gehören und nicht die eines 
Himmels.
Jedes bessere Malprogramm kann Pixel auf 'keine Farbe' setzen. Und genau 
das brauchst du auch hier: Du willst beim Hinmalen tatsächlich nur die 
Pixel setzen, die zur Wolke gehören und nur diese.

* Reihenfolge:
malst du deine Wolken beim Bildaufbau eines Teilbildes der Animation von 
'hinten nach vorne' dann überdecken automatisch im Vordergrund liegende 
Wolken die hinteren. Die gleiten dann in der Animation automatisch 
korrekt über die dahinter liegenden drüber.
Das ganze ist als "Painter-Algorithmus" bekannt und viele Spiele, wie 
zb. SimCity beruhen darauf, dass beim Aufbau eines neuen Bildes einer 
Sequenz nicht einfach Objekte in wahlloser Reihenfolge gemalt werden, 
sondern dass der Bildaufbau von hinten nach vorne erfolgt (zuerst die 
entfernten und dann die jeweils näher am Betrachter liegenden).


Langer Rede kurzer Sinn:
Du willst derartige Kollisionen gar nicht weg haben. Ganz im Gegenteil 
sind sie ein wichtiger Aspekt um einem Benutzer eine räumliche Tiefe 
vorzugaukeln. Ohne derartige Überdeckungen sieht er einen Haufen 
unterschiedlich großer Wolken über den Himmel ziehen. Erst die 
Verdeckung gibt seinem Gehirn den Hinweis, dass die eine Wolke 
tatsächlich näher ist als die andere und die scheinbar unterschiedliche 
sichtbare Größe der unterschiedlichen Entfernung geschuldet ist.
Daher: behandle das einfach richtig und du hast mehr davon.

: Bearbeitet durch User
von uwe (Gast)


Lesenswert?

Wenn aber eine kleine schnelle Wolke schneller akltuallisiert werden um 
nicht so große Sprünge zu haben benutzt du halt die Objektkollision und 
das Objekt mit dem größeren oder kleinerm Z-Wert gewinnt (natürlich muß 
jede Wokke bei erzeugung nen Z-Wert bekommen in welcher Ebene Sie 
schwebt).

von Jumbo (Gast)


Lesenswert?

Hallo,

ich glaube ihr habt mein Problem falsch verstanden...ich benutze bereits 
Grafiken mit transparentem Hintergrund und habe für die Wolken separate 
Subviews in einer bestimmten Reihenfolge erstellt, damit die 
perspektivische Überlagerung korrekt ist.

Mein Problem besteht doch nur darin, dass sich die Wolken durch die 
unterschiedlichen Geschwindigkeiten nicht nur einfach überholen, sondern 
sich durch die konstanten Loop-Zeiträume irgendwann für kurze Zeit alle 
am selben X-Wert befinden. Und das sieht dann eben extrem unnatürlich 
aus, wenn 10 Wolken ein senkrechte Linie bilden und der restliche Himmel 
klar ist. Klar, das geht wieder vorbei, aber es passiert auch mit 
Teilmengen: es sind auch mal nur 5 Wolken am gleichen Platz, sieht aber 
trotzdem doof aus. Vielleicht sollte ich dazu sagen, dass ich keine 
flächige Wolken-Decke animiere, sondern einzelne Cumulus-Wolken. Da 
wirkt es unnatürlich wenn mehrere Wolken an einem Punkt versammelt sind.

Man könnte es auch mit Vögeln erklären: Stellt euch den Bildschirm in 10 
Reihen unterteilt vor, in jeder Reihe sitzt ganz links ein Vogel.
Jetzt fliegen die Vögel gleichzeitig, aber mit unterschiedlichen 
Geschwindigkeiten los. Verschwindet ein Vogel am rechten Bildschirmrand, 
taucht er direkt danach am linken Bildschirmrand auf gleicher Höhe 
wieder auf. Irgendwann werden alle Vögel eine vertikale Linie bilden, 
weil sie sich auf der gleichen horizintalen Position befinden. Und genau 
das möchte ich irgendwie verhindern. Die Vögel bzw. die Wolken sollen 
möglichst  gleichmäßig verteilt fliegen, aber eben mit unterschiedlichen 
Geschwindigkeiten.

Viele Grüße,
Jumbo

von Karl H. (kbuchegg)


Lesenswert?

Jumbo schrieb:

> Mein Problem besteht doch nur darin, dass sich die Wolken durch die
> unterschiedlichen Geschwindigkeiten nicht nur einfach überholen, sondern
> sich durch die konstanten Loop-Zeiträume irgendwann für kurze Zeit alle
> am selben X-Wert befinden. Und das sieht dann eben extrem unnatürlich
> aus, wenn 10 Wolken ein senkrechte Linie bilden und der restliche Himmel
> klar ist.

Ah. ok.
Ich dachte du hättest ein technisches Problem. Das ist dann nicht klar 
rüber gekommen.

Tja. Da wirst du dir was ausdenken müssen.

Wenn 20 Autos in einer Linie aufgereiht sind und alle gleich schnell an 
dir vorbei fahren, dann gibt es natürlich einen Punkt, an dem sich die 
Autos alle überdecken. Sieht man auch bei jeder Militärparade.

Warum ist das dann in der Natur eher selten der Fall? Weil Wolken eben 
nicht alle gleich schnell ziehen. D.h. gib deine strenge Umrechnung der 
Geschwindigkeit in die perspektivische Tiefe auf bzw. lass kleine 
Variationen zu bzw. lass Wolken zwischendurch auch mal ein wenig 
schneller oder langsamer fliegen.

Was du da beschrieben hast, was du da alles berechnest, kommt mir 
sowieso etwas zu kompliziert vor.

> Jetzt fliegen die Vögel gleichzeitig, aber mit unterschiedlichen
> Geschwindigkeiten los. Verschwindet ein Vogel am rechten Bildschirmrand,
> taucht er direkt danach am linken Bildschirmrand auf gleicher Höhe
> wieder auf. Irgendwann werden alle Vögel eine vertikale Linie bilden,
> weil sie sich auf der gleichen horizintalen Position befinden. Und
> genau das möchte ich irgendwie verhindern.

Solange jeder Vogel für sich immer die gleiche Geschwindigkeit fliegt, 
lässt sich das auch nicht verhindern. Ansonsten musst du 3000 Jahre 
zurück gehen und die Mathematik ändern. Zu 2 (oder n) beliebigen Zahlen, 
gibt es immer eine andere Zahl, so dass jede einzelne der Zahlen 
ganzzahlig darin enthalten ist. Bei 2 Zahlen nennt man das das kgV, das 
kleinste gemeinsame Vielfache.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Andere Möglichkeit.
Ist eine Wolke am rechten Rand angelangt, dann startet sie nicht sofort 
wieder von links, sondern legt eine zufallsgesteuerte Pause ein, ehe sie 
wieder von links reinkommt, mit einer eventuell etwas höheren oder 
niedrigeren Geschwindigkeit als sie anhand ihres Tiefenwertes und der 
generellen Geschwindigkeit der Wolkendecke eigentlich haben sollte.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.