Pregunta

Tengo esta vista configurada:

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

y obtengo una posición de la pantalla (sx, sy) con un clic del mouse.

Dado un valor de z, ¿cómo puedo calcular xey en el espacio 3d a partir de sx y sy?

¿Fue útil?

Solución

Deberías usar gluUnProject:

Primero, calcule la "desproyección" en el plano cercano:

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);

y luego al plano lejano:

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

Ahora tienes una línea en coordenadas mundiales que traza todos los puntos posibles que podría he estado haciendo clic.Entonces ahora solo necesitas interpolar:supongamos que te dan la coordenada 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;

Otros consejos

La mejor respuesta a esto es la fuente más autorizada, Sitio web de OpenGL.

En realidad, esto depende de la matriz de proyección, no de la matriz de vista del modelo. http://www.toymaker.info/Games/html/picking.html debería ayudarte: está centrado en D3D, pero la teoría es la misma.

Sin embargo, si está buscando realizar una selección basada en el mouse, le sugiero usar el modo de representación de selección.

Editar:Eso sí, la matriz modelo-vista entra en juego, pero como la tuya es la identidad, no es un problema.

libqglviewer tiene un buen marco de selección si eso es lo que estás buscando

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top