OpenGL - 鼠标选择与拾取
来源:互联网 发布:mac系统降级10.12 编辑:程序博客网 时间:2024/05/16 14:51
看《OpenGL编程指南》里第13章选择与反馈,有些云里雾里,于是上网搜一些关于这方面的来看,终于觉得弄清楚一点了,在这里写下些我的理解。
首先推荐看一篇博文 http://blog.sina.com.cn/s/blog_4a9aa55c0100vu57.html (文章1),我是看了这个才明白的,然后又看了http://blog.sina.com.cn/s/blog_6923201d01011hur.html(文章2)里面的例子。还有一篇文章,非常强大的从矩阵和投影变换原理方面解释了选择的原理:http://hi.baidu.com/ayokawamadoka/item/74a9af254c063afb51fd8740 (文章三)。这里只说说我理解的一些部分。
1.glLoadName()和glPushName()
文章1和2的例子用到了glLoadName();,我开始不明白它与glPushName()的区别,后来查了下:
void glLoadName(GLuint name):
用name取代名字栈栈顶的那个名字。如果栈是空的,刚调用过glInitName()后就是这样,glLoadName()生成一个GL_INVALID_OPRATION错。为避免这种情况,如果栈初始时是空的,那么在调用glLoadName()之前至少调用一次glPushName()以在名字栈中放上点东西。
void glPushName(GLuint name);
将name压入名字栈。压入名字超过栈容量时将生成一个GL_STACK_OVERFLOW错误。名字栈深度因OpenGL实现(implementations)不同而不同,但最少要能容纳64个名字。你可以用参数GL_NAME_STACK_DEPTH调用glGetIntegerv()以获取名字栈深度。
也就是说,用glLoadName()可以直接将当前这个名字取代名字栈顶的名字,这样就可以直接用了,但是在初始化时要 :加上glPushName(0);
...........
if (GL_SELECT)
{
glPushName(id);
}
drawSomething();
if (GL_SELECT)
{
glPopName();//将之前旧的pop出去
}
...........
2.processHits(hits,selectBuf) 处理点击记录函数。这里我改动文章1的例子,来阐述我的理解:
//hits为产生的点击的数量,buffer中存储点击记录,每个点击记录由四个项目组成
void processHits(GLint hits, GLuint buffer[])
{
某一个点击记录来说,由四个项目组成:
(1)当点击发生时,名字堆栈中的名称数量 names - 即:选中物体的个数
(2,3)自上一个点击记录之后,与视景体相交的所有顶点的最小和最大窗口坐标z值
(4)当点击发生时,名称堆栈的内容,从最底部的元素开始 (元素一共names个)
*/
//如果没有上面for()循环依次访问名字栈的内容,则这里应该写:ptr += names;//跳到下一轮hit点击记录
}
- OpenGL - 鼠标选择与拾取
- OpenGL-选择与拾取
- OpenGL-选择与拾取
- OpenGL-选择与拾取
- OpenGL学习笔记:拾取与选择
- OpenGL学习笔记:拾取与选择
- OpenGL选择与拾取GL_SELECT 附源码
- OpenGL中鼠标拾取
- OpenGL鼠标拾取
- 轻轻松松做OpenGL鼠标拾取
- OpenGL选择-拾取机制(上)
- OpenGL选择-拾取机制(下)
- opengl中鼠标拾取操作分析
- 乱弹OpenGL选择-拾取机制(下)
- OpenGL拾取
- [OpenGL] 兔子与顶点数组、拾取
- [OpenGL]课后案例08:选择模式拾取程序
- <<opengl编程基础>> 3.13 拾取和选择模式
- Git 常用命令
- 关于java一些打包发布可执行文件工具(exe4j+install4j)
- Vc2013实战(2) 彻底厘清C运行库的涵义
- 2013年10月28日-11月1日计划
- /usr/include/pthread.h
- OpenGL - 鼠标选择与拾取
- 蓝花鼠尾草栽培技术指南
- Tomcat SSL配置及Tomcat CA证书安装
- Leetcode: Single Number II
- 当输入名字时,两个字与三个字实现宽度对齐(html)
- 在串口中收发浮点型数据的一种方法
- java中如何让一个类只能实例一次
- Android开发之颜色选择器
- jsp frameset锁定整个框架页面