自己来做个简陋的OpenGL选择教程....

自己来做个简陋的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;
}




你可能感兴趣的:(自己来做个简陋的OpenGL选择教程....)