一个简单的OpenGL拾取例子

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档