---------作者 熊斌
OpenGL中的互動功能中最重要的一個是拾取(或者叫選擇),但是我們經常會碰到開啟了選擇模式,但是確在螢幕上選不到物體,或者是點螢幕上任何地方都有物體被選中的情況....
這是為什麼呢?
看看使用選擇模式的過程是怎麼樣的:
1.在繪圖函數中給圖元命名
2.在滑鼠響應中調用你的選擇處理函數
3. 在處理函數中設定選擇緩衝區,
4.###### 最重要的地方 #########
1) 調用矩陣操作函數,切換到投影矩陣模式,然後將其壓棧,共置為單位矩陣
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
2) 產生你的拾取矩陣
glGetIntegerv(GL_VIEWPORT, viewport);
gluPickMatrix(point.x, viewport[3] - point.y, 2,2, viewport);
要注意上面的函數的操作對象是投影矩陣, 所以調用它以後必須緊跟著下面的函數 設定與渲染模式下相同的透視投影矩陣,中間千萬不要再幹擾投影矩陣了,否則你就永遠別想得到正確的選取了
3) 設定與渲染模式下相同的透視投影矩陣
gluPerspective(m_dFovy, (double)viewport[2]/(double)viewport[3],NEARPLANE, FARPLANE);
到此位置要進行的投影矩陣的準備工作就完成了
5. 切換渲染模式 到SELECT模式
glRenderMode(GL_SELECT);
6.渲染並搜集點擊
RenderScene();
hits = glRenderMode(GL_RENDER);
根據上面的過程可以看出,要正確的使用選擇模式,關鍵在於設定正確的投影矩陣, gluPickMatrix ,gluPerspective 兩個函數所設定的投影矩陣的值不能被破壞,否則你就無法得到正確的結果了.
一般情況下,如果出現選擇異常,則需要檢查投影和模型視圖矩陣的超作,比如PushMatrix後有沒有PopMatrix, 是不是
對這些矩陣進行了不正確的改動.
以上為本人實踐經驗,如果有錯,歡迎指正.
協助俺點俺部落格中左邊的圖圖咯........
不要看了就跑(太自私了吧)......