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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top