hello tout le monde !
voila je code un petit trimesh pour bullet ( aider avec qu'elle que source sur le net, tell que irrlamb et un exemple de softbody en japonnais oO )
bon sauf que mais mesh se traverse donc évidement je suspecte mon trimesh ....
MAIS !
si je crée un rigidBody avec un box pour la collision (statique), les objets utilisant le trimesh rentre tout de même en colision avec lui ...
alors bon déjà je voudrait savoir si mon trimesh est correcte ....
void IEntity::meshToPhysic(irr::scene::IMesh *TMesh, btTriangleMesh *TCollisionMesh, const irr::core::vector3df &TScale) { for(irr::u32 u = 0; u < TMesh->getMeshBufferCount(); u++) meshBufferToPhysic(TMesh->getMeshBuffer(u),TCollisionMesh,TScale); } void IEntity::meshBufferToPhysic(irr::scene::IMeshBuffer *TMeshBuffer, btTriangleMesh *TCollisionMesh, const irr::core::vector3df &TScale) { btVector3 TriangleVertices[3]; u16 *Indices = TMeshBuffer->getIndices(); if(TMeshBuffer->getVertexType() == EVT_STANDARD) { S3DVertex *Vertices = (S3DVertex *)TMeshBuffer->getVertices(); for(u32 i = 0; i < TMeshBuffer->getIndexCount(); i += 3) { TriangleVertices[0] = btVector3(Vertices[Indices[i]].Pos.X * TScale.X,Vertices[Indices[i]].Pos.Y * TScale.Y,Vertices[Indices[i]].Pos.Z * TScale.Z); TriangleVertices[1] = btVector3(Vertices[Indices[i+1]].Pos.X * TScale.X,Vertices[Indices[i+1]].Pos.Y * TScale.Y,Vertices[Indices[i+1]].Pos.Z * TScale.Z); TriangleVertices[2] = btVector3(Vertices[Indices[i+2]].Pos.X * TScale.X,Vertices[Indices[i+2]].Pos.Y * TScale.Y,Vertices[Indices[i+2]].Pos.Z * TScale.Z); TCollisionMesh->addTriangle(TriangleVertices[0], TriangleVertices[1], TriangleVertices[2]); } } else { S3DVertex2TCoords *Vertices = (S3DVertex2TCoords *)TMeshBuffer->getVertices(); for(u32 i = 0; i < TMeshBuffer->getIndexCount(); i += 3) { TriangleVertices[0] = btVector3(Vertices[Indices[i]].Pos.X * TScale.X,Vertices[Indices[i]].Pos.Y * TScale.Y,Vertices[Indices[i]].Pos.Z * TScale.Z); TriangleVertices[1] = btVector3(Vertices[Indices[i+1]].Pos.X * TScale.X,Vertices[Indices[i+1]].Pos.Y * TScale.Y,Vertices[Indices[i+1]].Pos.Z * TScale.Z); TriangleVertices[2] = btVector3(Vertices[Indices[i+2]].Pos.X * TScale.X,Vertices[Indices[i+2]].Pos.Y * TScale.Y,Vertices[Indices[i+2]].Pos.Z * TScale.Z); TCollisionMesh->addTriangle(TriangleVertices[0], TriangleVertices[1], TriangleVertices[2]); } } }
également ma conversion, je trouve que mes mesh tourne bizarrement o_o
void IEntity::QuaternionToEuler(const btQuaternion &TQuat, btVector3 &TEuler) { btScalar w = TQuat.getW(); btScalar x = TQuat.getX(); btScalar y = TQuat.getY(); btScalar z = TQuat.getZ(); float euler[3]; euler[2] = (irr::f32) (atan2(2.0 * (x*y + z*w),( (x*x)-(y*y)-(z*z)+(w*w)))); euler[0] = (irr::f32) (atan2(2.0 * (y*z + x*w),(-(x*x)-(y*y)+(z*z)+(w*w)))); euler[1] = (irr::f32) (asin(-2.0 * (x*z - y*w))); TEuler = btVector3((((-euler[0])*180.0)/PI),(((-euler[1])*180.0)/PI),(((euler[2])*180.0)/PI)); }
et dernier truc j'intègre la physique dans mon entity manager, je sais pas si ses l'idéal ?....
et après je penses intégré les sockets pour rafraîchir la position des autres joueurs, comme ça il ne resteras plus qu'à géré les événement du "joueur joué"
uhm ... et comme d'habitude si vous voulez toutes les sources il n'y a pas de problème !
voila voila ...
merci d'avance !
Dernière modification par Magun (24-02-2009 05:30:55)
Hors ligne
Bon, pour ce qui est du soucis de collision, n'y a-t-il pas un soucis d'orientation des faces.
Je sais que lors de la constitution des trimesh, avec certains moteur physique, si la normal des
faces est orientée vers l'intérieur, alors cela bug au niveau des collision.
Il faut donc parfois savamment jouer sur l'ordre de construction des points pour constituer les triangles.
Je sais qu'il existe un wrap de Bullet pour Irrlicht, tu n'a pas jeté un oeil des fois pour voir quel
forme ont les routines de constitution des trimesh ?
et dernier truc j'intègre la physique dans mon entity manager, je sais pas si ses l'idéal ?....
Tout dépend comment c'est fait, perso, comme beaucoup de codeurs, j'aime bien séparer et cloisonner mon code, et
donc ne pas lier (par exemple) le moteur physique au moteur graphique , de près ou de loin. Maintenant, je suppose
que c'est une question de point de vue.
Hors ligne
j'ai regarder, le warper pour irrlicht, mais pas très claire ....
donc soit mon trimesh mais les face a l'intérieur ( bien que apparemment se n'est pas se qui gène bullet ), car il exist bien des triangle pour le mesh de ma physique ...
mais apparemment j'initialise mal, mon mesh dans la physique car si je passe par des boxs, il n'y a pas de collision également
en tout cas merci pour ta réponse cela ma conduit au hypothèse si dessus, et j'ai l'impression de me rapproché du problème
voila donc je vais travaillé avec des boxs j'usque se que les collisions remarche après je repasse a mon trimesh ... puis si sa marche pas je poste
/* GRRR ... saleté de rhume !!!! */
// modif :
en fait il semblerais que bullet est désactiver les collisions trimesh vs trimesh, et que donc mon trimesh marche ( tester )
reste a trouver comment le réactivé si ses possible ....
au pire je devrait passé tout mais rigid body en soft body ou il n'y a pas cette contrainte
Dernière modification par Magun (25-02-2009 03:58:02)
Hors ligne