Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 14:26

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 2D Kollision mal anders
BeitragVerfasst: Do Dez 08, 2005 12:17 
Offline
DGL Member
Benutzeravatar

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.

Gruß Lord Horazont


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 08, 2005 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 08, 2005 16:27 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
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'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 08, 2005 16:33 
Offline
DGL Member
Benutzeravatar

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. :wink:
@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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 08, 2005 16:53 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Dann würde ich aber etwas anders an die Sache herangehen:
  • Testen, ob ein Objekt in der Bounding Box des Raumschiffs ist (z.B. ein Stückchen Asteroid oder ein Schuss)
  • Dann erst pixelgenau testen

Da reicht dann aber meist auch aus, nur das Raumschiff pixelgenau zu testen und von einem Geschoss nur die Boundingbox zu testen.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 08, 2005 17:40 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
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 :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 08, 2005 17:42 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Was ist "undieren"?

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 09, 2005 14:45 
Offline
DGL Member
Benutzeravatar

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

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 09, 2005 15:54 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 10, 2005 14:58 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
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 :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 11, 2005 18:49 
Offline
DGL Member
Benutzeravatar

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... :wink:

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.020s | 17 Queries | GZIP : On ]