拾取操作的实现[OpenGL]
来源:互联网 发布:淘宝移动官方旗舰店 编辑:程序博客网 时间:2024/05/16 17:39
程序3-3OpenGL实现的拾取操作的例子
#include <gl/glut.h>#include "stdio.h"const GLint pickSize = 32;int winWidth = 400, winHeight = 300;voidInitial(void){ glClearColor(1.0f, 1.0f, 1.0f,1.0f); }voidDrawRect(GLenum mode){ if(mode == GL_SELECT) glPushName(1);//压入堆栈 glColor3f(1.0f,0.0f,0.0f); glRectf(60.0f,50.0f,150.0f,150.0f); if(mode == GL_SELECT) glPushName(2); //压入堆栈glColor3f(0.0f,1.0f,0.0f);glRectf(230.0f,50.0f,330.0f,150.0f);if(mode ==GL_SELECT) glPushName(3); //压入堆栈glColor3f(0.0f,0.0f,1.0f);glRectf(140.0f,140.0f,240.0f,240.0f);}voidProcessPicks(GLint nPicks, GLuint pickBuffer[]){ GLint i; GLuint name, *ptr;printf("选中的数目为%d个\n",nPicks);ptr=pickBuffer;for(i=0;i<nPicks; i++){ name=*ptr; //选中图元在堆栈中的位置 ptr+=3; //跳过名字和深度信息 ptr+=name-1; //根据位置信息获得选中的图元名字 if(*ptr==1) printf("你选择了红色图元\n"); if(*ptr==2) printf("你选择了绿色图元\n"); if(*ptr==3) printf("你选择了蓝色图元\n"); ptr++;} printf("\n\n");}voidChangeSize(int w, int h){winWidth = w;winHeight = h;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,winWidth,0.0,winHeight);}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT);DrawRect(GL_RENDER);glFlush();}voidMousePlot(GLint button, GLint action, GLint xMouse, GLintyMouse){GLuint pickBuffer[pickSize];GLint nPicks, vp[4];if(button== GLUT_LEFT_BUTTON && action ==GLUT_DOWN){ glSelectBuffer(pickSize,pickBuffer);//设置选择缓冲区glRenderMode(GL_SELECT); //激活选择模式glInitNames(); //初始化名字堆栈glMatrixMode(GL_PROJECTION);glPushMatrix();glLoadIdentity();glGetIntegerv(GL_VIEWPORT, vp);//定义一个10×10的选择区域gluPickMatrix(GLdouble(xMouse),GLdouble(vp[3]-yMouse),10.0,10.0,vp);gluOrtho2D(0.0,winWidth,0.0,winHeight);DrawRect(GL_SELECT);//恢复投影变换glMatrixMode(GL_PROJECTION);glPopMatrix();glFlush();//获得选择集并输出nPicks = glRenderMode(GL_RENDER);ProcessPicks(nPicks, pickBuffer);glutPostRedisplay();}}intmain(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB); glutInitWindowSize(400,300); glutInitWindowPosition(100,100); glutCreateWindow("拾取操作"); glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);glutMouseFunc(MousePlot);Initial(); glutMainLoop(); return 0;}
- 拾取操作的实现[OpenGL]
- OpenGL拾取操作流程
- opengl的拾取
- OpenGL橡皮筋技术与拾取技术的实现
- OpenGL: 通过射线求交实现物体的拾取
- OpenGL 利用framebuffer实现快速精确的点选拾取
- opengl中鼠标拾取操作分析
- OpenGL从1.0开始--拾取操作
- OpenGL拾取
- 三维坐标系下 使用opengl拾取物件的操作【新浪博客迁移】
- OpenGL鼠标拾取的实现:终于搞定(包括细节问题)
- OpenGL鼠标拾取的实现:终于搞定(包括细节问题)
- [置顶] OpenGL鼠标拾取的实现:终于搞定(包括细节问题)
- opengl es 射线拾取
- OpenGL-选择与拾取
- OpenGL-选择与拾取
- OpenGL中鼠标拾取
- OpenGL-选择与拾取
- glDrawArrays、glDrawElements区别
- 纹理映射坐标[OpenGL]
- C++ 初始化列表
- glCullFace和glFrontFace
- Texture Wrapping Mode
- 拾取操作的实现[OpenGL]
- Activity and Task Design Guidelines
- Multi_touch
- qemu 0.9.1 与 android 环境编译
- [入门]MySQL学习笔记一创建数据库和表
- 骨骼模型实现
- 3DS文件格式
- OpenGL手动刷新
- opengl中0x10000的由来