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
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.
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).
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
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.
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.