Cómo dibujar / hacer una colisión de física de bala cuerpo / forma?
He implementado el motor Bullet Physics en mi programa android con el NDK (estoy usando el ejemplo imagetarget de Vuforia para android), y está configurado y funcionando correctamente, sin embargo me gustaría renderizar / dibujar mis cajas de colisión / aviones para ver mi cuerpos rígidos (btRigidBody) / formas de colisión (btCollisionShape), estoy seguro de que esto es posible, pero no puedo encontrar ningún tutorial sobre cómo hacerlo!
He tomado el hola mundo Bullet física tutorial en su página wiki y lo modificó para aplicar las transformaciones de la caída de la física cuerpo a un objeto 3d Tengo en opengl es 2.0 para ver los cuerpos de colisión, aquí está el código que estoy usando para procesar al objeto:
- Dibuja una imagen 2D con OpenGL ES 2.0
- EglCreateWindowSurface falla con java.lang.IllegalArgumentException
- Android GLES20.glBlendEquation no funciona?
- Android OpenGL ES Soporte en todas partes?
- Cómo dibujar círculo básico en OpenGL ES 2.0 Android
void drawRigidBody(btRigidBody* body,QCAR::Matrix44F modelViewMatrix, unsigned int textureID) { btTransform trans; body->getMotionState()->getWorldTransform(trans); LOG("sphere pos: (x %f , y %f, z %f)",trans.getOrigin().getX(),trans.getOrigin().getY(),trans.getOrigin().getZ()); float physicsMatrix[16]; trans.getOpenGLMatrix(physicsMatrix); SampleUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale, &modelViewMatrix.data[0]); QCAR::Matrix44F modelViewProjection, objectMatrix; SampleUtils::multiplyMatrix(&modelViewMatrix.data[0], physicsMatrix, &objectMatrix.data[0]); SampleUtils::multiplyMatrix(&projectionMatrix.data[0], &objectMatrix.data[0], &modelViewProjection.data[0]); glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &signVerts[0]); glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &signNormals[0]); glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &signTexCoords[0]); glEnableVertexAttribArray(vertexHandle); glEnableVertexAttribArray(normalHandle); glEnableVertexAttribArray(textureCoordHandle); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureID); glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjection.data[0] ); glDrawArrays(GL_TRIANGLES, 0, signNumVerts); }
EDIT: mirando el código de btBoxShape me di cuenta de que puede agarrar la caja de vértices y normales:
btVector3** vertices= wallShape->getVertices(); btVector3**normals = wallShape->getNormals();
pero no se puede agarrar una lista de índices para dibujar los puntos de vértice en un cierto orden!
- Gestión adecuada de la memoria en OpenGL en dispositivos Android
- ¿Por qué mi programa de shader openGL para puntos tiene anillos de artefactos?
- La forma correcta de dibujar texto en OpenGL ES 2
- Vertex Buffer Objects (VBO) no funciona en Android 2.3.3, con GLES20
- Dónde almacenar código de sombreado en la aplicación para Android
- Añadir dinámicamente formas Opengl
- Android.grapics.matrix to OpenGL 2.0 ES traducción de la textura
- GLSL ES falla las variables locales?
Si recuerdo correctamente, esta no es la forma correcta de dibujar formas de depuración en Bullet. ¿Ha leído el manual del usuario (PDF) , página 16?
Se supone que debe implementar su propia clase de depurador de cajones que implementa btIDebugDraw
, y en esta clase se implementa el método drawLine
.
setDebugDrawer
este cajón de depuración a viñeta con setDebugDrawer
y luego habilítelo con world->getDebugDrawer->setDebugMode(debugMode);
Para dibujar el mundo, llame a world->debugDrawWorld()
;
Esto llama a drawLine
en su función personalizada varias veces hasta que se ha dibujado un modelo wireframe del mundo de la física.