OpenGL pickray berechnen



  • Moin,
    Ich scheitere gerade daran in OpenGl (JOGL) einen "pickray" zu brechnen.
    Immoment siehst mein Code so aus: (Von hier kopiert)

    public Line getRay(){
    		int viewport[] = new int[4];
    	    double mvmatrix[] = new double[16];
    	    double projmatrix[] = new double[16];
    	    int realy = 0;// GL y coord pos
    	    double wcoord[] = new double[4];// wx, wy, wz;// returned xyz coords
    	    double wcoord1[] = new double[4];// wx, wy, wz;// returned xyz coords
    	    double vector[] = new double[4];// wx, wy, wz;// returned xyz coords
    
    	    if (mouse != null)
    	    {
    	      int x = mouse.getX(), y = mouse.getY();
    
    	          gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);
    	          gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvmatrix, 0);
    	          gl.glGetDoublev(GL.GL_PROJECTION_MATRIX, projmatrix, 0);
    	          /* note viewport[3] is height of window in pixels */
    	          realy = viewport[3] - (int) y - 1;
    
    	          glu.gluUnProject((double) x, (double) realy, 0.0, //
    	              mvmatrix, 0,
    	              projmatrix, 0, 
    	              viewport, 0, 
    	              wcoord, 0);
    
    	          glu.gluUnProject((double) x, (double) realy, 1.0, //
    	              mvmatrix, 0,
    	              projmatrix, 0,
    	              viewport, 0, 
    	              wcoord1, 0);
    
    	          for(int i=0;i<4;++i)
    	        	  vector[i] = wcoord[i] - wcoord1[i];
    
    	          Vector3d position = new Vector3d(wcoord[0], wcoord[1], wcoord[2]);
    	          Vector3d direction = new Vector3d(vector[0], vector[1], vector[2]);         
    	          direction.normalize();       
    	          return new Line(position, direction);
    	    }
    
    	    return null;
    	}
    

    zum überprüfen berechne ich den Abstand der Geraden zum Ursprung, auf dem meine Kamera schaut und rotiert.
    Leider stimmen die Ergebnisse ganz und gar nicht. Der Fehler muss eigentlich in
    dieser Funktion liegen. Kann mich einer sagen was falsch ist?

    MFG



  • Moin,
    kann mir keiner helfen?
    Es muss doch den einen oder anderen geben der in OpenGL schon mal
    so einen "Pickray" berechtet hat oder?

    MFG



  • Moin,
    Ich hab mit jetzt mal mit dem FAQ auf der OpenGl seite einen anderen
    Weg zur Berechnung der Geraden zusammen gewurschtelt.

    public Line getViewRay(){
    
    		if (mouse == null)
    			return null;
    
    		double mvmatrix[] = new double[16];
    		gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, mvmatrix, 0);
    
    		int w_width = window.getWidth();
    		int w_height = window.getHeight();
    
    		int mouse_x = mouse.getX();
    		int mouse_y = w_height - mouse.getY();
    
    		double aspect = (double)w_width / (double) w_height;
    
    		//gl.glMatrixMode(gl.GL_PROJECTION);
    		//gl.glLoadIdentity();
    
    		double near_height = 0.5;
    		double zNear = 0.5;
    		double zFar = 1.0;
    		//gl.glFrustum(-near_height * aspect,near_height * aspect, -near_height, near_height, zNear, zFar);
    
    		int w_y = (w_height - mouse_y) - w_height / 2;
    		double norm_y = (double)w_y / (double)(w_height / 2);
    
    		int w_x = mouse_x - (w_width / 2);
    		double norm_x = (double) w_x/(double)(w_width / 2);
    
    		double y = near_height * norm_y;
    		double x = near_height * aspect * norm_x;
    
    		Vector3d direction = new Vector3d(x, y, -zNear);
    		Point3d position = new Point3d(0, 0, 0);
    
    		Matrix4d mv = new Matrix4d();
    		mv.set(mvmatrix);
    		mv.invert();
    
    		System.out.println(position + " " + direction);
    		mv.transform(position);
    		mv.transform(direction);
    		System.out.println(position + " " + direction + "\n");
    
    		return new Line(position, direction);
    	}
    

    Ich rufe diese Funktion nach dem setzen meiner Kamera auf.
    Aber ich bin nicht sicher ob ich die Werte für zNear, zFar und
    near_height frei wählen kann, eignetlich müsste ich die doch von meiner
    aktuellen Kameraeinstellung benutzen oder? Aber ich weiß nicht wie ich an
    die Werte kommen soll.
    Zudem klappt die Transforamtion, die ich am ende der Funktion durchführe, nicht.
    Der Richtungsvektor der Geraden verändert sich zwar aber nicht der Stützvektor.
    Wieder weiß ich nicht genau wo der Fehler ist und wäre
    froh wenn mir einer helfen könnte.
    Als Math libary nehme ich vecmath

    MFG



  • Keiner eine Idee?
    Ich verzweifle allmählich... 😞
    MFG



  • Die Schwierigkeit liegt meist beim richtigen aufrufen von gluUnproject. Deine Parameter

    glu.gluUnProject((double) x, (double) realy, Z, //
    mvmatrix, 0,
    projmatrix, 0,
    viewport, 0,
    wcoord, 0);
    

    sehen ein wenig komisch aus. Für was ist denn die "0" hinter, mvmatrix ... wcoords?

    In meinem Code sieht der Aufruf so aus:

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

    winX, winY ist die Position des Mauscursors
    zHit ist ein Wert zwischen 0.0 (=Nearplane) und 1.0 (=Farplane)
    mv,pm, viewport sind Modelviewmatrix, Projektionsmatrix und Viewport

    resx, resy, resz sind dann die gesuchten Weltkoordinaten des durch die anderen Parameter spezifizierten Punktes.

    Ich hoffe, dass diese Erläuterungen dir ein wenig helfen ....



  • das konzept ist ja eigentlich, dass du den z-wert aus dem zbuffer ausliesst.


Anmelden zum Antworten