Problema de detección de colisiones basado en píxeles con OpenGLES 2.0 bajo Android

Este es mi primer post aquí, por lo tanto disculpas por cualquier error.
Estoy desarrollando un juego de acción simple con el uso de OpenGL ES 2.0 y Android 2.3. Mi marco de juego en el que estoy trabajando actualmente se basa en dos dimensiones sprites que existe en el mundo tridimensional. Por supuesto, mis entidades mundiales poseen información como la posición dentro del mundo imaginario, el valor de rotación en la forma de la matriz float [], la manija de textura OpenGL, así como el manejador Bitmap de Android (no estoy seguro si este último es necesario como lo estoy haciendo La rasterización con el uso de la máquina OpenGl, pero por el momento es sólo allí, para mi conveniencia). Esto es brevemente el trasfondo, ahora a la cuestión problemática.
Actualmente estoy atascado con la detección de colisión basada en píxeles, ya que no estoy seguro de qué objeto (aquí la textura de OGL, o Bitmap de Android) necesito probar. Quiero decir, ya he intentado probar el mapa de bits de Android, pero por completo no funcionó para mí – muchos errores de ejecución en relación con la lectura fuera del mapa de bits. Por supuesto para poder leer los pixeles del mapa de bits, he utilizado el método de Bitmap.create para obtener el sprite correctamente girado. Aquí está el fragmento de código:

android.graphics.Matrix m = new android.graphics.Matrix(); if(o1.angle != 0.0f) { m.setRotate(o1.angle); b1 = Bitmap.createBitmap(b1, 0, 0, b1.getWidth(), b1.getHeight(), m, false); } 

Otra cuestión, que podría añadir al problema, o incluso ser el problema principal, es que mi rectángulo de intersección (rectángulo que indica el espacio bidimensional mutuo para ambos objetos) se acumula a partir de partes de dos cuadros delimitadores que se calcularon con el uso de Matrices OpenGL Funcionalidad Matrix.multiplyMV (código abajo). ¿Podría ser, que los dos Android y OpenGL matrices métodos de cálculo no son iguales?

 Matrix.rotateM(mtxRotate, 0, -angle, 0, 0, 1); // original bitmap size, equal to sprite size in it's model space, // as well as in world's space float[] rect = new float[] { origRect.left, origRect.top, 0.0f, 1.0f, origRect.right, origRect.top, 0.0f, 1.0f, origRect.left, origRect.bottom, 0.0f, 1.0f, origRect.right, origRect.bottom, 0.0f, 1.0f }; android.opengl.Matrix.multiplyMV(rect, 0, mtxRotate, 0, rect, 0); android.opengl.Matrix.multiplyMV(rect, 4, mtxRotate, 0, rect, 4); android.opengl.Matrix.multiplyMV(rect, 8, mtxRotate, 0, rect, 8); android.opengl.Matrix.multiplyMV(rect, 12, mtxRotate, 0, rect, 12); // computation of object's bounding box (it is necessary as object has been // rotated second ago and now it's bounding rectangle doesn't match it's host float left = rect[0]; float top = rect[1]; float right = rect[0]; float bottom = rect[1]; for(int i = 4; i < 16; i += 4) { left = Math.min(left, rect[i]); top = Math.max(top, rect[i+1]); right = Math.max(right, rect[i]); bottom = Math.min(bottom, rect[i+1]); }; 

Aclamaciones,

Primero nota que hay un error en tu código. No se puede usar Matrix.multiplyMV () con el origen y el vector de destino iguales (la función calculará correctamente una coordenada x que se sobreescribirá en el vector fuente, pero necesita el x original para calcular y, zyw Coordenadas – que a su vez son defectuosas). También tenga en cuenta que sería más fácil para usted utilizar esferas delimitadoras para el primer paso de colisión de detección, ya que no requieren un código tan complicado para realizar la transformación de la matriz.

Luego, la detección de colisión. No debe leer mapas de bits ni texturas. Lo que debe hacer es construir una silueta para su objeto (que es bastante fácil, la silueta es sólo una lista de posiciones). Después de que usted necesita para construir objetos convexos que llenan la silueta (no-convexa). Se puede lograr por ejemplo. Oreja algoritmo de recorte. No puede ser el más rápido, pero es muy fácil de implementar y se hará sólo una vez. Una vez que tienes los objetos convexos, puedes transformar sus coordenadas usando una matriz y detectar colisiones con tu mundo (hay muchos artículos interesantes sobre las intersecciones de rayos-triángulos que puedes usar), y obtienes la misma precisión que si usas pixel Basada en la colisión.

Espero que ayude …

  • Dibuja una imagen 2D con OpenGL ES 2.0
  • Detectar si OpenGl ES 2.0 está disponible o no
  • ¿Cuál es el parámetro "offset" en GLES20.glVertexAttribPointer / glDrawElements, y de dónde proviene ptr / indices?
  • LibGDX - Shader trabajando en el escritorio pero no en Android
  • Opengl es 2.0 dibujar superposición de mapa de bits en vídeo
  • OpenGL ES 2.0 múltiples programas o múltiples Shaders o qué? ¿Como funciona?
  • Android OpenGL ES 2.0: No obtengo resultados que quiero con Matrix.traslateM
  • Gestión adecuada de la memoria en OpenGL en dispositivos Android
  • Cómo renderizar vídeo a través de openGLES2 con Android NDK
  • Grabación de marcos generados por Open GL ES en android
  • glClearColor no funciona correctamente (opengl android)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.