首页 > 代码库 > 折腾了两天的拾取操作。。。

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

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

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