Stack Overflow で OpenGL ES の 2D 選択の入門書を探していました。私は主に 3D に関する質問を目にします。
OpenGL ES を使用して、Android 4.0.3 で 2D タイルベースのレベル エディターを設計しています。レベル エディタでは、画面の中央に 2D の黄色の正方形のオブジェクトが配置されています。私が欲しかったのは、ユーザーがオブジェクトに触れたかどうかを検出することだけでした。
レベル エディターでは、重なっているタイルはありません。代わりに、MS ペイントのビットマップ イメージ内の隣接する 2 つのピクセルのように、横に並べて配置されます。私の目的は、レベル エディター内の各正方形オブジェクトのタッチ イベントを個別に検出することです。
オブジェクトは単純な頂点配列で作成され、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:
まだいくつかの情報が不足しています。カメラを使っていますか?または、モデルのレンダリングの前に他のマトリックスをプッシュしますか? たとえば、正投影カメラを使用している場合、次のように画面座標 [x_screen, y_screen] を簡単に非投影にすることができます (y は類似しています)。
私はカメラを使用していませんが、おそらく正投影を使用しています。繰り返しますが、一般的な OpenGL 関数を使用しているだけなのでわかりません。多くのタイル (正方形の 2D オブジェクト) をさまざまな変換行列と統合することを計画しているため、行列のプッシュとポップを行います。2 つのタイルが同じ平行移動行列 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);
}