2011-10-16 160 views
2

在我的鼠標回調中,我需要找出mosuebutton相對於原點被點擊的位置(所以我需要-1到1的值)在mosue回調中, GLint返回值400或x位置。我如何獲得相對x位置或如何轉換x值?如何從鼠標點擊獲得相對x和y位置

void mouseClicked(GLint button,GLint state,GLint x,GLint y) 
{ 
    if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) 
    { 
     //get x of square clicked 
     if(x<0.0) 
     { 
      cout<<"left side of the screen"<<endl; 
     } 
    } 
} 
+0

你的意思是,你想在世界座標中的鼠標位置? –

+0

是的,這就是我的意思 – James

+0

@datenwolf的答案回答了你的問題「如何獲得世界座標」。但我想強調的是,世界座標並不是知道鼠標點擊屏幕哪一側的方法。 –

回答

1

鼠標單擊缺少一個重要信息:單擊的深度。你所擁有的只是屏幕上的一個2D點。但是,這會映射到場景中的一個射線。你可以做的最好的是從鼠標點擊確定光線。爲此,您需要從視口取消投影到該射線上的某個點。

爲此,你需要:

  1. 反向視口映射,即映射鼠標點擊在視區座標回範圍[-1,1]中任一座標(這給你NDC)中,我們假設默默的深度將是1

  2. 未項目,即由與逆投影矩陣

  3. 未模型視圖乘以深度1乘以NDC,即通過用乘乘以未投影點該逆模型視圖矩陣。

如果投影或模型視圖矩陣是單數的,即不可逆,這將不起作用。

GLU庫提供此功能,包括函數gluUnproject中的矩陣求逆。

結果是a指向射線。射線本身由射線方程r(\ tau)= r_0 * tau給出,其中r_0是您得到的一點。

0

快速回答你的問題會像這樣:

void mouseClicked(GLint button,GLint state,GLint x,GLint y) 
{ 
    // Convert x & y 
    GLfloat fX = ((x/g_cxScreen) - 0.5) * 2; 
    GLfloat fY = ((y/g_cyScreen) - 0.5) * 2; 

    if(button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) 
    { 
     //get x of square clicked 
     if(x<0.0) 
     { 
      cout<<"left side of the screen"<<endl; 
     } 
    } 
} 

這是假設g_cxScreen和g_cyScreen分別是屏幕寬度和高度。這將使你的鼠標座標正常化。

相關問題