从屏幕坐标到世界坐标的逆变换.
// 3-8.cpp -- 2013-04-11-22:20
#include <gl/glut.h>
#include <stdlib.h>
#include <stdio.h>
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
glFlush() ;
}
void Reshape(int width, int height)
{
glViewport(0, 0, (GLsizei)width, (GLsizei)height) ;
glMatrixMode(GL_PROJECTION) ;
glLoadIdentity() ;
gluPerspective(45, (GLfloat)width / (GLfloat)height, 1, 100) ;
glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity() ;
}
void Mouse(int button, int state, int x, int y)
{
GLint viewport[4] ;
GLdouble mvMatrix[16] ;
GLdouble projMatrix[16] ;
GLint realY ;
GLdouble wx, wy, wz ;
switch (button)
{
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
{
glGetIntegerv(GL_VIEWPORT, viewport) ;
glGetDoublev(GL_MODELVIEW_MATRIX, mvMatrix) ;
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix) ;
realY = viewport[3] - (GLint)y - 1 ;
printf("Coordinates at cursor are (%4d, %4d)\n", x, realY) ;
gluUnProject((GLdouble)x, (GLdouble)realY, 0,
mvMatrix, projMatrix, viewport,
&wx, &wy, &wz) ;
printf("World coords at z = 0 are (%f, %f, %f)\n",
wx, wy, wz) ;
gluUnProject((GLdouble)x, (GLdouble)realY, 1,
mvMatrix, projMatrix, viewport,
&wx, &wy, &wz) ;
printf("World coords at z = 1 are (%f, %f, %f)\n",
wx, wy, wz) ;
}
break ;
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
exit(0) ;
break ;
default:
break ;
}
}
void Keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutKeyboardFunc (Keyboard);
glutMouseFunc(Mouse);
glutMainLoop();
return 0;
}