2013-06-28 41 views
2

我正在寫使用OpenGL一個MFC C++應用程序。該程序允許繪製和操作三維物體。現在我想找到座標,在與我的對象相同的座標空間中,在任何地方我點擊屏幕上的鼠標。OpenGL的座標變換Sceen到世界

到目前爲止,我一直在使用glReadPixels和gluUnProject的組合,它一直在努力,但只有當我點擊我的鼠標的地方在那裏的對象已經被繪製。如果我點擊物體外的任何地方,所獲得的座標都完全關閉。

所以我想知道如何改變我的代碼,這樣我可以找到座標空間我的對象是在屏幕上的任何位置座標。下面是我一直使用的代碼:

GLint viewport[4]; 
GLdouble ox, oy, oz;//the coordinates I need 
GLfloat winZ = 0.0; 
::glGetIntegerv(GL_VIEWPORT, viewport); 
::glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix); 
::glGetDoublev(GL_MODELVIEW_MATRIX, modelviewMatrix); 
GLfloat winX = (float)point.x;//point.x and point.y are the mouse coordinates 
GLfloat winY = (float)viewport[3] - (float)point.y; 

::glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); 

gluUnProject((GLdouble)winX, (GLdouble)winY, (GLdouble)winZ, modelviewMatrix, projectionMatrix, viewport, &ox, &oy, &oz); 
+0

你的屏幕是2D的,你的世界是3D的。屏幕上的每個2D位置不是與3D點相對應,而是與射線/線/線段相對應。出於好奇,如果'winZ'是1,'gluUnProject'會返回什麼? –

+0

即使winZ爲1,它也會每次返回1。請問您能詳細說明每個2D點如何對應於射線/線/線段嗎?什麼是重要性和方向? –

回答

0

gluUnProject採取窗口空間座標和聯合國項目將它們與世界觀投射視變換的倒數。如果座標與現有對象相對應,則不知道。

當你清除深度緩存,它與被讀取爲1.0 glReadPixels價值無處不在初始化。

當對象的可見片段被吸引他們將通過深度測試和將覆蓋的深度值與每個像素相交這些片段更小的值。

這意味着每次你讀的深度緩衝像素與1.0的值時,這意味着什麼可見已在像素被吸引,這就是你得到的結果是完全關閉。

+0

是的,你是絕對正確的,當我從沒有可見碎片的點讀取時,winZ總是返回1.0。那麼在那種情況下,我不可能用我目前的方法來實現我想要做的事情?如果有的話,我應該使用哪些其他功能? 我想我需要的是一個世界轉型的屏幕? –

相關問題