自己来做个简陋的OpenGL选择教程....
#include <windows.h> #include <GL/glut.h> #include <stdio.h> void drawScene(GLenum mode) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); GLfloat x1 = -99; GLfloat y1 = -99; GLfloat x2 = 99; GLfloat y2 = 99; GLfloat z = 10; glColor3f(1.0, 0.0, 0.0); if (mode == GL_SELECT) { glLoadName(111); } glRectd(x1, y1, x2, y2); x1 = -44; y1 = -44; x2 = 44; y2 = 44; z = -1; glColor3f(0.0, 1.0, 0.0); if (mode == GL_SELECT) { glLoadName(222); } glRectd(x1, y1, x2, y2); x1 = -33; y1 = -33; x2 = 33; y2 = 33; z = -50; glColor3f(1.0, 1.0, 0.0); if (mode == GL_SELECT) { glLoadName(333); } glRectd(x1, y1, x2, y2); } void selectObjects() { GLuint buf[11]; glSelectBuffer(12, buf); glRenderMode(GL_SELECT); glInitNames(); glPushName(0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-100, 100, -100, 100, 150, -100); drawScene(GL_SELECT); GLint hits; hits = glRenderMode(GL_SELECT); int j = 0; for (int i = 0; i<hits; i++) { printf("-- Name*s Num: %d\n", buf[j]); printf("-- Min Z: %d\n", buf[j+1]/0xffffffff); printf("-- Max Z: %d\n", buf[j+2]/0xffffffff); printf("-- Name : %d\n", buf[j+3]); j+=4; } } void init() { glEnable(GL_DEPTH_TEST); glShadeModel(GL_FLOAT); } void display() { glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glMatrixMode(GL_PROJECTION); //gluPerspective(60, 1.0, 1, -1); glOrtho(-100, 100, -100, 100, 150, -100); drawScene(GL_RENDER); selectObjects(); glFlush(); } int main() { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(200, 200); glutInitWindowPosition(200, 400); glutCreateWindow("Yulinxx"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }