 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 31.01.2009, 15:34 Titel: Polygon - Kollision |
|
|
Hallo!
Ich beschäftige mich im Moment mit dem Thema Festkörpersimulation. Das wichtigste dabei ist ja die Kollision von zwei Objekten.
Ich habe mehrere Tutorials gefunden, und auch Programme mit C-Code. Ich habe versucht, diesen Code in FB zu übersetzen. Allerdings hab ich da noch ein paar Probleme.
Also, von hier hab ich die ganzen Tutorials: http://www.flashforum.de/forum/showthread.php?t=157704
Ich werde mich jetzt im Normalfall auf das Polycollybeispiel fixieren.
Hier hab mir erstmal eine Vektorgrundlage gebastelt:
http://nopaste.info/37d4e1b256.html
Sachen, die ich nicht benutzen werde, hab ich mal weggelöscht ( zum Beispiel doppelte Vektoren, also Vektoren, die neben der Länge noch eine Position haben ).
Jetzt habe ich hier noch eine Polygongrundlage:
http://nopaste.info/ff130c6bb6.html
Allerdings bin ich mir hier nicht immer so sicher. Zum Beispiel die Function Collide(...). Ich bin mir wirklich nicht sicher, ob die Schleife richtig ist. Aber das größte Problem, was ich noch hab, ist, dass ich nicht weiß, was "xOffset" denn ist. Was muss da denn beim Aufruf rein?
Ich denke, ich werde hier noch ein paar mal was fragen müssen, aber ich hoffe, dass mir trotzdem geholfen werden kann. |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 02.02.2009, 20:02 Titel: |
|
|
Ok, ich hab mich nochmal dran gesetzt das ganze zu entwirren.
Jetzt habe ich einmal die Funktion, um ein Polygon auf eine Achse zu reflektieren, bzw. projektieren:
Code: | Function ProjectonAxis( Poly As Polygon, Axis As vector ) As Vector
Dim As Single min, max, pd
min = 99999
max = -99999
For i As Integer = 0 to Poly.numvertices
pd = dot( (Poly.vertices(i)+Poly.center), (Axis) )
If pd < min Then
min = pd
Elseif pd > max Then
max = pd
Endif
Next
Return Type<vector>( min, max )
End Function
|
Und hier die Kontrolle, ob alle Projektionen der Achsen sich überschneiden:
Code: | Function Collide( A As Polygon, B As Polygon ) As UByte
Dim As vector minmaxA, minmaxB, Axis
For i As Integer = 0 to A.numvertices
If i < A.numvertices Then
Axis = A.vertices(i+1) - A.vertices(i)
Else
Axis = A.vertices(0) - A.vertices(i)
Endif
Axis = ( normal(Axis, "z", 1) )
translate_v( A.Center )
draw_vector( Axis, RGB(0,255,0))
minmaxA = ProjectonAxis( A, Axis )
minmaxB = ProjectonAxis( B, Axis )
If minmaxA.x > minmaxB.y Or minmaxA.y < minmaxB.x Then Return 0
Next
For i As Integer = 0 to B.numvertices
If i < B.numvertices Then
Axis = B.vertices(i+1) - B.vertices(i)
Else
Axis = B.vertices(0) - B.vertices(i)
Endif
Axis = ( normal(Axis, "z", 1) )
translate_v( B.Center )
draw_vector( Axis, RGB(0,255,0))
minmaxA = ProjectonAxis( A, Axis )
minmaxB = ProjectonAxis( B, Axis )
If minmaxA.x > minmaxB.y Or minmaxA.y < minmaxB.x Then Return 0
Next
Return 1
End Function |
Dennoch funktioniert das ganze nicht korrekt. Bei so SAchen wie den Differenzen etc. kann ich halt nur ausprobieren, iwe rum es jetzt richtig ist.
Ich hoffe, es ist jetzt etwas klarer, und dass mir jemand helfen kann  |
|
Nach oben |
|
 |
Lloyd

Anmeldungsdatum: 27.06.2008 Beiträge: 37 Wohnort: Nähe Frankfurt
|
Verfasst am: 04.02.2009, 14:49 Titel: |
|
|
So, ich habs jetzt endlich geschafft. Nur, falls es jemanden interessiert
Die Function ProjectonAxis musste etwas verändert werden:
Code: | Function ProjectonAxis( Poly As Polygon, Axis As vector ) As Vector
Dim As Single min, max, pd
min = dot(Poly.Vertices(0)+Poly.Center, Axis)
max = min
For j As Integer = 1 to Poly.numvertices
pd = dot((Poly.vertices(j)+Poly.center), Axis)
If pd < min Then
min = pd
Elseif pd > max Then
max = pd
Endif
Next
Return Type<vector>( min, max )
End Function |
Außerdem war in der vector.bi das Dotproduct falsch.
Stattdem hier:
Code: | Function dot( a As vector, b As vector) As Single
Dim As vector c, d, e
c = normalize(a)
d = normalize(b)
e = c*d
Return e.x+e.y+e.z
End Function |
Musste das hier hin:
Code: | Function dot( a As vector, b As vector) As Single
Return a.x*b.x+a.y*b.y+a.z*b.z
End Function |
Ansonsten mussten nur Kleinigkeiten verändert werden, wie die Differenzen der Vertices und so.
Ich hab hier jetzt nochmal ein Packet gebastelt, wo alles drin ist.
http://npshare.de/files/007309eb/Polygon%20Collision.rar
Ich hoffe, ich konnte auch Anderen jetzt damit helfen, obwohl ich etwas enttäuscht bin, dass ich von selbst auf die Lösung kommen musste  |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|