OpenGL +MausKlick +Punkt



  • Hi,
    Also ich würde gerne einen Punkte per Mausklick einfügen.
    das Problem ist, dass mir die QT ja die Fensterkoordinaten liefert, wenn ich mit der Maus in das OpenGL fenster klicke.

    Wie ist das, wenn ich von der QT im mousPressEvent die Koordiaten

    (x,y)
    

    bekomme, muß ich dann einen Vektor V=[x,y,0,1] mit

    [b]M[/b]=ModelView
    [b]P[/b]=Projection
    
    Einfügepukt [b]E[/b]=[b]M[/b][h]-1[/h]*[b]P[/b][h]-1[/h]*[b]V[/b]
    

    Berechnen ??
    Wenn ja ist dier Miltiplikationsreihenfolge richtig von M und P mit V ??
    ALso die einfügepunkte sollen alle in der Ebene mit Z=0 liegen. Deswegen bei der
    z Komponente des Vektors V=0.
    Und was, wenn die Z-Ebene senkrecht zu meinem Bildschirm steht ??
    Die determinante müßte dann doch null werden, womit die inverse singulär wäre.
    Also einfügen bei 1/det->Einen großen Parameter verbieten ??
    Gruß



  • Hi,

    schau dir mal gluUnProject() an, das übernimmt das rumrechnen für dich!

    mfG
    KaPtainCugel



  • Danke schön ^^
    Das scheint genau das was ich suche zu sein.
    Also das

    Object_Koordinaten=inv(PM)*V
    

    ist klar. Aber Die berechnung des Vektors V mit hilfe des Viewports is mir gerade nicht ganz klar.
    Ich frage wegen dem Verständnis.

    Gruß



  • Alexander_Kiebler_m82 schrieb:

    [b]M[/b]=ModelView
    [b]P[/b]=Projection
    
    Einfügepukt [b]E[/b]=[b]M[/b][h]-1[/h]*[b]P[/b][h]-1[/h]*[b]V[/b]
    

    Nein, das klappt so nicht. Da du von einem 3D-Raum auf eine 2D-Ebene zurück projizierst, ist die Projektion nicht eindeutig, sondern im Gegenteil es gibt unendlich viele Möglichkeiten (für jeden Z-Wert ein Punkt). Du brauchst also noch aus dem Z-Buffer die Tiefeninformation die du dann als Z-Wert in V einsetzen musst...zumindest in der Theorie, wenn P invertierbar ist - was nicht der Fall sein muss.



  • Ja Du hast Recht.
    @Otze
    Z ist ja nicht Null in Kamerakoordinaten, sondern hat da eine Tiefen Info.
    Danke für Hinweis.

    Allgemein geht Folgendes aber nicht :

    void CIM_OpenGL::mouseMoveEvent(QMouseEvent *event)
    {
    
        std::cout <<"\n WinKoord \t " <<event->x() <<"\t" <<event->y();
        GLdouble x=0;
        GLdouble y=0;
        GLdouble z=0;
    
        glGetDoublev(GL_MODELVIEW,ModelViewMatrix);
        glGetDoublev(GL_PROJECTION,ProjectionMatrix);
        glGetIntegerv(GL_VIEWPORT,ViewPortMatrix);
        gluUnProject(
            (GLdouble)event->x(),(GLdouble)event->y(),0.0f, \
            ModelViewMatrix,ProjectionMatrix,ViewPortMatrix, \
            //ObjectKoordinaten,(ObjectKoordinaten+1),(ObjectKoordinaten+2)
            &x,&y,&z
        );
        ObjectKoordinaten[3]=1;
        //std::cout <<"\n ObjectKoord \t " <<ObjectKoordinaten[0] <<"\t" <<ObjectKoordinaten[1] <<"\t" <<ObjectKoordinaten[2];
        std::cout <<"\n ObjectKoord \t " <<x <<"\t" <<y <<"\t" <<z;
    
    }
    

    Ich bekomme für x,y,z immer (0,0,0)

    Gruß



  • @Oze, ^^Habe meine Meinung gerade geändert *lach*
    -Ich kann die Kameraposition ja eindeutig bestimmen in richtung und Länge.
    -Wenn ich den vektor V vollständig habe, und M und P invertierbar sind,
    ist die Lösung eindeutig.

    Ich habe für V projeziert auf Z ja die Länge 0 angegeben in den Vorraussetzungen.

    (Also wenn ich falsch liege, wäre eine erklärung schön)

    Gruß



  • Okay die Übergabeparameter müssen

    glGetDoublev(GL_MODELVIEW_MATRIX,ModelViewMatrix);
    

    Sein 🙂
    Ich bin doof



  • @Otze ^^
    Du hast Recht.
    Sobald ich Rotations transformationen mache, stimmen die Werte nicht mehr.
    Wenn alle Punkte in einer Ebene mit Z=0 oder in Kamerakoordinaten
    Z=20 liegen, dann kann ich eindeutig projezieren.

    Ansonsten müßte ich ja je nach dem welche Punkt ich anklicke, die Tiefe mitnehmen.
    Wie Du schon gesagt hast. Werd mir da jetzt ebr keine weitere Mühe machen, wenns nicht schon was gutes dasfür gibt. Werde einfache nach rotationstransformationen das Verschieben mit der Maus verbieten.

    Ansonsten schwimmt mein Mauszeiger irgendwo durch die gegend.
    (Also wenn ich einen Kreis zeichnen würde, würde der ja zu ner Ellipse werden,
    wenn ich um die x-Ache drehe. und zwar oben und unten gestaucht. Wenn ich nur um die xAchse drehe, bleibt die x Information richtig erhalten. Aber die höheninformation ist wie ich vermute um diesen faktor verschoben)

    Gruß



  • Bei gluUnproject muss der zweite Parameter noch transformiert werden, damit du sinnvolle Ergebnisse erhälst:

    viewport[3]-(GLdouble)event->y()
    

    Denn Qt hat den Koordinatenursprung wenn ich mich recht entsinne links oben, bei Opengl ist er aber links unten.



  • Ja das habe ich schon bemerkt. Trotzdem danke.
    Habs gleich gelöst wie du.

    Eine Lösung mit Tiefenpuffer würde mich interessieren.

    Gruß


Anmelden zum Antworten