2013-10-03 65 views
0

獲取畫面COORDS說我做了四,象這樣:點擊一個Quad和OpenGL中

float botBaseY = -0.5; 
glBegin(GL_QUADS); // Box 
    glVertex2f(-.05, botBaseY + -.05); 
    glVertex2f(-.05, botBaseY + .05); 
    glVertex2f(.05, botBaseY + .05); 
    glVertex2f(.05, botBaseY + -.05); 
glEnd(); 

OK,現在好了,說我要確定用戶是否是四內點擊。 好吧,當你點擊,你會收到屏幕座標,所以如果你的主窗口是 600x600像素,那麼你的點擊將產生小於600的x和y值。 但是我比較點擊(375,400)四邊形是使用從-1.0到1.0的 值創建的,以定義4個頂點。

如何確定用戶是否點擊了四邊形內部?

+0

你正在考慮這個倒退。當你點擊某處時,你已經擁有屏幕座標。你想要做的只是檢測點擊點是否在四邊形內(它覆蓋了標準化設備空間的一小部分,如果它是屏幕對齊的,這更容易)。您應該可以使用視口轉換的逆操作來完成此操作。 –

回答

0

我從來沒有在這裏得到有用的答案,但我確實在第二天結束了。我的盒子正在使用從-1到1的座標進行繪製。但是,我的點擊具有大屏幕座標,如200,300。我需要知道如何將-1轉換爲1到屏幕座標,或者如何繪製兼容的座標。

glMatrixMode(GL_PROJECTION); 
gluOrtho2D(0, 400, 0, 400); 
glBegin(GL_QUADS); // Box 
    glVertex2f(xOffset + topBaseX + -15, topBaseY + -15);// bottom left vert 
    glVertex2f(xOffset + topBaseX + -15, topBaseY + 15); // top left vert 
    glVertex2f(xOffset + topBaseX + 15, topBaseY + 15);// top right vert 
    glVertex2f(xOffset + topBaseX + 15, topBaseY + -15);// bottom right vert 
glEnd(); 
glLoadIdentity(); 

這是我不得不做的東西像200,300畫我的盒子,然後我可以簡單地檢查我的盒子的邊界上的每一次點擊。

1

我目前看到2種方式來做到這一點。

  1. 如果您的'界面'完全是2D並直接映射到屏幕 - 您可以使用屏幕座標進行繪製。只需設置正確的正交矩陣,您的點擊座標將與2D元素座標相同 - 簡單範圍比較(x < click_x < x +寬度)。請參閱gluOrtho2D,glOrtho手冊(請注意,glOrtho和其他矩陣函數在最新的GL配置文件中不可用)。

  2. 如果第一個變體不適合您的情況 - 您需要映射2D座標以查看空間並將結果點用作光線方向。然後跟蹤您想要單擊的元素的平面的這個射線的交點。看看http://www.toymaker.info/Games/html/picking.html - 無所謂它是爲d3d,數學總是相同的)。然後,當你在一架你感興趣的飛機上獲得最終的點擊點時 - 這又是一個範圍比較(儘管如果你的飛機不是平行於屏幕,它會有點棘手 - 但我不認爲它仍然是同樣的問題)。

-1

最簡單,最準確的(但不一定是最有效的)方式:

再次渲染場景(到屏幕外的緩衝區),與目標對象白色和一切黑。如果光標下的像素爲白色,則點擊目標。如果您希望能夠點擊某些透明材質,只需跳過渲染這些對象即可。

爲了提高效率,您可以在關閉混合和每個對象的唯一顏色(可能是索引)的情況下執行此操作。並且使用新的OpenGL功能在正常渲染期間填充拾色器顏色平面,而不是進行額外的傳遞。