Box2D - Kollisiontypen
Übersicht

![]() |
StarGazerBetreff: Box2D - Kollisiontypen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo allerseits,
ich habs es nun geschafft MinGw und Box2D zum laufen zu kriegen, und habe schon etwas mit den Tutorials von Brucey Box2D Module experimentiert, das was ich aber suchte nicht gefunden. Kann man in Box2D einseitig kollidierende Boxen zu erstellen ?, oder auch einfache Linien ?. Ich meine das man außer von oben nach unten, in allen anderen Richtungen hindurch kann (quasie wie bei Polygonen) Ich hoffe diese Möglichkeit gibt es in Box2D. mfg |
||
![]() |
SamFisher |
![]() Antworten mit Zitat ![]() |
---|---|---|
Theoretisch müsste es gehen... Das module baut ja auf box2d auf... Aber was bitte ist den eine einseitig kollidierende Box?? | ||
Commandline is for boys,
GUI is for girls! |
![]() |
StarGazer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiß nicht wie man es sonst nennen sollte.
Man kann durch den Block von unten durch, aber nicht von oben nach unten, wie in 3D, wo die Polygone von außen zwar blocken, aber von hinten durchschreitbar sind. Da ist die Frage ob das in Box2D auch geht, da das Modul schon älter ist, eine frühere Version von Box2D beinhaltet, die das vielleicht noch nicht hatte. Bisher habe ich gefunden wie man einfach eine Box erstellen kann, und dies blockt komplett, oder einzelne Vertexe, also 2 Stück, die einen Line ergeben, die aber auch beidseitig kollidiert. |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich kenne die Library nicht, kann also sein, dass ich völligen Holler rede. Ist es eventuell möglich, dass du zwei Linien erstellst, eine auf der durchschreitbaren Seite und eine auf der soliden Seite. Die auf der durchschreitbaren Seite sollte bei einer Kollision den Spieler nicht blockieren, sondern nur eine Kollision melden. Wenn das passiert, wird die zweite Linie deaktiviert (oder zumindest die Kollision der 2. Linie mit dem Objekt, dass die 1. Linie passiert hat. Sobald dieses Objekt dann keine der beiden Linien mehr berührt, wird die Kollision für die solide Linie wieder aktiviert.
Alternativ könntest du das Ganze auch mit etwas Vektorrechnung lösen. Da nimmst du eine Linie, die durchgehbar ist, aber Kollisionen meldet. Du rechnest dir den Normalvektor auf die Linie aus: Code: [AUSKLAPPEN] P1.x, P1.y = Koordinaten des ersten Punkts
P2.x, P2.y = Koordinaten des zweiten Punkts vP1P2.x = P2.x-P1.x vP1P2.y = P2.y-P1.y Normalisieren: vP1P2Len = sqrt(vP1P2.x*vP1P2.x + vP1P2.y*vP1P2.y) vP1P2norm.x = vP1P2.x / vP1P2Len vP1P2norm.y = vP1P2.y / vP1P2Len Soll die Linie nach Links durchschreitbar sein: norm.x = -vP1P2norm.y norm.y = vP1P2norm.x ansonsten: norm.x = vP1P2norm.y norm.y = -vP1P2norm.x Solange das kollidierende Objekt die Linie berührt: Code: [AUSKLAPPEN] originaleBewegung.x, originaleBewegung.y = Bewegungsvektor ohne Kollision Blockierende Kollision: If (originaleBewegung.x*norm.x+originaleBewegung.y*norm.y < 0) Then originaleBewegung.x=0 originaleBewegung.y=0 EndIf Rutschende Kollision: If (originaleBewegung.x*norm.x+originaleBewegung.y*norm.y < 0) Then slideLen = originaleBewegung.x*norm.x+originaleBewegung.y*norm.y originaleBewegung.x=vP1P2norm.x * slideLen originaleBewegung.y=vP1P2norm.y * slideLen EndIf Bei der rutschenden Kollision bin ich mir nicht ganz sicher mit den Formeln, musst du ausprobieren. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
- Zuletzt bearbeitet von DAK am Do, Mai 01, 2014 18:27, insgesamt einmal bearbeitet
![]() |
StarGazer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Dak,
danke eine gute Idee. Nur würde das umständlich für jeden einzelnen Block abzufragen. Schade daß es zum Mod kein Docu über alle Befehle gibt. Das mit den Normals ist auch interessant. Hab mich schon immer gefragt wie man Normals abfragt ^^ Aber das Minus am Ende verstehe ich nicht " norm.y = vP1P2norm.x- " minus was ? oder ist das so gemeint " norm.y = -vP1P2norm.x " also den Wert umkehren ? sorry wenn ich nicht ganz verstehe, bin in Mathe nicht so der Brüller ^^ |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group