GLFrame框架本身不支持拾取,需要自己实现.以下代码是实现拾取功能的注意事项:

 void Test::doSelection(int xPos, int yPos)
{
GLfloat aspect;
GLint hits, viewport[];//x,y,width,height
glSelectBuffer(BUFFER_LENGTH, pickBuffer); //设置选择缓冲区
glGetIntegerv(GL_VIEWPORT, viewport); //获取可视区域
glMatrixMode(GL_PROJECTION); //切换矩阵模式为投影模式并保存当前矩阵
glPushMatrix();
glRenderMode(GL_SELECT); //改变渲染模式为选择模式
glLoadIdentity(); //以 xPos、yPos 为中心建立新的单位立方体裁剪区,并向外扩展两个像素
int yPosNew= viewport[] - yPos + viewport[];
gluPickMatrix(xPos, yPosNew , 1.0f, 1.0f, viewport);
aspect = GLfloat(viewport[]) / GLfloat(viewport[]);
gluPerspective(45.0f, aspect, 0.1f, 300.0f);//很重要的设置
Draw(); //绘制场景
hits = glRenderMode(GL_RENDER); //收集单击记录
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW); //恢复矩阵模式为模型视图模式
if(hits >= )
{
char str[];
memset(str,'\0',);
for(int i=;i<;i+=)
{
sprintf(str,"选中物体的个数:%d 最小深度:%f 最大深度:%f 物体名字:%d\n",pickBuffer[i],(float)pickBuffer[i+]/(float)0xffffffff,(float)pickBuffer[i+]/(float)0xffffffff,pickBuffer[i+]);
MessageBox(NULL,str,"提示",MB_OK);
}
}
else
{
char str[];
memset(str,'\0',);
sprintf(str,"%s","你击中了空白!");
MessageBox(NULL,str,"提示",MB_OK);
}
}

1行             xPos,yPos是相对坐标,而非绝对坐标

9行             切换为选择模式

13行~14行  必须加,对GLFrame没有影响,因为7~8两行代码

15行           Draw函数(针对拾取,还要在draw中的glLoadIdentity();后再加上glInitNames();glPushName(0);两行代码)
16行           收集拾取信息

OpenGL拾取注意事项的更多相关文章

  1. 深入理解OpenGL拾取模式(OpenGL Picking)

    深入理解OpenGL拾取模式(OpenGL Picking) 本文转自:http://blog.csdn.net/zhangci226/article/details/4749526 在用OpenGL ...

  2. cocos2dx实现3d拾取注意事项

    用的是cocos2dx 3.x,如果是真机测试,glview = cocos2d::GLViewImpl::createWithRect(...)和glview->setDesignResolu ...

  3. OpenGL中的拾取模式( Picking)

    1. Opengl中的渲染模式有三种:(1)渲染模式,默认的模式:(2)选择模式, (3)反馈模式.如下 GLint glRenderMode(GLenum mode) mode可以选取以下三种模式之 ...

  4. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现 什么意思? 拾取 最简单的理解拾取的方式大概是到(http://www.yakergong.net/nehe/course/t ...

  5. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2)

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2) 上一篇里介绍了Color-Coded Picking的思路和最基本的实现.在处理GL_POINTS时已经没有问题,但是处 ...

  6. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3)

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3) 到上一篇为止,拾取一个VBO里的单个图元的问题已经彻底解决了.那么来看下一个问题:一个场景里可能会有多个VBO,此时每个 ...

  7. opengl中拾取操作的实现

    opengl采用一种比较复杂的方式来实现拾取操作,即选择模式.选择模式是一种绘制模式,它的基本思想是在一次拾取操作时,系统会根据拾取操作的参数(如鼠标位置)生成一个特定视景体,然后又系统重新绘制场景中 ...

  8. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  9. NeHe OpenGL教程 第三十二课:拾取游戏

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. 安装MVC3后没有dbcontext生成器的解决方案

    安装MVC3后,采用DBFIRS的方式,从数据库生成模型,这样生成的类是基于ObjectContext的,无法使用DbContext的一些方法,比如Set.Find.Entry等.需要用ADO.NET ...

  2. vb 修改数据库

    Dim rscode As New ADODB.Recordset ................... Set RsCode = zwpub.DataMdb.DbConnect.Execute(& ...

  3. C#中jQuery Ajax实例(二)

    上一篇写了一个简单的Ajax异步程序,这一次同样是简单的程序,只不过这次先把参数传到一般处理程序(后缀为ashx)中,再把结果传回到页面. 1.html代码: <html xmlns=" ...

  4. 我的工具箱之FileZilla_3.11.0.1_win32-setup.1432524055

    FileZilla是用于在Win和Linux之间传递文件的工具,支持FTP和SFTP. 下载地址:http://pan.baidu.com/s/1gelyIYn 2016年3月2日10:29:30

  5. Java 日志管理最佳实践

    转:http://blog.jobbole.com/51155/ 日志记录是应用程序运行中必不可少的一部分.具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源.对于开 ...

  6. .net 4.0 ValidateRequest="false"

    在安装了Visual Studio 2010 Beta2之后,当页面输入框默认情况下输入"<"或者">"的时候.按照访问策略,这将导致一些安全问题, ...

  7. search搜索功能

    1.html <div class="search">        <form name="formsearch" action=" ...

  8. SDUT2165:Crack Mathmen(快速幂)

    题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2165&cid=1431 快速幂. #include <iostream> ...

  9. 关闭不安全的HTTP方法

    关闭不安全的HTTP方法 在项目或tomcat下的web.xml中,添加如下配置: <!-- 关闭不安全的HTTP方法 --> <security-constraint> &l ...

  10. [CC]CC插件初探

    应用程序插件框架的内容包括:主程序App,插件Plugin. 1.实现一个应用程序插架框架关键点有: 一个插件的标准接口,在主程序中存在一个插件的集合.主程序通过循环读取每个插件,将插件对象通过多态的 ...