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?
- ¿Por qué está bloqueando glClear en OpenGLES?
- Primeros pasos para crear un efecto de chroma key utilizando la cámara android
- EGL vs GLES 2.0 en Android (por ejemplo, Java)
- Utilizar glVertexAttribPointer y glDrawElements para extraer de un buffer de vértice empaquetado
- Android glShaderBinary
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]); };
- Android opengl-es-2.0 - explicación rotateM
- Framebuffer FBO render a la textura es muy lento, con OpenGL ES 2.0 en Android, ¿por qué?
- OpenGL se bloquea al vincular el programa, LG Nexus 4
- La textura de OpenGL no sigue la geometría
- EglSwapBuffers es errático / lento
- Android 6.0 Nexus 6 Crash en el controlador Adreno 420
- Cómo compartir una asignación Renderscript con OpenGL en Android
- ¿Hay algún dispositivo Android con un tamaño de pantalla mayor que GL_MAX_TEXTURE_SIZE?
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 …
- Soporte de GIF animado de Android
- Cómo cerrar la barra de estado / el panel de notificaciones después de hacer clic en el botón de notificación