Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Polygon - Kollision

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 31.01.2009, 15:34    Titel: Polygon - Kollision Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 02.02.2009, 20:02    Titel: Antworten mit Zitat

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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lloyd



Anmeldungsdatum: 27.06.2008
Beiträge: 37
Wohnort: Nähe Frankfurt

BeitragVerfasst am: 04.02.2009, 14:49    Titel: Antworten mit Zitat

So, ich habs jetzt endlich geschafft. Nur, falls es jemanden interessiert Zunge rausstrecken

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 Zunge rausstrecken
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz