Domanda

Ho impostato questo punto di vista:

glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective

e ottengo una posizione dello schermo (sx, sy) con un clic del mouse.

Dato un valore di z, come posso calcolare xey nello spazio 3d da sx e sy?

È stato utile?

Soluzione

Dovresti usare gluUnProject :

Per prima cosa, calcola la "non proiezione" al piano vicino:

GLdouble modelMatrix[16];
GLdouble projMatrix[16];
GLint viewport[4];

glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);

GLdouble x, y, z;
gluUnProject(sx, viewport[1] + viewport[3] - sy, 0, modelMatrix, projMatrix, viewport, &x, &y, &z);

e poi al piano lontano:

// replace the above gluUnProject call with
gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z);

Ora hai una linea nelle coordinate del mondo che traccia tutti i possibili punti su cui potresti fare clic. Quindi ora devi solo interpolare: supponi che ti venga data la coordinata z:

GLfloat nearv[3], farv[3];  // already computed as above

if(nearv[2] == farv[2])     // this means we have no solutions
   return;

GLfloat t = (nearv[2] - z) / (nearv[2] - farv[2]);

// so here are the desired (x, y) coordinates
GLfloat x = nearv[0] + (farv[0] - nearv[0]) * t,
        y = nearv[1] + (farv[1] - nearv[1]) * t;

Altri suggerimenti

Questa è la migliore risposta dalla fonte più autorevole, sito Web di OpenGL .

Questo in realtà dipende dalla matrice di proiezione, non dalla matrice della vista del modello. http://www.toymaker.info/Games/html/picking.html dovrebbe aiutarti - è incentrato sulla D3D ma la teoria è la stessa.

Se stai cercando di eseguire il prelievo basato sul mouse, tuttavia, ti suggerisco di utilizzare la modalità di rendering della selezione.

Modifica: intendiamoci, la matrice vista modello entra in gioco, ma poiché la tua è identità è un non-problema.

libqglviewer ha un buon framework di selezione se è quello che stai cercando

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top