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