OpenGL Picking / Selection / verschieben / bewegen



  • Hallo,

    habe in meinem Projekt nun das Picking der einzelnen 3D Modelle eingebaut
    das klappt auch!

    aber wie kann ich sie z.B. mit der Maus dann verschieben?

    Läuft bisher so:

    Maus über einem Objekt plaziert: Es erscheint ein Wire Cube um das Objekt
    Maus nicht über einem Objekt oder wieder weg von einem Objekt: kein WireCube

    klicken mit der Maustaste auf ein Objekt WireCube mit anderer Farbe
    wird in der Objektklasse als markiert bezeichnet.
    wieder wegfahren mit der Maus -> WireCube bleibt erhalten die Markierung in der Klasse für das Objekt auch

    klicken mit der Maus auf eine Fläche ohne Objekt
    alle Markierungen werden gelöscht.

    Gruß Matthias



  • naja, wenn du auf ein objekt geklickt hast, liest du die mausposition ein. wenn du das nächste mal die mausposition ausliest, hast du ja eine differenz, um die du dann verschieben kannst.

    musst dir eventuell noch merken, welcher klick der erste und welcher der zweite ist, sonst verschiebt sich die drehung bei jedem zweiten "ersten klick", wenn du zwischendurch die maus bewegt hast...

    so ungefähr jedenfalls kann mans machen 🙂



  • interessant ist die frage, auf welcher ebene das abgelegt wird..
    weil die kamera schaut ja nicht immer genau auf eine.. man muss also die verschiebung immer projezieren. das hatt ich bisher nich hinbekommen..



  • Ich hatte soetwas mal mit Mauskoordinaten implementiert. Mit gluUnproject kann man sich genau den "Hitpoint" ausrechnechen lassen und mit der Differenz die zugehörige Transformation. Wählt man den identischen z-Wert aus dem z-Buffer, so verschiebt man das Objekt immer auf der Ebene "parallel zum Bildschirm".



  • iop schrieb:

    naja, wenn du auf ein objekt geklickt hast, liest du die mausposition ein. wenn du das nächste mal die mausposition ausliest, hast du ja eine differenz, um die du dann verschieben kannst.

    musst dir eventuell noch merken, welcher klick der erste und welcher der zweite ist, sonst verschiebt sich die drehung bei jedem zweiten "ersten klick", wenn du zwischendurch die maus bewegt hast...

    so ungefähr jedenfalls kann mans machen 🙂

    Soweit kann ich auch denken nur passt es nicht mit einer Ebene zusammen
    welche durch die beliebig gesetze Kamera schräg im Raum angezeigt wird.

    interessant ist die frage, auf welcher ebene das abgelegt wird..
    weil die kamera schaut ja nicht immer genau auf eine.. man muss also die verschiebung immer projezieren. das hatt ich bisher nich hinbekommen..

    exakt um dieses geht es

    Ich hatte soetwas mal mit Mauskoordinaten implementiert. Mit gluUnproject kann man sich genau den "Hitpoint" ausrechnechen lassen und mit der Differenz die zugehörige Transformation. Wählt man den identischen z-Wert aus dem z-Buffer, so verschiebt man das Objekt immer auf der Ebene "parallel zum Bildschirm".

    mein selbst programmierter Trackball mit Quaterionen benutzt auch gluUnProject
    hast du das CodeBeispiel noch?

    mir geht es eigentlich hauptsächlich um den Z Wert und das Verschieben eines 3DObjektes aus einer x-beliebigen Perspektive so dass es auch mit der Mausbewegung zusammen passt.

    Gruß Matthias



  • Den Code kann ich leider nich zeigen, aber:

    Beim Selektieren bekommst du ja im Hit Record den minimalen und maximalesn z-Buffer Wert des "getroffenen" Objekts, der jedoch noch durch 2^32 - 1 dividiert werden muss, um ihn in den Intervall [0,1] zu transformieren -> Red Book Kapitel 13.

    Verwende einfach diesen Wert für gluUnproject, da dort auch die Tiefeninformation des z-Buffer benötigt wird.

    beim selektieren:

    GLuint* hitRecord;
    glSelectBuffer(groesse, hitRecord);
    glRenderMode(GL_SELECT);
    ....
    float zHit = (float) hitRecord[1] / 0xFFFFFFFF;
    

    später:

    gluUnProject(winX, winY, zHit , mv, pm, viewport, &resx, &resy, &resz);
    

    und dann halt noch die Differenz bilden. Ich weiß, es ist nicht optimal erklärt. Bei Problemen einfach nochmals nachfragen 😉


Anmelden zum Antworten