OpenGL Kollisionserkennung



  • Um wieviele Kugeln gehts da? Wenns nur einige wenige sind kannst du das doch einfach direkt im Shader machen!? Einfach die Mittelpunkte und Radien übergeben und für jeden Vertex den Abstand zum Mittelpunkt testen und dann eben entsprechend verschieben!?

    Den Abstand eines Punktes von einer Ebene bekommst du einfach indem du die Koordinaten des Punktes in die Ebenengleichung einsetzt, da brauchst du von linearer Algebra nicht wirklich viel wissen...



  • Es handelt sich nur um eine Kugel, deren Radius man über die GUI verändern kann.



  • Na dann übergibt doch bitte einfach den Mittelpunkt + Radius an den Shader und verschieb die Vertices entsprechend ihres Abstandes, das ist doch trivial!?

    float3 d = mittelpunkt - vertex;
    float length = dot(d, d);
    
    if (length <= radius)
      vertex += d / length;
    

    oder sowas, wobei radius das Quadrat des Radius ist (um die teure Wurzel zu sparen)...



  • Für mich ehrlich gesagt nicht, deswegen suche ich ja jemanden, der mir das macht. 😕



  • Sry, für dich machen kann ichs leider nicht. Ich kann nur versuchen dir dabei zu helfen es selbst zu machen...



  • Naja...die Sache ist die. Ich werde nach diesem Programm nie wieder was mit OpenGL oder C++ zu tun haben und ich hänge schon 3 Tage an der Kollision, ohne eine brauchbare Zeile stehen zu haben. Ich würde dir auch 200€ dafür geben. Oder bist du zeitlich zu sehr eingespannt, das zu machen?



  • Ich hab leider keine Zeit für sowas 😉



  • Hm...schade. Was mir auf jeden Fall schonmal helfen würde, wäre, wenn ich wüsste, wie ich die 4 Ebenen auf meinem quadratischen "Spielfeld" an den Rändern aufspanne.



  • Das kannst du auch im Programm-Code machen.



  • Eine Ebene ist definierbar durch einen Punkt der in der Ebene liegt (legt die Position fest) und den Normalvektor der Ebene (legt die Ausrichtung fest). Die entsprechende Ebenegleichung ist dann einfach nur: A*x + B*y + C*z + D = 0, wobei A, B und C die x, y und z Koordinaten des Normalvektors sind und D = -<n, p>, also das negative Skalarprodukt des Normalvektors mit einem beliebigen Punkt in der Ebene. Für deine Spielfeldbegrenzungen sollten diese Ebenen also leicht zu berechnen sein da du ja die Eckpunkte wohl kennst und weißt in welche Richtungen die Wände schauen sollen. Wenn du die 4 Parameter A, B, C und D dann kennst kannst du einfach die Koordianten eines beliebigen Punktes als x, y, z in A*x + B*y + C*z + D einsetzen. Der Wert der rauskommt ist dann der Abstand dieses Punktes von der Ebene als Vielfaches des Normalvektors. Wenn dein Normalvektor normalisiert war (Länge 1 hatte) dann kommt da also genau der Abstand des Punktes zur Ebene raus...


Anmelden zum Antworten