可能重複:
How do I determine what is touched in 3D space from the screen?檢測用戶觸摸了一個OpenGL多
我開發一個Android應用程序。我也在使用OpenGL圖形。
我在屏幕上繪製了一個正方形,我想讓用戶在觸摸它時移動它。換句話說,當他將手指放在廣場上時,用戶應該能夠移動方塊。如果他觸摸廣場外面什麼都沒有發生。
我如何檢測用戶觸摸廣場?
謝謝。
可能重複:
How do I determine what is touched in 3D space from the screen?檢測用戶觸摸了一個OpenGL多
我開發一個Android應用程序。我也在使用OpenGL圖形。
我在屏幕上繪製了一個正方形,我想讓用戶在觸摸它時移動它。換句話說,當他將手指放在廣場上時,用戶應該能夠移動方塊。如果他觸摸廣場外面什麼都沒有發生。
我如何檢測用戶觸摸廣場?
謝謝。
其他答案中提供的選擇和選擇教程不適用於此;其他glSelectBuffer和glRenderMode不是OpenGL ES的一部分。
如其他地方所述,基本上有兩種方法。您可以計算觸摸如何映射到場景中,並以數學方式測試您的對象。如果你的方格是平坦的,就好像你在2d中畫的那樣,那麼你可以很容易地實現這一點。
或者,您可以做一些基本上類似於選擇的事情,但可以根據OpenGL ES中提供的功能進行調整。例如,將場景清除爲黑色並以純藍色繪製您的方塊。使用glReadPixels獲取觸摸位置的顏色值。如果它是藍色的,那麼觸摸就在廣場上。這可能是一種更昂貴的測試方式,因爲它意味着場景的額外繪製,但這意味着您不必實施任何額外的數學或GL以外的其他代碼。
唯一需要記住的是OpenGL使用與處理像素相同的方式 - (0,0)是左下角,正值y上升,正值x左移。因此,無論您的觸摸座標相對於哪個座標軸,都需要在執行glReadPixels之前將它們轉換爲相對座標軸。
如果您只有一個正方形,您可以檢查觸摸座標是否位於由正方形的四個頂點形成的空間內。在不平行於x軸的情況下,您應該使用投影矩陣來投影它的頂點。
更多一般有以下幾種方法:「挑」一個OpenGL模式:射線採摘和顏色採摘是最常用的。一定要看看this doc
檢測觸摸可以使用光線拾取來實現。我遇到了同樣的問題,我在此頁面上使用了代碼:Android OpenGL ES ray picking。方法getViewRay()計算射線的方向。如果知道從[0,0,0]到ray [x,y,z]的方向,則很容易模擬光線投射並檢測與邊界對象的碰撞。
看起來很困難。我將在屏幕上放置一些按鈕,並使用它們來移動OpenGL對象。 – VansFannel 2010-11-12 15:29:29
@VansFannel它不是那麼困難,只需按照顏色選擇教程。一個做手指可以在iPhone上做什麼的按鈕是一個非常糟糕的主意 – rano 2010-11-12 18:37:24
@rano:我爲Android做的不是iPhone。 – VansFannel 2010-11-15 10:50:09