我一直在尋找在Stack Overflow中OpenGL ES中2D選擇的介紹。我主要看到有關3D的問題。Android OpenGL ES:你如何選擇2D對象?
我正在使用OpenGL ES在Android 4.0.3上設計基於2D圖層的關卡編輯器。在關卡編輯器中,屏幕中央有一個2D,黃色,正方形的物體。我想要的只是檢測用戶是否觸摸了該物體。
在關卡編輯器,沒有任何重疊的瓷磚。相反,它們並排放置,就像MS Paint中位圖圖像中的兩個附近像素一樣。我的目的是在關卡編輯器中爲每個方形對象單獨檢測觸摸事件。
使用簡單的頂點數組創建對象,並使用GL_TRIANGLES繪製2個平直的直角三角形。沒有操作,也沒有從文件或任何東西加載。我唯一知道的是,如果用戶觸摸任何一個黃色三角形,那麼這兩個黃色三角形都將被選中。
任何人都可以提供一個提示,我需要如何做到這一點?提前致謝。
編輯:
這是draw()
功能:
public void draw(GL10 gl) {
gl.glPushMatrix();
gl.glTranslatef(-(deltaX - translateX), (deltaY - translateY), 1f);
gl.glColor4f(1f, 1f, 0f, 1f);
//TODO: Move ClientState and MatrixStack outside of draw().
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertices);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 6);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glPopMatrix();
}
編輯2:
我仍然缺少一些信息。你在用相機嗎?或在模型渲染之前推動其他 矩陣?例如,如果您使用的是 正交相機,你可以很容易地unproject你的屏幕座標 [x_screen,y_screen]像這樣(y是類似):
我不使用相機,但我可能使用正交投影。再次,我不知道,因爲我只是使用一個常見的OpenGL函數。我推擠和彈出矩陣,因爲我計劃將許多平鋪(正方形2D對象)與不同的平移矩陣集成在一起。沒有兩個瓷磚會具有相同的平移矩陣M.
2D投影是否與正射投影相同?我沒有看到兩者之間的任何區別。
下面是當表面創建(一類擴展GLSurfaceView
,貫徹GLSurfaceView.Renderer
)初始設置:
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
}
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
reset();
}
public void onDrawFrame(GL10 gl) {
clearScreen(gl);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0f, super.getWidth(), 0f, super.getHeight(), 1, -1);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
canvas.draw(gl);
}
private void clearScreen(GL10 gl) {
gl.glClearColor(0.5f, 1f, 1f, 1f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
對於#2,我沒有說它們是靜態的,但是你暗示着我寫它的方式,它會使對象成爲「靜態」。我該怎麼辦? 對於#3,我增加了一些代碼給你看。 –
我已添加一些更多信息。請檢查。 –
您現在應該可以檢測到一個選擇,但我建議你對相機的研究,並從視圖中分離模型/網格。這肯定會改善你的代碼,當然!想象一下,你做了一些翻譯,縮放,您將看到的內容的用戶,放大/縮小,而且還有檢測的選擇,並且可以碰撞,使他們不重疊......只有瓷磚,它應該是幾乎微不足道的,如果你有一個組織良好的代碼! –