AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi 2D Bitmap und "Boundingboxes"

2D Bitmap und "Boundingboxes"

Ein Thema von igel457 · begonnen am 19. Jul 2006 · letzter Beitrag vom 20. Jul 2006
Antwort Antwort
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

2D Bitmap und "Boundingboxes"

  Alt 19. Jul 2006, 15:13
Hallo.

Ich habe ein kleines Problem. Ich möchte die 2D S/W Maske einer bliebigen Landschaft in meinem 2D Spiel in kleine, virtuelle Rechtecke unterteilen, mit denen ich schneller Kollisionsabfragen machen kann. Meine Frage ist nun: Wie schreibe ich einen solchen Algorythmus? Gibt es da irgendwo Anleitungen? Wie würdet ihr vorgehen?

Ich habe mal ein Beispiel, wie das aussehen soll, angehängt...

Igel457
Miniaturansicht angehängter Grafiken
boxes_194.png  
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von arbu man
arbu man

Registriert seit: 3. Nov 2004
Ort: Krefeld
1.108 Beiträge
 
Delphi 7 Professional
 
#2

Re: 2D Bitmap und "Boundingboxes"

  Alt 19. Jul 2006, 15:38
Das ähnelt etwas einen 2d octree verfahren, aber ein genauer algorithmus ist schwirig.
Wahrscheinlich würde es sehr lange dauern eine solche matrix zu stellen.
Aber man könnte so vorgehen:


Das bild in Spalten oder Zeilen einteilen. (z.B. mit 60px weite)


dann jede einzele spalte untersuchen: und ab einer gewissen anzahl von pixeln (z.b. 20px) ein rechteck beginnen und wenn dann wieder weniger pixel da sind das recheck benden.

Danach könnte man die Spalten noch optimieren.
Miniaturansicht angehängter Grafiken
2d_octree_371.png  
Björn
>> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: 2D Bitmap und "Boundingboxes"

  Alt 19. Jul 2006, 19:03
HI,
dass das einem Octree für 2D ähnelt finde ich ist eine lustige Idee. Der 2D Octree heißt (ganz logisch) Quadtree. Die Idee entspricht eigentlich genau der eines Octree oder BinTree. Fangen wir mal unten an.
Bei keiner Dimension habe ich einen Punkt, Kollision ist trivial.
Bei einer Dimension kann ich weiter nach links oder Rechts gehen. Teile ich also eine gerade in der Mitte in zwei Teile und diese Teile wieder in der Mitte... Ich hätte einen Binären Baum.
Bei zwei Dimensionen habe ich Höhe und Breite. Der Einfachheit halber können wir sogar von einem Quadrat ausgehen (macht die Sache auch schneller). Hier kann ich jetzt einfach das gesamte Quardrat in 4 Teile zerlegen, diese wieder in 4 usw.
Bei drei Dimensionen brauche ich wieviel Teile? Genau 2^{3} oder auch 8 -> Octree. Du zerlegst den Raum in 8 Quarder, diese wieder in 8...

Warum macht man das? Na ja, z.B. zur Kollisionskontrolle. Im zwei Dimensionalen Raum kann ich gucken, in welchem der 4 Quadrate sich mein betrachteter Körper befindet. Es können bis zu 3 Quadrate (75%) rausfallen aus der Betrachtung. So schränkt man einfach den Bereich ein, den man absucht. Gut, doch woher weiß man jetzt in welchen Quadraten sich ein Körper befindet? Richtig man baut eine Boundingbox rum. Die Beschreibt ungefähr die Form des Körpers, tut dies jedoch geometrisch sehr einfach durch Rechtecke, mit denen man leichter rechnen kann. Also ist es nicht eine Art von 2D Octree, sondern wird benötigt um den Quadtree sinnvoll anzuwenden.
Der Weg der hier angegeben wurde ist eine Möglichkeit. Du kannst aber wieder den Quadtree Trick anwenden. Du gehst ja rekursiv vor und die einzelnen Quadrate werden immer kleiner. Dies machst du bis sie deine Toleranzgrenze (du willst ja eine ungefähre Box) erreicht haben (also alles von deinen Körpern liegt tolerierbar von der Kante des umgebenden Quadrats entfernt). Nun kannst du einfach für alle Quadrate schauen, ob sich hierin ein Körper befindet (z.B. geg. durch die Farbe). Wenn ja, fässt du den einfach mit den Nachbarn, die auch einen Körper enthalten zu einem größeren Körper zusammen. So hast du dann ein Rechteck, dass sich aus ein paar dieser Quadrate zusammen setzt.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

Re: 2D Bitmap und "Boundingboxes"

  Alt 20. Jul 2006, 08:18
Danke für die Tipps.

Werde es nachher mal ausprobieren!
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#5

Re: 2D Bitmap und "Boundingboxes"

  Alt 20. Jul 2006, 10:25
ich würde dir statt eines QuadTrees einen kdTree empfehlen. bei dem wird die Fläche nicht immer in 4 genau gleich grosse quadrate weiter unterteilt, sondern es wird immer nur in 2 bereiche unterteilt, wobei die schnittgeraden zw. den Bereichen abwechselnd waagerecht und seknrecht verlaufen. Und die Position der Schnuttgeraden kann man dabei auch variieren, z.b. so dass sich links und rechts der Schnittgeraden etwa gleich viele objekte befinden.
Das ganze kann man dann auch auf 3D ausweiten, hier findest du ein paar bilder zu 2D und 3D: http://en.wikipedia.org/wiki/Kd-tree
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
Phobeus

Registriert seit: 14. Sep 2003
Ort: Tespe
65 Beiträge
 
Delphi 7 Professional
 
#6

Re: 2D Bitmap und "Boundingboxes"

  Alt 20. Jul 2006, 10:33
Das Bild sagt nicht viel aus über die tatsächliche Dimension, die letztendlich angestrebt wird. Dennoch möchte ich an dieser Stelle hinweisen, dass QuadTrees und auch BSP in vielen aktuellen Fällen sogar kontraproduktiv sein können, da mehr Einteilungen vorgenommen würde als die CPU per Bruteforce durchjagen könnte. Sollte z.B. nur der Spieler auf Kollision geprüft werden, könnte es mehr Sinn machen, wenn man um die Zielobjekte eine große Kollisionsbox legt. Befindet sich der Spieler in diesem Bereich, wird eine detaillierte Kollision vorgenommen und zwar auf gut Glück alle durch. So wird der Spieler vermutlich entweder den Boden oder gegen die Decke springen... beides gleichzeitig könnte in manchem Projekt unwahrscheinlich sein. Ggf. macht es noch einen Sinn eine Eben darüber oder darunter zu unterteilen... also zu sehen, ob der Spieler in einem Sektor ist und nur jene Objekte darinne zu prüfen, oder halt den Kollisionsbereich noch einmal in zwei Teile zu unterscheiden. Eine viel feinere Abstimmung oder gar ein komplexer Quadtree würden vermutlich unterm Strich nicht nur schwerer zu implementieren sein, sondern auch mehr Leistung kosten als es nötig wäre. (BSP bremst aktuelle Quake-Titel auf aktuellen Rechnern). Eine solche Überlegung lohnt sich nur dann, wenn Du wenige Objekte hast, die kollidieren... nimmt dessen Zahl zu (zahlreiche Gegener ohne feste Pfade, Geschosse deren Bahn nicht vorbestimmbar ist etc.), kann ein QuadTree oder vergleichbares natürlich sinnvoll sein.
Florian Sievert
http://www.delphigl.com/
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#7

Re: 2D Bitmap und "Boundingboxes"

  Alt 20. Jul 2006, 18:20
Hallo,

Ich habe es jetzt einigermaßen hinbekommen. Im Endeffekt ist es jetzt so, wie Arbu Man vorgeschlagen hat. Mein Spiel läuft auch merklich schneller.
Ich habe die Unit, ein Beispielprojekt und einen Screenshot meines Spiels angehängt.
Miniaturansicht angehängter Grafiken
boxes_120.png  
Angehängte Dateien
Dateityp: rar collision1_115.rar (5,8 KB, 26x aufgerufen)
Dateityp: pas collisionrects_591.pas (4,1 KB, 18x aufgerufen)
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz