我目前正在從遊戲循環調用Trace(方法如下)。現在我所要做的就是從屏幕鼠標獲取世界座標,這樣我就可以在世界空間中移動物體。然而,我從gluUnProject獲得的值是;令我困惑。gluUnProject的世界座標問題()
我正在使用glReadPixel(...)來獲取Z值,但是在我繪製的對象中產生了很少或沒有移動,並且產生的向量最終與我的相機位置相同(除了小十進制由於鼠標移動的變化),所以我決定擺脫呼叫,並用1替換Z值。
我的問題是:以下代碼是否適合您?我見過的每一個例子都是相同的或者非常相似,但是我似乎無法產生正確的結果,即使我鎖定了Y軸。如果代碼是正確的,那麼我猜測我只是沒有正確地使用結果向量。我是否應該無法直接繪製對象或直接使用所生成的矢量,還是必須使用其他方法來執行其他操作,例如正常化?
當前渲染模式爲GL_RENDER,我使用的NearF值爲1且FarZ值爲2048的glFrustum創建透視圖。還有一系列與剪刀一起創建的視口,尺寸和寬度均爲512x768,並位於1024x768窗口的每個角落。跟蹤(...)在渲染左上視口之間調用,並且是唯一透視投影,而其他視口是正交投影。 FOV設置爲45.
void VideoWindow::Trace(int cursorX, int cursorY)
{
double objX, objY, objZ;//holder for world coordinates
GLint view[4];//viewport dimensions+pos
GLdouble p[16];//projection matrix
GLdouble m[16];//modelview matrix
GLdouble z;//Z-Buffer Value?
glGetDoublev (GL_MODELVIEW_MATRIX, m);
glGetDoublev (GL_PROJECTION_MATRIX,p);
glGetIntegerv(GL_VIEWPORT, view);
//view[3]-cursorY = conversion from upper left (0,0) to lower left (0,0)
//Unproject 2D Screen coordinates into wonderful world coordinates
gluUnProject(cursorX, view[3]-cursorY, 1, m, p, view, &objX, &objY, &objZ);
//Do something useful here???
}
任何想法?
編輯:我已經將winZ值更改爲0.5而不是1,這給出了更合理的向量,但繪製點仍然不匹配鼠標。我發現view [3]的值是384,對於我正在使用的視口是正確的,但是我用768(實際窗口大小)替換了它,鼠標跟着鼠標100%。進一步的實驗表明,我無法使用座標在透視世界空間中使用這些座標移動3D對象,但在正交空間中移動3D對象時效果很好。
看完gluUnProject上的NEHE教程後,似乎該教程與我使用glReadPixel的方式完全相同。我決定恢復我的代碼,並使用glReadPixel,一切似乎都很好。 – 2009-12-03 22:40:43