2014-06-16 2 views
1

Je tente de créer un btBvhTriangleMeshShape à partir d'un grand maillage dans mon application et de l'utiliser comme un corps rigide. Ce corps rigide constituera le «plan de masse» qui est statique et ne bouge jamais. Le problème est que tout se passe comme si tout n'était pas là. Voici la source de courant:Bullet btBvhTriangleMeshShape pas de collision

btTriangleMesh* tMesh = new btTriangleMesh(); 
irr::scene::IMeshBuffer* MB = WorldNode1->getMesh()->getMeshBuffer(1); 

irr::video::S3DVertex* Vertices = (irr::video::S3DVertex*)MB->getVertices(); 
irr::u16* Indices = MB->getIndices(); 

for (irr::u32 i = 0; i < MB->getIndexCount(); i+=3) 
{ 
    irr::core::vector3df Tri1Pos = Vertices[Indices[i]].Pos; 
    irr::core::vector3df Tri2Pos = Vertices[Indices[i+1]].Pos; 
    irr::core::vector3df Tri3Pos = Vertices[Indices[i+2]].Pos; 

    tMesh->addTriangle(btVector3(Tri1Pos.X, Tri1Pos.Y, Tri1Pos.Z), btVector3(Tri2Pos.X, Tri2Pos.Y, Tri2Pos.Z), btVector3(Tri3Pos.X, Tri3Pos.Y, Tri3Pos.Z)); 
} 

btCollisionShape* groundShape = new btBvhTriangleMeshShape(tMesh, false); 
btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, -1, 0))); 
PH->CreateRigidBody(0, groundMotionState, groundShape); 

PH-> CreateRigidBody() est juste une fonction d'assistance pour créer rapidement des corps rigides, je sais que cette fonction fonctionne correctement car d'autres objets utilisent et entrent en collision très bien.

Tout aperçu de la question ici serait grandement apprécié. Merci beaucoup à tous pour votre temps.

EDIT: Après avoir raccordé le tiroir de débogage, voici ce qu'il affiche (ce qui est un tir sous la maille): enter image description here Et pour la clarification est un coup de feu au-dessus ici: enter image description here

Je ne Je sais si c'est un problème avec le maillage lui-même ou avec le code qui traverse les sommets pour créer le maillage physique

+0

Qu'est-ce qui empêche le sol de tomber? Avez-vous activé une vue de débogage pour vérifier que cela ne se produit pas? – weston

+0

Ouais, je suis allé de l'avant et accroché la vue de débogage et le sol est là où il devrait être. – KKlouzal

+0

Je suppose que le vert sont les triangles et le rouge est le volume de liaison. Alors pouvez-vous expliquer à quoi devrait ressembler le plancher, car il semble qu'il y ait beaucoup de lacunes, en fait, ce sont surtout des lacunes. Donc, je ne serais pas surpris que beaucoup tombe à travers. – weston

Répondre

0

Lors de l'itération à travers les triangles fournis par le tampon de maillage Irrlicht, je devais parcourir tous les tampons de maille présents sur le modèle comme ça:

btTriangleMesh* tMesh = new btTriangleMesh(); 

irr::u32 MBCount = WorldMesh1->getMeshBufferCount(); 

for (irr::u32 m = 0; m < MBCount; m++) 
{ 
    irr::scene::IMeshBuffer* MB = WorldNode1->getMesh()->getMeshBuffer(m); 

    irr::video::S3DVertex* Vertices = (irr::video::S3DVertex*)MB->getVertices(); 
    irr::u16* Indices = MB->getIndices(); 

    for (irr::u32 i = 0; i < MB->getIndexCount(); i += 3) 
    { 
     irr::core::vector3df Tri1Pos = Vertices[Indices[i]].Pos; 
     irr::core::vector3df Tri2Pos = Vertices[Indices[i + 1]].Pos; 
     irr::core::vector3df Tri3Pos = Vertices[Indices[i + 2]].Pos; 

     tMesh->addTriangle(btVector3(Tri1Pos.X, Tri1Pos.Y, Tri1Pos.Z), btVector3(Tri2Pos.X, Tri2Pos.Y, Tri2Pos.Z), btVector3(Tri3Pos.X, Tri3Pos.Y, Tri3Pos.Z)); 
    } 
} 
Questions connexes