gluUnProject liefert Müll..
-
Aaaalsooo ich bin wahrscheinlich nicht der Erste und schon gar nicht der Letzte, der an gluUnProject verzweifelt.
Ich hab ne wirklich einfache und eigentlich tootal langsame Kamera-Klasse, die mir aber für Testzwecke reichen soll. Das Einzige was fehlt ist die Möglichkeit, die Koordinaten eines angeklickten Punkts herauszufinden- gluUnproject.
Das Merken der gluProject-Koordinaten in den einzelnen Objekten ist zwar grundsätzlich auch möglich, bedeutet aber an der Stelle nen ziemlichen Overhead an Daten.Wie auch immer..
Die wichtigen Methoden der Klasse sind wohl Darstellung und UnProject..void cGLCam::enable3d (void) { glMatrixMode (GL_PROJECTION); glLoadIdentity(); gluPerspective (45.0f, (float)resX / (float)resY, 0.1f, 30.0f); // 45° Sichtradius glMatrixMode (GL_MODELVIEW); glLoadIdentity(); } int cGLCam::showScene (void) { gluLookAt( position.val[0], position.val[1], position.val[2], look_at.val[0], look_at.val[1], look_at.val[2], up.val[0], up.val[1], up.val[2] ); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); return 0; } void cGLCam::unproject (cVector *pos, double screen_x, double screen_y){ this->enable3d(); this->showScene(); 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, screen_y, (double)screen_z, mvm, pm, viewport, &x, &y, &z); #ifdef TEST cout << "cGLCam: clicked at 2d " << screen_x << " : " << screen_y << " : " << screen_z << endl; cout << "cGLCam: clicked at 3d " << x<< " : " << y<< " : " << z << endl; #endif pos->val[0] = x; pos->val[1] = y; pos->val[2] = z; this->enable2d(); }Die ausgegeben Daten sind allerdings je nach Betrachtungswinkel der Kamera immer andere. Eigentlich klicke ich aber immer auf die gleichen Koordinaten (hab da ein Raster gebaut zur Überprüfung..)
-
Die ausgegeben Daten sind allerdings je nach Betrachtungswinkel der Kamera immer andere.
Eigentlich klicke ich aber immer auf die gleichen Koordinatendass zwei pixel bei unterschiedlicher transformation der gleichen 3d-koordinate entsprechen waere, auch in anbetracht von integer-konvertierung und sub-pixel-korrektur, aber schon sehr grosser zufall...
-
Aaaber bei einem Raster von Quads mit 1.0 Seitenlänge werd ich beim Anklicken der Map-Koordinate 0,0,1.0 ein mal auf 0.004, 1.023, -3.2 und nach der Rotation auf 0.5, 0.5, -3.3 verwiesen. Das halte ich für eine markante Abweichung...
-
aber wenn du dir den source von gluUnProject mal anschaust...
GLint APIENTRY gluUnProject(GLdouble winx,GLdouble winy,GLdouble winz, const GLdouble model[16],const GLdouble proj[16], const GLint viewport[4], GLdouble *objx,GLdouble *objy,GLdouble *objz) { GLdouble m[16], A[16]; GLdouble in[4],out[4]; in[0]=(winx-viewport[0])*2/viewport[2] - 1.0; in[1]=(winy-viewport[1])*2/viewport[3] - 1.0; in[2]=2*winz - 1.0; in[3]=1.0; matmul(A,proj,model); invert_matrix(A,m); transform_point(out,m,in); if (out[3]==0.0) return GL_FALSE; *objx=out[0]/out[3]; *objy=out[1]/out[3]; *objz=out[2]/out[3]; return GL_TRUE; }...wirst du feststellen, dass er funktioniert und der fehler irgendwo bei dir liegen muss

-
´Nein, ich bin jetzt davon ausgegangen, dass mir einer sagt, nimm einen anderen computer und alles wird gut

Natürlich liegt der Fehler irgendwo in meinem Programm. Aber wo da würd ich gern noch wissen..PS: Das enable3d und das showScene hab ich aus der Funktion ausgebaut, weil es nach einiger Überlegung ja meine Matrizen durcheinanderwirbelt.
Mal anders gefragt: Was muss ich alles beachten beim Aufruf von gluUnProject? Muss der Aufruf an einer bestimmten Stelle im Loop sein? (Kann mir dieses nur bedingt vorstellen. Es sollte wohl zumindest vor dem Löschen des Color Buffers sein...)
-
projection- und modelview-matrix muessen dem objekt entsprechen, dessen pixel du rueckprojezieren willst.
-
Aaalsoo ich gehe (schematisch) so vor:
while (handleInput()) { cam->enable3D(); cam->showScene(); map->draw(); ... } } bool handleInput() { event = getEvent; if (event == key_escape) { return false; } ... return true; }Da sollte sich doch was die matrizen angeht garnicht so viel tun, oder?
-
glLookAt ändert deine Modelviewmatrix !
-
ookay, aber wenn ichs rausnehme kommt zwar was halbwegs passendes raus, aber nur solange ich die Cam nicht drehe...