2013-12-16 237 views
1

我有一個函數可以在三維空間中用鼠標座標創建一個向量。OpenGl獲取鼠標位置

這裏是我的代碼:

void myMouse(int x, int y){ 
    GLint viewport[4]; 
    GLdouble modelview[16]; 
    GLdouble projection[16]; 
    GLfloat winX, winY, winZ; 
    GLdouble posX, posY, posZ; 

    glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
    glGetDoublev(GL_PROJECTION_MATRIX, projection); 
    glGetIntegerv(GL_VIEWPORT, viewport); 

    winX = (float)x; 
    winY = (float)viewport[3] - (float)y; // Subtract The Current Mouse Y Coordinate 

    glReadPixels(x, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);//Reads the depth buffer 


    gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); 


    vector.x=posX; 
    vector.y=posY; 
    vector.z=posZ; 
} 

然後,將載體作爲吸引一些點是I'draw。如果我將z位置設置爲0,代碼運行得非常好,但是當我旋轉場景時點不跟隨鼠標的光標。但是,如果我將vector.z設置爲上面的代碼,則粒子開始向我移動,然後它們消失(即它們落在視點之後)。

我希望我的觀點只能在z軸指向我時在x/y軸上跟隨鼠標,在y軸指向我時在x/z軸上跟隨鼠標,在y/z上指向y/z軸當x軸指向我時,它是一個軸。

或者,我怎樣才能在距離我的觀點的固定距離上設置z位置?

+0

在調用'glGet *()'之前,您是否旋轉了矩陣......如果不是這可能是您的問題。 – Vallentin

+0

我該如何旋轉它們? – user3098549

+0

「,但是當我旋轉場景時點不跟隨鼠標的光標」...在調用'glGet *()'之前旋轉嗎? – Vallentin

回答

0

最有可能你的問題就出在這些線路:

glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
glGetDoublev(GL_PROJECTION_MATRIX, projection); 
glGetIntegerv(GL_VIEWPORT, viewport); 

OpenGL是一個狀態機和您查詢什麼有可能是任何東西。在繪製時,通常以各種方式操作這些矩陣的內容,因此您查詢的內容可能不會有最初用於繪製的矩陣。

爲了解決您的問題,您應該在設置初始視圖後立即在繪圖時製作投影和模型視圖以及視口設置的副本。然後使用這些副本而不是查詢的值,這可能與您實際需要的值非常不同。