折腾了两天的拾取操作。。。

 啊哈,折腾了两天opengl上的拾取操作,总算是找到问题了。

  一开始是能拾取的但是selectbuffer中的记录总是不对,开始还以为只是拾取函数出问题了,然后仔细看了遍红宝书,按照红宝书中的步骤走了一遍,还是出错。。。然后就开始考虑是不是之前用了glulookat视图变换的问题,索性不用这个函数了,也就是视图变换采用默认,还是出错。。。然后不断的改代码,不断地debug。。。终于找到问题了,丫的,在

gluPickMatrix(point.x,viewport[3]-point.y,5.0,5.0,viewport);
gluPerspective(45,(double)m_wide/(double)m_heigth,0.1,2000);

这两个函数之后的DrawPoint函数之前,不能有任何矩阵操作。 = =,这句话貌似有点费解,详细说下什么意思吧

我的render函数是RenderScene,里面有一些DrawPoint、DrawAxes等等的东西,假如我在DrawPoint之前有平移、旋转之类的操作,gluPerspective之后再进行DrawPoint拾取的话,拾取的射线就不会经过鼠标点击的像素位置,为啥哩,因为渲染的时候我平移了呀,而拾取的时候没有这些平移,当然出问题啦。

  话说有必要实现一遍软件光栅化啊,顿时感觉基础不牢地动山摇。。。话说OpenGL的固定管线真难用T T

 1         GLuint selectbuf [512];
 2     GLint hits;
 3     GLint viewport [4];
 4     glGetIntegerv(GL_VIEWPORT,viewport);
 5     glSelectBuffer(512,selectbuf);
 6     (void)glRenderMode(GL_SELECT);
 7     glInitNames();
 8     glPushName(0);
 9     glMatrixMode(GL_PROJECTION);
10     glPushMatrix();
11     glLoadIdentity();
12     gluPickMatrix(point.x,viewport[3]-point.y,5.0,5.0,viewport);
13     gluPerspective(45.0f, (double)m_wide/(double)m_heigth,0.1,2000);
14     DrawPoint(GL_SELECT);
15     glMatrixMode(GL_PROJECTION);
16     glPopMatrix();
17     glFlush();
18     hits = glRenderMode(GL_RENDER);
19     ProcessSelect(hits,selectbuf);
20     glMatrixMode(GL_MODELVIEW);        

  然后加上glulookat之后,不进行变换的话没问题,假如旋转出问题,直接不用glulookat了,问题也就是在DrawPoint之前,RenderScene之后不能有平移之类的东西。。。。

时间: 2024-10-24 12:23:04

折腾了两天的拾取操作。。。的相关文章

【转】D3D中详细拾取操作

Direct3D中实现图元的鼠标拾取 BY 重剑,2004.5.28 重剑空间 原文链接:http://dev.gameres.com/Program/Visual/3D/pick_2004_529.htm 索引: 1.什么是拾取,拾取能做什么? 2.拾取操作的步骤和实现 2.1.  变换并获得通过视点和屏幕上点击点的射线矢量(Dir) 2.1.1 确定鼠标选取点的屏幕坐标 2.1.2 得到Dir在观察坐标空间内的表示 2.1.3 转换Dir到世界坐标空间,并得到观察点在世界坐标系中的坐标 2.

Oracle中如何实现Mysql的两表关联update操作

在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.price WHERE items.id=month.id; 在MySQL中构造表验证了一下 mysql> select * from test; +------+--------+ | id | salary | +------+--------+ | 1 | 100 | | 2 | 200 | | 3

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。 牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。 这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等.问是否可行.牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍.这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次.输入描述: 输入一个正整数N (N <= 50) 接下来一行输入N个正整数,每个数均小于等于1e9. 输出描述: 假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO" 输入例子: 2 1 2 输出例子: YES

opengl中拾取操作的实现

opengl采用一种比较复杂的方式来实现拾取操作,即选择模式.选择模式是一种绘制模式,它的基本思想是在一次拾取操作时,系统会根据拾取操作的参数(如鼠标位置)生成一个特定视景体,然后又系统重新绘制场景中的所有图元,但这些图元并不会绘制到颜色缓存中,系统跟踪有哪些图元绘制到了这个特定的视景体中,并将这些对象的标识符保存到拾取缓冲区数组中. 步骤: 1.设置拾取缓冲区:void glSelectBuffer(GLsizei n,GLunint *buff); 2.进入选择模式:指定选择模式采用函数:G

Java接入Spark之创建RDD的两种方式和操作RDD

首先看看思维导图,我的spark是1.6.1版本,jdk是1.7版本 spark是什么? Spark是基于内存计算的大数据并行计算框架.Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark 部署在大量廉价硬件之上,形成集群. 下载和安装 可以看我之前发表的博客 Spark安装 安装成功后运行示例程序 在spark安装目录下examples/src/main目录中. 运行的一个Java或Scala示例程序,使用bin/run-examp

利用两个流进行操作演示

项目下载链接 1 /* 2 * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. 3 * 4 * NVIDIA Corporation and its licensors retain all intellectual property and 5 * proprietary rights in and to this software and related documentation. 6 * Any use, repr

Atom编辑器折腾记_(8)分屏操作

分屏 何为分屏..请看此图 为何要分屏 用过linux的小伙伴都知道,分屏耍的好,可以提高工作效率的 如何获取Atom的分屏命令 最简易的,进入设置中心的快捷键列表,搜索pane 和 split 就可以看到命令和选择器了 查询官方手册 为何不用默认的分屏快捷键 有些失效了.就是按了没反应,应该和一些插件冲突了 不习惯,符合自己习惯的才是最高效的 自定义快捷键 为何这样自定义我写在注释里面了-vi/vim #分屏快捷键自定义 #alt-fkey是分屏的方向,仿vim模式 #ctrl-fkey是光标

状态与策略——审批操作的两种方案

审批操作是ERP或OA系统中必不可少的功能之一.这里介绍两种我设计的用于审批操作的方案,并借此就"状态模式"与"策略模式"提出一点自己的理解.    别问我为什么不使用工作流引擎等工具来实现审批功能.做第一版方案时,我孤陋寡闻得并不知道有这个东西.后来引入工作流框架会导致学习曲线骤然上扬,不太划算. 背景 背景无需过多介绍,不外乎有一些数据/任务/请求,需要由领导们点一下头或者按钮. 思路 由于孤陋寡闻,在得到需求之后,我第一反应不是"工作流",

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

深入理解OpenGL拾取模式(OpenGL Picking) 本文转自:http://blog.csdn.net/zhangci226/article/details/4749526 在用OpenGL进行图形编程的时候,通常要用鼠标进行交互操作,比如用鼠标点选择画面中的物体,我们称之为拾取(Picking),在网上看了很多OpenGL拾取的文章,但大多是只是介绍在OpenGL中如何拾取,如何利用OpenGL提供的一系列函数来完成拾取,最多再简单介绍下OpenGL的名字栈(Name stack),