OpenGL: projetando clique do mouse na geometria
Pergunta
Eu tenho este conjunto de vista:
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective
e eu recebo uma posição da tela (sx, sy) a partir de um clique do mouse.
Dado um valor de z, como posso calcular x e y em 3d espaço de sx e sy?
Solução
Você deve usar gluUnProject
:
Em primeiro lugar, calcular o "unprojection" ao plano próximo de:
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, em seguida, para o plano agora:
// replace the above gluUnProject call with
gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z);
Agora você tem uma linha em coordenadas mundiais que traça todos os pontos possíveis você pode ter sido clicando em. Então, agora você só precisa interpolate: Suponha que você está dada a 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;
Outras dicas
Este é melhor respondida pela fonte mais autorizada, do OpenGL .
Este é na verdade dependente da matriz de projecção, não a matriz modelo de-vista. http://www.toymaker.info/Games/html/picking.html deve ajudá-lo. - é D3D-centric mas a teoria é a mesma
Se você está procurando para fazer a colheita baseado no mouse, no entanto, eu sugiro usar o modo de processamento de seleção.
Edit:. Veja bem, a matriz modelo-visão não entram em jogo, mas desde que o seu é identidade é um nonissue
libqglviewer tem uma estrutura boa seleção se é isso que você está procurando