一个简单的OpenGL拾取例子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个简单的OpenGL拾取例子【注】OpenGL鼠标拾取的大致样子。唉,一个堂堂的“医生”,竟然要做这些coding的体力活。真丢人啊!!
#include
#include
#include
void init()
{
glClearColor(0, 0, 0, 0);
}
void drawObjects(GLenum mode)
{
if (mode == GL_SELECT) glLoadName(1);
glColor3f(1, 0, 0);
glRectf(-0.5, -0.5, 1.0, 1.0);
if (mode == GL_SELECT) glLoadName(2);
glColor3f(0, 0, 1);
glRectf(-1.0, -1.0, 0.5, 0.5);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
drawObjects(GL_RENDER);
glFlush();
}
void processHits(GLint hits, GLuint buffer[])
{
unsigned int i, j;
GLuint names, *ptr;
ptr = (GLuint*)buffer;
for (i=0; i names = *ptr; ptr += 3; // 跳过名字数和深度 for (j=0; j if (*ptr == 1) printf("red\n"); else printf("blue\n"); ptr++; } } #define SIZE 512 #define N 5 void mouse(int button, int state, int x, int y) { GLuint selectBuf[SIZE]; GLint hits; GLint viewport[4]; if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { glGetIntegerv(GL_VIEWPORT, viewport); // 初始化名称堆栈 glSelectBuffer(SIZE, selectBuf); glRenderMode(GL_SELECT); glInitNames(); glPushName(0); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); // 定义一个以光标为中心的NxN拾取区域 // 必须对鼠标y坐标求反,从屏幕坐标系转换成世界坐标系gluPickMatrix(x, viewport[3]-y, N, N, viewport); gluOrtho2D(-2, 2, -2, 2); drawObjects(GL_SELECT); glMatrixMode(GL_PROJECTION); glPopMatrix(); glFlush(); hits = glRenderMode(GL_RENDER); processHits(hits, selectBuf); glutPostRedisplay(); } } void reshape(int w, int h) glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-2, 2, -2, 2); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) { switch(key) { case 'q': exit(0); break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow("123"); init(); glutReshapeFunc(reshape); glutDisplayFunc(display); glutMouseFunc(mouse); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }