从屏幕坐标到世界坐标的逆变换.
// 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; }