Kollisionsabfrage --- Die beste Lösung.
-
Hallo.
Ich bin grad dabei ein simples 2D Spiel zu machen.
Nun habe ich eine Frage zum Thema Kollisionsabfrage.
Die Figuren in meinem game haben je eine Bounding box.Das Problem ist folgendes:
Jede Figur (eine Instanz der Klasse xtFigure) hat ein methode namens TestCollision.
Dieser wird ein Zeiger auf ein anderes xtFigure Objekt übergeben.Nun will ich pro Schleifendruchlauf (der main-loop), dass JEDE Figur mit JEDER ANDEREN Figur GENAU EIN MAL auf Kollision getestet wird.
Wie stelle ich es am besten an, dass sich diese Kollisionstests nicht überschneiden?
zb(das soll nicht passieren,da sinnlos verschwendete Performance):
Es gibt drei Figuren. Die Kollisionstest sollen SO nicht ablaufen:-
: Figur1 testet Figur2 auf Kollision
-
: Figur1 testet Figur3 auf Kollision
-
: Figur2 testet Figur1 auf Kollision <== Überschneidung. SIEHE "1)"
-
: Figur2 testet Figur3 auf Kollision
-
: Figur3 testet Figur1 auf Kollision <== Überschneidung. SIEHE "2)"
-
: Figur3 testet Figur2 auf Kollision <== Überschneidung. SIEHE "4)"
Wie kann ich diese Überschneidungen vermeiden? (Hat es irgendwas mit Fakultät zu tun?)
Entschuldigung, falls ich dumm frage. Meine Mathe-Kenntnisse sind begrenzt.
Ich erwarte keinen fertigen code sondern besser eine Erklärung in Textform.
Wenn jemand allerdings einen bsp-code posten will, dann freue ich mich natürlich auch darüber.MfG,
nicht TGGC
-
-
auf anhieb fällt mir ein: alle figuren in einer liste/array etc. speichern und wer alle kollisonstest gemacht hat fliegt raus. also figur1 testet alle, fliegt dann raus, figur2 testet nur noch mit figur3 und fleigt dann raus, figur3 braucht nichts mehr zu testen (ist als einziger in der liste)...
-
net schrieb:
auf anhieb fällt mir ein: alle figuren in einer liste/array etc. speichern und wer alle kollisonstest gemacht hat fliegt raus. also figur1 testet alle, fliegt dann raus, figur2 testet nur noch mit figur3 und fleigt dann raus, figur3 braucht nichts mehr zu testen (ist als einziger in der liste)...
Hmm. Stimmt. Danke.
So könnts funktionieren. 1 bis 6 sind die Figuren. (Hat ja doch was mit Fakultät zu tun)1 2 3 4 5 6 ============ 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1
-
---------------------------------------------
Nächstes Problem:(Ich möchte jetzt keinen neuen Thread aufmachen. Deswegen poste ich hier rein.)
Meine Kollisionsabfragen funktionieren schon. Die Figuren können sich rotieren.
Dann wäre es schön, wenn sich die bounding box mitrotieren würde.
(Ich hatte mal einen Quellcode, der das zeigte. Leider hab ich die cd nicht mehr
)Kann mir bitte jemand ein (Code)Beispiel geben, wie man die Bounding Box rotiert und dann auf Kollision der beiden Bounding Boxen prüft?
Danke.
-
Ich stelle hiermit die These auf, dass das sehr viel Mathematik ist und ein Codebeispiel dich nicht viel weiterbringt.
Du musst eine der beiden Boxen so rotieren, verschieben etc, dass du die andere einfach so lassen kannst und dann prüfst, ob einer der vier Eckpunkte der rotierten (etc) Box innerhalb der anderen liegt. Wenn nicht, prüfst du, ob die Verbindunglinien zwischen den vier Punkten durch die Box gehen.
-
net schrieb:
alle figuren in einer liste/array etc. speichern und wer alle kollisonstest gemacht hat fliegt raus.
Rausschmeissen ist völlig unnötig. Es reicht einfach nur ein Objekt mit dem Objektem die in der Liste dahinter liegen zu testen.
Das hat übrigens nichts mit Fakultät zu tun. Das ist eher ein halbes Quadrat, sieht man doch!
Kollisionsabfrage zwischen konvexen Polyedern macht man immer noch, in dem man eine "separating axis" sucht.
Bye, TGGC (Fakten)
-
TGGC schrieb:
Kollisionsabfrage zwischen konvexen Polyedern macht man immer noch, in dem man eine "separating axis" sucht.
Da ich auch gerade ein 2D-Spiel programmiere, interessiert mich das natürlich auch. Was ist eine "seperating axis"? Und was macht man mit konkaven Polyedern (auch wenn das wahrscheinlich selten vorkommt)?
-
Eine separating Axis teilt den Raum in zwei Halbräume, jeder der Polyeder liegt komplett in einem dieser. Somit gibt es keine Kollision. Konkave Objekte muss man in konvexe zerlegen.
Bye, TGGC (Fakten)
-
Ah! Okay, danke!
-
TGGC schrieb:
Eine separating Axis teilt den Raum in zwei Halbräume, jeder der Polyeder liegt komplett in einem dieser. Somit gibt es keine Kollision. Konkave Objekte muss man in konvexe zerlegen.
Bye, TGGC (Fakten)
Kannst du mir bitte einen link zu einem Tutorial/änlichem geben? Ich habe noch nie was von "seperating Axis" und "Konkave Objekte" gehört. Das sagt mir alles nichts.
-
2d_objekt_ihrer_wahl someObj[10]= //z.b obj1,obj2,obj3,obj4 for(int bottom=0;bottom<10;++bottom) { for(int i=bottom+1;i<10;++i) { teste_kollision(someObj[bottom],someObj[i]); } }ein zähler (bottom) zeigt an, wo du beim nächsten durchlauf das suchen anfängst. wenn du einmal alle kollisionen getestet hast, geht bottom 1 hoch und testet nun obj1 nicht mehr, da es schon fertig getestet ist.
-
Sag ich doch 8).
Bye, TGGC (Fakten)