Mauskoordinaten in Weltkoordinaten



  • Hi!!!

    Arbeite gerade an einem 3D - Leveleditor, aber komm einfach nicht bei einem Problem weiter... Habe auch schon h-denlang gegooglt aber irgendwie schaff ichs einfach nicht.

    Man kann sich frei bewegen im Editor. Rauf, runter, rechts, links, vor, zurück... vogelfrei würde ich halt sagen. Da entsteht aber mein Problem. Woher weiss den OpenGL nun, welches Feld ich makiere. Ich möchte also das Feld makieren, das ich mit der Maus anklicke. Ich glaube, die Bilder sprechen für sich...

    http://www.sbox.tugraz.at/home/p/pairob/rob/pictures/problem.jpg
    Danke im Vorraus. (lol, dass soll v0rraus heissen 😉

    PS: Habe gegoogelt und auch einiges gefundn. Leider hat nichts richtig funktioniert.



  • Stichwort gluUnProject();

    Bitte beachten:
    direkt nach dem Zeichnen nutzen, ohne irgendwas an den Matrizen zu ändern.

    void cGLCam::unproject (cVector  *pos, double screen_x, double screen_y){ 
    
        double mvm[16], pm[16];
        double x, y, z;
        float screen_z;
        GLint viewport [4];
    
        glGetDoublev( GL_MODELVIEW_MATRIX, mvm);
        glGetDoublev( GL_PROJECTION_MATRIX, pm);
        glGetIntegerv( GL_VIEWPORT, viewport);
        glReadPixels ((int)screen_x , (int) (viewport[3] - screen_y), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &screen_z);
    
        gluUnProject( screen_x, viewport[3] - screen_y, (double)screen_z, 
                      mvm, pm, viewport, &x, &y, &z);
    
        pos->val[0] = x;                         
        pos->val[1] = y;                         
        pos->val[2] = z;                         
    
    }
    

    so siehts bei mir aus



  • such nach picking! bei nehe gibts sogar ein Tut dazu



  • @DocJunioR:

    Ist das Ergebnis deiner Methode ein Vector von der Kameraposition in Richtung des geklickten Punktes?

    Oder was berechnet diese Methode?



  • Die Methode berechnet die absoluten 3D-Koordinaten der angeklickten Position, wobei Grundlage die Mausposition auf dem Fenster und die Matrizen sind.



  • http://wiki.delphigl.com/index.php/gluUnProject

    function WinPosTo3DPos(X, Y: Integer): TGLVectord3;
    var
      viewport  : TGLVectori4;
      modelview : TGLMatrixd4;
      projection: TGLMatrixd4;
      Z         : TGLdouble;
      Y_new     : TGLdouble;
    begin
      glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
      glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
      glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
      Y_new := viewport[3] - y; // In OpenGL steigt Y von unten (0) nach oben
    
      // Auslesen des Tiefenpuffers an der Position (X/Y_new)
      glReadPixels(X, Y_new, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z );
    
      // Errechnen des Punktes welcher mit den beiden Matrizen multipliziert (X/Y_new/Z) ergibt:
      gluUnProject(X, Y_new, Z,modelview, projection, viewport,@Result[0], @Result[1], @Result[2]);                         
    end;
    


  • Würd mal sagen, dass das meine Funktion in Delphi is..



  • DocJunioR schrieb:

    Würd mal sagen, dass das meine Funktion in Delphi is..

    Genau - nur der Name ist besser gewählt 😉



  • Danke Leute (und besonders DocJunioR),

    jetzt kann ich in meinem (Test) Programm endlich die Objekte anklicken 😃

    Edit:
    Warum gibt es Wiki nen extra Bereich OpenGL und Delphi und keinen
    OpenGL und c++?

    Da könnte man doch mal was dran ändern, oder?

    Edit2:
    @isas
    "Danke im v******. (lol, dass soll v0rraus heissen"

    Das kann man schreiben: voraus (nur mit EINEM r)
    Das Forum blendet einige Rechtschreibfehler duch ***** aus



  • Danke mal an alle. Funktioniert einwandfrei...

    @DocJunioR:
    Japp, so gehts 😉

    @Vertexwahn:
    Japp, so gehts auch. Das hab ich auch gefundn, aber irgendwie hab ich das nicht hinbekommen oder auch für falsch angenommen. Weil die Koordinaten, die der ausspuckte doch recht komisch waren, aber die müssen wohl gestimmt haben.

    @Andreas XXL:
    Naja, nehe is ein guter Freund und die Tuts von ihm gibs ja auch in Deutsch. Ansonsten, wenn man sich ein bisschen mit Programmiersprachen auskennt, dann ist es sehr einfach umzuschreiben. Glaub ich halt mal 😉
    Tja, hätte ich im Vorraus gewusst, wie man vorraus schreibt, hätte ich vorraus sicher richtig geschrieben. Aber jetzt weiss ich es im Voraus besser



  • immer gern!

    Hab auch ewig gesucht bis es funktionierte.
    Dabei sind mir 2 Sachen aufgestoßen (wobei ich mich jetzt zur Hälfte wiederhole)
    1. Da die Projektions- und Modell-Matrizen zur Rückprojektion benötigt werden, darf man diese vor gluUnproject nicht ändern. Das Ergebnis wäre fatal.
    2. Der viewport für openGL beginnt unten links, nicht wie bei Windows oben links. Deshalb viewport[3] - screen_y.

    Naja, ich hab mir jetzt eine Kamera-Klasse geschrieben. Die muss ich zwar nochmal "beschleunigen" aber sie funktioniert.


Anmelden zum Antworten