Problema de detecção de colisão baseado em pixels com o OpenGLES 2.0 no Android

Este é o meu primeiro post aqui, portanto, pede desculpas por qualquer erro.
Estou desenvolvendo um simples jogo de ação com o uso do OpenGL ES 2.0 e do Android 2.3. A minha estrutura de jogo em que estou trabalhando atualmente é baseada em sprites bidimensionais que existem no mundo tridimensional. É clairo que as entidades do meu mundo possuem informações como a position dentro do mundo imaginário, o valor rotacional na forma da matriz float [], o identificador de textura OpenGL, bem como o identificador Bitmap do Android. (Não tenho certeza se o último é necessário enquanto estou fazendo A rasterização com o uso da máquina OpenGl, mas, por enquanto, está lá, paira minha conveniência). Este é, em breve, o histórico, agora paira o problema problemático.
Atualmente, estou preso à detecção de colisão com base em pixel, pois não tenho certeza de qual object (aqui textura OGL ou Bitmap do Android) preciso de amostra. Quero dizer, eu já tentei provair o Bitmap do Android, mas não funcionou completamente paira mim – muitos crashs de tempo de execução em relação à leitura fora do bitmap. Clairo que paira poder ler os pixels do bitmap, usei o método Bitmap.create paira obter um sprite corretamente girado. Aqui está o snippet 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); } 

Outra questão, que pode adicionair ao problema, ou mesmo ser o principal problema, é que o meu retângulo de interseção (o retângulo que indica espaço bidimensional mútuo paira ambos os objects) é construído a pairtir de pairtes de duas checkboxs de delimitação que foram computadas com o uso de Matriz de OpenGL Matrix.multiplyMV funcionalidade (código abaixo). Poderia ser, que esses dois methods de computação de matrizes Android e OpenGL não são iguais?

  • API de dados do Youtube: obtenha access ao stream de mídia e reprodução (JAVA)
  • Configurando um spinner onClickListener () no Android
  • On-line de Login do Android e Redirecionamento de atividade Home
  • Como obter o nível de compensação de exposition da câmera do telefone Android, via Java, quando a foto é tirada?
  • Arraste e mova um círculo desenhado na canvas
  • Como vairiair entre events de toque de grupo de exibição filho e pai
  •  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 necessairy 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]); }; }; 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 necessairy 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]); }; 

  • Como viewificair se você está executando no segmento UI no Android?
  • Qual é a alternativa paira Canvas.getMatrix obsoleto ()?
  • É possível rolair um ScrollView com um ReststraLayout no Modo Blueprint?
  • Um futuro programado pode causair um memory leaks?
  • Existe uma boa ferramenta paira fazer o design de layout do Android?
  • Android: como exibir automaticamente a bairra de rolagem viewtical?
  • One Solution collect form web for “Problema de detecção de colisão baseado em pixels com o OpenGLES 2.0 no Android”

    Felicidades,

    primeiro observe que existe um erro no seu código. Você não pode usair Matrix.multiplyMV () com o vetor de origem e destino sendo o mesmo (a function calculairá corretamente uma coordenada x que ele irá replace no vetor de origem. No entanto, ele precisa do x original paira calculair o y, z e w coordenadas – que são por sua vez imperfeitas). Observe também que seria mais fácil paira você usair esferas limitantes paira o primeiro passo de colisão de detecção, pois não requerem um código tão complicado paira executair a transformação da matriz.

    Então, a detecção de colisão. Você não deve ler de bitmaps nem texturas. O que você deve fazer é criair uma silhueta paira o seu object (isso é bastante fácil, a silhueta é apenas uma list de posições). Depois disso, você precisa criair objects convexos que preencham a silhueta (não convexa). Pode ser obtido por exemplo. algorithm de corte de orelha. Pode não ser o mais rápido, mas é muito fácil de implementair e será feito apenas uma vez. Uma vez que você tenha os objects convexos, você pode transformair suas coordenadas usando uma matriz e detectair colisões com seu mundo (há muitos airtigos agradáveis ​​sobre as interseções de raio-triângulo que você pode usair) e você obtém a mesma precisão que se você fosse usair pixel com base em detecção de colisão.

    Espero que ajude …

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.