2012-12-30 39 views
3

我的窗口上有一個矩形,我試圖通過定義矩形的區域來使該矩形可點擊。使對象可點擊(如果鼠標位於對象的區域內,請點擊)

如果鼠標單擊在這個區域內,那麼它是一個點擊其他不是。

對於例如:在窗口,讓我們假設矩形的頂點是:
x = 40, y = 50; width = 200, height = 100;
所以,當
(mouseXPos > getX()) && (mousxPos < (getX()+width)) && (mouseYPos > getY()) && (mouseYPos > getY()+height)

現在,我做的lookAt轉型的點擊會算對象通過繼承一個具有lookAt函數的類。另外,我正在使用相機檢查物體的不同面(相機旋轉)。因此,當相機使用時,物體沿各個軸旋轉並顯示不同的臉部。

但是,當物體移動時,我會認爲矩形的頂點會改變。矩形的頂點也應該在做gluLookAt函數時發生了變化,但看起來好像沒有,並且儘管對象不在那裏,但我的點擊區域始終保持靜止。我如何解決這個問題?如何讓我的對象可點擊並在其上添加一些鼠標事件?

回答

0

如果你想點擊3D形狀,並且你正在移動相機,我不會在屏幕座標中檢查這個。

相反,您可以將用戶點擊到3D空間中的點的位置,並將其與可點擊的對象相交。

GL具有這樣的功能:gluUnproject()

如果你給這個函數被點擊您的視圖的細節,同屏點一起,它可以告訴你在三維空間中用戶點擊這裏。如果您在近平面和遠平面檢查一個點,則可以檢查這些點之間的界線是否與您的物體相對。

另一種替代方法是某種ID緩衝區,您可以在場景外渲染場景,但不是輸出帶陰影的像素,而是輸出每個對象的ID值。命中測試就是從緩衝區讀取像素的問題。

+0

讓我們說,如果不是使用相機,我使用Quaternions或其他什麼來進行旋轉,在這種情況下,我會擁有新的座標嗎? – user1240679

+0

如果你正在做自己的轉換,你需要做自己的命中測試,或者以某種方式向GL提供等價的轉換。 – JasonD

+0

我不確定我是否清楚這一點。假設,如果我有一個'gluSphere'我已經應用gluLookAt等,然後我使用四元數來旋轉該球體(或可能在另一個操作中翻譯)。在這種情況下,我可以通過使用此對象的內置函數來獲取座標嗎?如果我會那樣做的話,可能碰到的測試仍然類似於我在上面的問題中寫的。 – user1240679

0

鑑於沒有人回答,我會試一試。 :)

雖然對opengl沒有太多的經驗,但這對我來說似乎是一種預期的行爲,而且好像你正在將世界座標與屏幕座標混合在一起。

想想這樣,如果您從兩個不同的角度拍攝客廳中的桌子的圖片,它會看起來不同,但兩張圖片在這個房間中佔據相同的空間。對於使用opengl的實體也是如此,即使您移動攝像頭,實體的座標不會改變,只是感知它。

現在,如果我沒有弄錯,可以通過應用opengl應用的相同轉換將您的世界座標轉換爲屏幕座標。我建議看看這個:OpenGL: projecting mouse click onto geometry

+0

讓我們說,如果不是使用相機,我使用Quaternions或其他什麼來進行旋轉,那麼在這種情況下,我會得到新的座標嗎?或者它仍然和上面提到的一樣/ – user1240679

+0

如果你旋轉實體本身,座標將會改變,但這更多的是破解然後解決方案。我不確定你可以保證做到這一點的準確性。我認爲這裏最好的解決方案是遵循openGL提出的解決方案。看看這些http://www.opengl.org/archives/resources/faq/technical/selection.htm http://www.toymaker.info/Games/html/picking.html – atomman

0

替代ID緩衝區的豎起大拇指。我多次使用它,這確實是一件正確的事情:不需要昂貴的幾何體拾取以及與底層幾何體幾乎完全斷開。儘管如此,您仍然只能選擇最接近的幾何體(即屏幕上的「可見」)而不是可能隱藏在後面的模型。在處理半透明材料時也會出現同樣的問題。

一種解決方案可能是通過在RGBA ID紋理中渲染四個對象來做一些ID剝離(我有一種感覺它可能不是最優的,但它是值得一試的)。