Box2D - Kollisiontypen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

StarGazer

Betreff: Box2D - Kollisiontypen

BeitragMo, Apr 21, 2014 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 28, 2014 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 30, 2014 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 30, 2014 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 30, 2014 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ^^

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group