rotar - opengl tutorial 7
OpenGL: proyección del mouse sobre la geometrÃa (4)
Tengo este conjunto de vistas:
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective
y obtengo una posición de pantalla (sx, sy) con un clic del mouse.
Dado un valor de z, ¿cómo puedo calcular xey en el espacio-3d de sx y sy?
De hecho, esto depende de la matriz de proyección, no de la matriz de vista de modelo. http://www.toymaker.info/Games/html/picking.html debería ayudarlo, está centrado en D3D pero la teoría es la misma.
Sin embargo, si está buscando hacer picking basado en el mouse, le sugiero usar el modo de renderizado de selección.
Editar: ojo, la matriz modelo-vista sí entra en juego, pero como la tuya es identidad, no es un problema.
libqglviewer tiene un buen marco de selección si eso es lo que estás buscando
Deberías usar gluUnProject
:
Primero, calcule la "no proyección" al 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 tiene una línea en coordenadas mundiales que rastrea todos los puntos posibles en los que podría haber estado haciendo clic. Entonces, 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;
La mejor fuente de respuestas es la fuente más autorizada, el sitio web de OpenGL .