2012-08-16 2 views
3

J'ai mis en œuvre le moteur physique Bullet dans mon programme android avec le NDK (j'utilise Vuforia's imagetarget exemple pour Android), et il est mis en place et fonctionne correctement, mais je voudrais rendre/dessiner mes boîtes de collision/avions à voir mes corps rigides (btRigidBody)/formes de collision (btCollisionShape), je suis positif c'est possible mais je ne trouve pas de tutoriel sur la façon de le faire!Comment dessiner/rendre un corps/une forme de collision Bullet Physics?

J'ai pris la hello world Bullet physics tutorial on their wiki page et modifié pour appliquer les transformations du corps physique tombant à un objet 3d je en OpenGL2.0 pour voir les corps de collision, voici le code que je utilise pour rendre à l'objet:

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: regardant le code pour btBoxShape i remarqué que vous pouvez saisir les sommets de la boîte et Normales:

btVector3** vertices= wallShape->getVertices(); 
btVector3**normals = wallShape->getNormals(); 

mais vous ne pouvez pas saisir une liste d'indices pour tracer les points de sommet dans un certain commande!

Répondre

10

Si je me souviens bien, ce n'est pas la bonne façon de dessiner des formes de débogage dans Bullet. Avez-vous lu le user manual (PDF), page 16?

Vous êtes censé implémenter votre propre classe de tiroir de débogage qui implémente btIDebugDraw, et dans cette classe vous implémentez la méthode drawLine.

Vous passez ce tiroir de débogage à balle avec setDebugDrawer, puis activez avec world->getDebugDrawer->setDebugMode(debugMode);

Pour dessiner le monde, appelez world->debugDrawWorld();

Cela appelle ensuite drawLine sur votre fonction personnalisée plusieurs fois jusqu'à ce qu'un modèle filaire du monde de la physique ait été dessiné.

+0

Cela ressemble à ce dont j'ai besoin, merci pour le pointeur! Malheureusement, mon C++ est rouillé (étant un développeur android que j'ai principalement programmé en java), je me suis débrouillé avec des extraits de code pour les trucs NDK mais il me semble que je vais devoir me débrouiller pour écrire des classes C++ correctes – AndroidNoob

Questions connexes