码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-06 15:04:48      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:

 啊哈,折腾了两天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之后不能有平移之类的东西。。。。

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

标签:

原文地址:http://www.cnblogs.com/AZ-ZK/p/4205922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!