void OpenGL::pickRects(){
/* GetCursorPos(&mouse);
ScreenToClient(hWnd,&mouse);
GLuint pickBuffer [32];
GLint nPicks,vpArray[4];
glRenderMode(GL_SELECT);
glSelectBuffer(32,pickBuffer);
glInitNames();
//glPushName(-1);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
//glLoadIdentity();
glGetIntegerv(GL_VIEWPORT,vpArray);
gluPickMatrix(GLdouble(mouse.x),GLdouble(vpArray[3]-mouse.y),5.0,5.0,vpArray);
// glOrtho(0,1,0,1,0,1);
//激活拾取区域。
// gluOrtho2D(0,0,Width,Height);
rects(GL_SELECT);
glMatrixMode(GL_PROJECTION);
int j;
glGetIntegerv(GL_NAME_STACK_DEPTH,&j);
cout<<j<<endl;
glPopMatrix();
glFlush();
nPicks=glRenderMode(GL_RENDER);
processPicks(nPicks,pickBuffer);
//processPicks(nPicks,pickBuffer);
*/
GetCursorPos(&mouse);
ScreenToClient(hWnd,&mouse);
GLuint selectBuf[32];
GLint hits;
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(32, selectBuf);
(void) glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
//下面这段代码可有可无,只是为了确保点击测试和实际绘图用的是同一个投影阵。
glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵
gluPerspective // 设置透视图
( 53.0f, // 透视角设置为 90 度
(GLfloat)Width/(GLfloat)Height, // 窗口的宽与高比
0.1f, // 视野透视深度:近点1.0f
3000.0f // 视野透视深度:始点0.1f远点1000.0f
);
glPushMatrix();
下面的代码是最关键的地方,,注意:据测试:gluPickMatrix()意思并不是仅仅绘制一个拾取窗口。同时,
它也是一个投影矩阵变换!!~~~~如果使用第二个LoadIdentity()那么:前面的拾取矩阵就会失效!!
glLoadIdentity();
/* create 5x5 pixel picking region near cursor location */
gluPickMatrix((GLdouble) mouse.x, (GLdouble) (viewport[3] - mouse.y),
5.0, 5.0, viewport);
//这个会促使上面那个PickMatrix失效!!切记~~~~
//glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵
gluPerspective // 设置透视图
( 53.0f, // 透视角设置为 90 度
(GLfloat)Width/(GLfloat)Height, // 窗口的宽与高比
0.1f, // 视野透视深度:近点1.0f
3000.0f // 视野透视深度:始点0.1f远点1000.0f
);
rects(GL_SELECT);
glPopMatrix();
glFlush();
hits = glRenderMode(GL_RENDER);
processPicks(hits, selectBuf);
int j;
glGetIntegerv(GL_NAME_STACK_DEPTH,&j);
int m;
}
void OpenGL::rects(GLenum mode)
{
if (mode == GL_SELECT)
glLoadName(30);
glPushMatrix();
glTranslatef(-2,-1,-15);
glColor3f(0.6f,0.2f,0.9f);
// glRecti(0,0,100,100);
Font->c3dtext("离开游戏",hFont,0.25f);
glPopMatrix();
/* glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 0.0);
glVertex3i(2, 0, 0);
glVertex3i(2, 6, 0);
glVertex3i(6, 6, 0);
glVertex3i(6, 0, 0);
glEnd();
*/
if (mode == GL_SELECT)
glLoadName(20);
glPushMatrix();
glTranslatef(-2,1,-15);
glColor3f(0.6f,0.2f,0.9f);
Font->c3dtext("开始游戏",hFont,0.25f);
glPopMatrix();
/*glBegin(GL_QUADS);
glColor3f(0.0, 1.0, 1.0);
glVertex3i(3, 2, -1);
glVertex3i(3, 8, -1);
glVertex3i(8, 8, -1);
glVertex3i(8, 2, -1);
glEnd();
*/
/*
if (mode == GL_SELECT)
glLoadName(3);
glBegin(GL_QUADS);
glColor3f(1.0, 0.0, 1.0);
glVertex3i(0, 2, -2);
glVertex3i(0, 7, -2);
glVertex3i(5, 7, -2);
glVertex3i(5, 2, -2);
glEnd();
/*
if(mode==GL_SELECT)
glPushName(1);
glPushMatrix();
// glTranslatef(0,0,-Height);
glColor3f(0.0,1.0,0.0);
// glPushName(20);
glTranslatef(-2,-1,-15);
// glColor3f(0.6f,0.2f,0.9f);
// glRecti(0,0,100,100);
Font->c3dtext("离开游戏",hFont,0.25f);
/*glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-Width/2, -Height/2, -0.0f);// 前
glTexCoord2f(1.0f, 0.0f); glVertex3f( Width/2,-Height/2, -0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( Width/2, Height/2, -0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-Width/2, Height/2, -0.0f);
glEnd();
// glColor3f(1.0,0.0,0.0);
// glTranslatef(-2,1,-15);
glColor3f(0.6f,0.2f,0.9f);
// Font->c3dtext("开始游戏",hFont,0.25f);
glPopMatrix();
if(mode==GL_SELECT)
glPushName(2);
glPushMatrix();
// glTranslatef(0,0,-Height);
// glColor3f(0.0,1.0,0.0);
// glPushName(20);
glTranslatef(-2,-1,-15);
glColor3f(0.6f,0.2f,0.9f);
// glRecti(0,0,100,100);
Font->c3dtext("离开游戏",hFont,0.25f);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-Width/2, -Height/2, -0.0f);// 前
glTexCoord2f(1.0f, 0.0f); glVertex3f( Width/2,-Height/2, -0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( Width/2, Height/2, -0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-Width/2, Height/2, -0.0f);
glEnd();
glPopMatrix();
*/
}
void OpenGL::processPicks(GLint hits,GLuint buffer[]){
rects(GL_RENDER);
cout<<hits<<endl;
unsigned int i, j;
GLuint names, *ptr;
printf("hits = %d\n", hits);
ptr = (GLuint *) buffer;
for (i = 0; i < hits; i++) {
names = *ptr;
printf(" number of names for hit = %d\n", names); ptr++;
printf(" z1 is %g;", (float) *ptr/0x7fffffff); ptr++;
printf(" z2 is %g\n", (float) *ptr/0x7fffffff); ptr++;
printf(" the name is ");
for (j = 0; j < names; j++) {
printf("%d ", *ptr); ptr++;
}
printf("\n");
}
}
分享到:
相关推荐
OPENGL鼠标拾取与选择
opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型opengl+qt实现鼠标选中模型...
本资源讲述了利用鼠标进行拾取的核心代码,适合于初学者,相信能为大家带来帮助
里面是一个简单的demo,实现用鼠标控制视角的变换。
opengl画球体,可以做多种变换,利用了键盘事件和鼠标事件
ios下opengl射线拾取支持贴图模型拾取
openGL的拾取操作程序,程序关键部分都有汉字说明。
名称:ShadowEditor跨平台3D场景编辑器(含GPU鼠标拾取功能) 版本:v0.6.1 (开发中) 简介:基于WebGL、Three.js、Go语言和MongoDB的跨平台的3D场景编辑器,采用OpenGL ES 2.0(WebGL)开发。 其中已包含three.js利用gpu...
用opengl C++写的一个小程序,可以用鼠标拾取其中的对象并变色,还可以对比各种绘图模式下FPS的不同
OpenGL拾取例子[太阳系 OpenGL拾取例子[太阳系
OpenGL实现鼠标绕任意轴旋转/平移/缩放 自己封装的鼠标封装的鼠标场景漫游工具类RoamingScenceManager,跟界面没有任何关系,压缩包里面有三个工程,分别是Qt,Win32(原生OpenGL界面),MFC 三个环境,里面都用到了...
opengl 实现 鼠标 拾取
就是红宝书的上例子,opengl实现拾取操作,一个作业而已
基于VC6.0的鼠标拾取图形,动态选择各做图元素
在OpenGL场景中实现三维点的拾取,压缩文件包含头文件和源文件,添加到工程中即可。
OpenGL 拾取。代码诠释了一个简单的拾取过程, 是新手学习拾取的一个很好的范例~
openGL鼠标画矩形。鼠标第一次点击,并拖动会画出矩形,第二次点击释放。
基于opengl的鼠标交互拾取,从二维转到三维坐标
计算机图形学 OpenGL 实验七 顶点数组 拾取