Red de conocimiento informático - Conocimiento del nombre de dominio - ¿Cómo determinar en OpenGL que la línea de extensión que conecta el mouse y la cámara intersecta un determinado plano y encontrar su punto de intersección? (código)

¿Cómo determinar en OpenGL que la línea de extensión que conecta el mouse y la cámara intersecta un determinado plano y encontrar su punto de intersección? (código)

Existe una función en GL que obtiene las coordenadas tridimensionales de los objetos de la escena a través de coordenadas bidimensionales. Por ejemplo, dibuja un conejo en la escena y cuando usa el mouse para seleccionar una coordenada bidimensional (como la posición del mouse), esta función puede obtener automáticamente el valor de la coordenada tridimensional correspondiente a la coordenada bidimensional. coordenada dimensional en la superficie del conejo.

Nombre de la función: gluUnProject

Prototipo de función:

int APIENTRY gluUnProject (

GLdouble winx,

GLdouble winy,

GLdouble winz,

const GLdouble modelMatrix[16],

const GLdouble projMatrix[16],

const GLint viewport [4],

GLdouble *objx,

GLdouble *objy,

GLdouble *objz);

Explicación de la función: esta función El propósito específico de es convertir un punto bidimensional en la ventana gráfica OpenGL en sus coordenadas tridimensionales correspondientes en la escena [Fuente: GameRes.com].

Nota: Se deben proporcionar las coordenadas bidimensionales (winx, winy, winz). Winz cambia de 0 a 1, generalmente toma 0 directamente y, al programar en Windows, tenga en cuenta que las coordenadas de la pantalla son la esquina superior izquierda como origen. En OpenGL, la esquina superior izquierda es el origen (solo se considera el plano xy), por lo que winy es el valor de la altura de la ventana menos la coordenada y obtenida de la pantalla. Los parámetros tridimensionales de salida final se almacenan en objx, objy, objz. Los tres parámetros del medio son las matrices de vista, perspectiva y ventana gráfica obtenidas de opengl.

Ejemplo de llamada:

glGetDoublev (GL_MODELVIEW_MATRIX, vista de modelo);

glGetDoublev (GL_PROJECTION_MATRIX, proyección);

glGetIntegerv (GL_VIEWPORT, ventana gráfica) );

gluUnProject( (GLdouble) mousex, (GLdouble)window.bottom - mousey, 0,

modelview, proyección, viewport,

&objx, &objy , &objz);

Está escrito puramente a mano y no hay problema en depurar el código. ¡Le deseo éxito!