Position von Punkten in OpenGL



  • Moinsn

    schreib gerage an einem 3Dstrategiespiel. Heightmap und so klappt schon wunderbar, nun brauch ich aber eine Funktion, die mir die 2dimensionale Position (Bildschrimkoordinaten) der Einheiten / Gebäude etc. relativ zu meinem Sichtiwnkel ausgibt, damit ich nachprüfen kann, ob mit der Maus auf eine Einheit geklickt wurde. Optional könnte ich auch überprüfen, ob ein Strahl, der von der Kamera durch die Mausposition auf der Bildschirmebene geht, durch eine Einheit geht - Ich brauch also eine Funktion, die testet, ob ein Strahl durch ein Dreieck, besser noch durch ein Poligon geht und am allerbesten auch noch die Schnittpunktkoordinaten zurückgibt. Ich weiß, das in DirectX eine solche Funktion existiert, aber in OpenGL?
    Oder gibt es noch andere Möglichkeiten? Übrigens werde ich die Strahlvariante später sowieso nochmal brauchen, wenn es darum geht zu sehen, ob Einheiten von Geschossen etc. getroffen werden.

    ich brenne auf euer Wissen - danke im Voraus; Greez, BlAlB



  • gluunproject





  • Gibts dazu nicht einen Eintrag in der FAQ? Ich erinnere mich dunkel, das mal irgendwer sagte, er hat dies API unabhängig implementiert (hat ja an und für sich auch nix mit der API zu tun). Ausserdem mal noch der Tip, das eigentlich auch eine Box oder Kugel die Einheit approximieren könnte. Grade beim Rechteck ziehen kann man die bekannten Methoden fürs culling benutzen, und so viele Einheiten schnell überprüfen.

    Bye, TGGC (Der Held ist zurück)



  • Thx



  • hiho,
    hab jetzt die Gerade "hinter" der Maus, also die beiden Punkte, mit gluunproject rausgekriegt. Aber ich komm net mit der Testfunktion, ob diese Gerade jetzt durch ein Poligon läuft, weiter. Gibt es da eine GLU-Funktion, oder muss ich die auch selber schreiben?



  • Beim DXSDK ist ein Beispiel dabei, oder such mal den oben angesprochenen Beitrag.

    Bye, TGGC (Der Held ist zurück)



  • TGGC schrieb:

    Beim DXSDK ist ein Beispiel dabei, oder such mal den oben angesprochenen Beitrag.

    DirectX ja - Ich schreib aba OpenGL, keine Microsoftsch*,
    Aus Stundenlangem Internetsuchen wurde ich nicht schlauer als bis hierhin, und den Beitrag in der faq hab ich auch net gefunden, nur den Thread von damals ... zZzZ


  • Mod

    BlAlB schrieb:

    TGGC schrieb:

    Beim DXSDK ist ein Beispiel dabei, oder such mal den oben angesprochenen Beitrag.

    DirectX ja - Ich schreib aba OpenGL, keine Microsoftsch*,
    Aus Stundenlangem Internetsuchen wurde ich nicht schlauer als bis hierhin, und den Beitrag in der faq hab ich auch net gefunden, nur den Thread von damals ... zZzZ

    das beispiel ist auf opengl übertragbar, es ist nur ein wenig wissen dass du dir aneignen müßtest.

    rapso->greets();



  • BlAlB schrieb:

    DirectX ja - Ich schreib aba OpenGL, keine Microsoftsch*,

    Tja, wenn das genannte Beispiel nur Microsoftsch* ist, dann hast du eben Pech gehabt.

    Bye, TGGC (Der Held ist zurück)



  • TGGC schrieb:

    BlAlB schrieb:

    DirectX ja - Ich schreib aba OpenGL, keine Microsoftsch*,

    Tja, wenn das genannte Beispiel nur Microsoftsch* ist, dann hast du eben Pech gehabt.

    Bye, TGGC (Der Held ist zurück)

    Tschuldige, war net so gemeint. Ich bin nur eben extra von DX auf OpenGL umgestiegen, für Kompatibilität und logischere Struktur, außerdem werd ich demnächst Windows ganz von meiner Festplatte bannen und nur noch Linux arbeiten lassen.



  • Also, bin jetzt auf die Idee gekommen, wie man testet, ob Geraden durch Dreiecke laufen oder net:

    ( Erstmal mathematisch, den Funktionscode werd ich später mal posten, wenn ich ihn fertig hab )

    Funktiosargumente:
    5 Punkte:
    - A B C -> Ecken des Dreickes &:
    - P Q -> zwei Punkte, die auf der Geraden liegen

    Man muss alle Punkte so transformieren, das das Dreieck flach auf der XY-Ebene liegt:

    <

    als erstes Punkt A auf Null bringen, also alle Z-Werte um den Z-Wert von A (A.coordZ) reduzieren:

    (Der Code is ja noch einfach)

    i = A.coordZ;
    A.coordZ = 0;
    B.coordZ -= i;
    C.coordZ -= i;
    P.coordZ -= i;
    Q.coordZ -= i;
    

    jetzt alle Punkte so drehen, das nun auch B auf der XY-Ebene liegt.
    danach alles so drehen / schieben, dass A und B auf der X-Achse liegen.
    Und schließlich nochma alles um die X-Achse drehen, das C auf die XY-Ebene kommt.

    Und jetzt kann man einfach (:\) den Schnittpunkt der Gerade PQ mit der XY-Ebene ausrechnen und rausfinden ob der innerhalb der drei Geraden ABC liegt.

    ---

    Gut, kann man diese Transformationen irgendwie von OpenGL ausführen lassen, oder muss ich jetzt ne Vektorklasse schreiben und den gesamten Spaß selber rechnen?

    if(antwort==TRUE) :(;

    PS: Jetzt wäre der richtige zeitpunkt, mir zu sagen, dass das alles total unnötig ist, weil irgendwo schon eine solche Funktion existiert.



  • Das ist total unnötig. Normalerweise macht man es wie in dem o.g. Beispiel.

    Bye, TGGC (Der Held ist zurück)


Log in to reply