2009-12-02 176 views
3

我目前正在從遊戲循環調用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對象時效果很好。

+0

看完gluUnProject上的NEHE教程後,似乎該教程與我使用glReadPixel的方式完全相同。我決定恢復我的代碼,並使用glReadPixel,一切似乎都很好。 – 2009-12-03 22:40:43

回答

4

winz參數gluUnproject指定距離攝像機「拾取」點的深度。正如你所說的,這個座標應該在[0,1]範圍內。

像NeHes那樣的一些tutorials從深度緩衝區中讀出z座標,這樣您就可以在適當的深度「挑選」,當然,爲了實現這個功能,您必須在渲染其他所有內容後執行gluUnproject。

無論如何,如果你設置winz 0.5或東西(不爲0或1點最終會在或近或遠裁剪平面,也許撲殺),並執行以下操作:

gluUnProject(cursorX, view[3]-cursorY, 0.5, m, p, view, &objX, &objY, &objZ); 
//Do something useful here??? 
glPointSize(10); 
glBegin(GL_POINTS); 
glColor3f(1, 0, 0); 
glVertex3f(objX, objY, objZ); 
glEnd(); 

你最終應該在鼠標指針處出現一個紅色斑點(如果沒有其他任何東西會透支,並且沒有任何渲染點使其不可見)。

+0

最初,您所建議的更改不起作用,但經過一些實驗後,我發現將view [3](它是384,我的視口的大小)更改爲768(窗口大小)得到了在鼠標座標上繪製的點和0.5改正了位置。然而,鼠標移動似乎只是將實際座標改變一個分數,移動攝像機本身是改變矢量位置超過一小部分的唯一真正方法。例如,我有一個網格,我想移動一個對象,但gluUnProject的矢量與攝影機位置沒有什麼不同。 – 2009-12-02 22:43:52

0

只是一個想法,但如果第三個參數gluUnProject是相機z距離,你會不會在這個位置上繪製任意點你的視錐的近裁剪平面? 最好讓z值稍高。

+0

如果我沒有記錯的話,我嘗試了從我的farZ(2048)到大約10000的更高的Z值。好像Z值越高,鼠標座標對3D空間中點的影響就越小。我認爲Z值實際上只是在0(近)和1(遠)之間進行歸一化。 – 2009-12-02 18:36:57