una tutorial rotar obj modelos iluminacion figura con cargar opengl graphics

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;