Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Die Diskussion zu diesem Thema im Einsteiger-Forum hat mich auf Ideen gebracht. Ich wollte die jetzt einfach mal auf die öffentlichkeit loslassen und mal anregungen und Tipps sammeln:
Für jedes Objekt/Tile eine s/w Map (weiß = Kollision / schwarz=keine Kollision).
Dann immer im falle einer Kollisionsprüfung diese Maps mit dem AND-Operator kombinieren.
Danach müssten an allen weißen Kollisionen stattgefunden haben.
Ideen, Anregungen, Tipps und Kritik zu dieser Idee sind willkommen.
weiß ist etwas schwammig formuliert. Wenn weiß 255 sei und schwarz 0 funktioniert deine Methode.
Nur wie schnell ginge das von statten?
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Es wäre wohl nicht performant genug, um das auf größere Sachen anzuwenden. Bzw. es würde verhältnismäßig viel Speicher benötigen. Wozu überhaupt eine Pixelgenaue Kollisionsabfrage?
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
@Cyberpuer
Das AND-en der Maps würde wahrscheinlich schnell gehen. Nur mit der Auswertung haperts. @Frase
Wenn man jetzt ein 2D-Objekt hat, beispielsweise ein Raumschiff, so ist dieses im normalfall nicht rechteckig. Eine Kollisionsbestimmung wäre hier mit vier Koordinaten also nicht zu machen. Wenn man jetzt die "Pixelgenaue Kollisionsabfrage" verwenden würde, dann würde dieses Raumschiff, selbst wenn es knapp (und ich meine auch knapp so 2 Pixel oder so) an einem Asteroiden vorbeifliegt keine falschmeldung einer Kollision geben.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Die Auswertung ist nicht das Problem, die kann man recht performant machen, indem man jedes Byte des entstehenden Bitmaps (und ich meine wirklich ein Bitmap) auf > 0 testet. Dann macht man mit einem Vergleich 8 Pixels. Dass kann man mit Tricksen auch noch auf 16 und 32 Bits vergrößern.
Das Problem sehe ich bei der Undierung. Da müsste man die beiden Rohbilder erst mal drehen, und dann in 2 größere Bilder einfügen, die man dann Byte (oder Word, Dword, was auch immer)-weise undiert.
_________________ [18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay
hi, i'm a signature viruz, plz set me as your signature and help me spread
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
@Frase
Mit dem AND-Operator kombinieren.
Das Drehen kann man sich eigentlich sparen. Und dann mit den CANVAS (ich weiß is relativ lahm) kombinieren. Oder eben mit DWord. Oder einen eigenen riesigen Datentyp kreieren, der 1024 Bytes aufnimmt
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das ganze geht nur bei einer senkrechten draufsicht auf die Szene oder?
Was du machen willst ist (wenn ich dich richtig verstanden habe):
Den zustand der Szene zu "Fotographieren" allerdings mit den sw-Bitmaps als Textur. Alle nicht zu betrachtenden Objekte sind schwarz. Dann Veränden und auswerten.
Du brächtest:
1. Einen Puffer wo du dein "Foto" reinhaust. Größe je nach Auflösung (ca. 1024x768)
2. Für alle(!) Elemente eine sw-Bitmap (mind. 64x64)
3. Auswertungsalgo. der schnell(!) weiße Felder findet. (Am besten sobald das And true ergibt ein Flag setzt und abbricht)
Das is ne Menge Speicher... Und langsam wirds, wenn du die ganzen SW-Bitmaps binden muss...wobei ... du kopierst die ja nur in den Puffer. Hmmm... eventuell kann man den noch bisl optimieren. Aber ob du damit die Informatik revoluzionierst ist die Frage.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Wieso gleich so nen riesen Aufwand mit nem Monsterpuffer betreiben?
Mal angenommen, wir haben 2 Schiffe beide 64x64. Und diese "Kollisionsmaps" sind echte Bitmaps also nur ein Bit pro Pixel.
Wenn jetzt der Abstand der Positionen 10 Pixel beträgt (sie sind jetzt einfach mal horizontal verschoben) und der vorherige Boundingsphere-Test eine Kollision angibt, dann wird ein Rahmen von sagen wir mal 16x64 Pixeln (10 is nicht durch 8 teilbar und darum nicht so günstig) abgesteckt, in der die Kollision, wenn es eine gibt, liegen muss.
Und nun beginnt der Bitshiftingspaß: Die Bits des einen Kollisionsmaps sollen mit denen des anderen überprüft werden. Da die beiden um 10 Pixel verschoben sind, müssen für den Vergleich die Bits ein wenig geshiftet werden, damit innerhalb eines Bytes (oder noch besser eines Words) immer die richtigen Bits aufeinander treffen. Anschließend kann "mit dem AND-Operator kombiniert" und getestet werden. In unserem Fall könnten wir, wenn wir Words nehmen, mit einem if (a AND b) > 0 eine ganze Zeile auf Kollisionen überprüfen.
Man kann das ganze noch weiter Beschleunigen, indem man die Auflösung der Kollisionsmaps heruntersetzt auf z.B. die Hälfte der Bildschirmauflösung.
_________________ [18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay
hi, i'm a signature viruz, plz set me as your signature and help me spread
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Und man könnte vorher auch noch überprüfen, ob eine genauere Kollisionsprüfung überhaupt nötig ist. Wenn die Objekte 200 Pixel von einander entfernt sind, kann man sich das eigentlich sparen...
Gruß Lord Horazont
P.S. Danke schon mal für die Ideen.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.