Bonjour,
je cherche à récuperer les dimensions des bouding box de plusieurs nodes, pour que la capsule de leur collisionReponse colle exactement à la boudingBox, et que mes collision fonctionnent correctement de cette manièere.
J'ai donc essayé le code suivant :
scene::ISceneNodeAnimatorCollisionResponse* anim = sceneManager->createCollisionResponseAnimator
(metaSelector, pNode,
(pNode->getTransformedBoundingBox().MaxEdge - pNode->getTransformedBoundingBox().MinEdge),
core::vector3df(0, -1, 0), pNode->getTransformedBoundingBox().getCenter());
pNode->addAnimator(anim);
D'après la console, les valeur retourné par ce calcul ont l'air corect dans les proportions, d'ailleurs les collisions se font bien, mais seulment mes différents meshs flottent au dessus du sol, je ne comprend pas pourquoi ?
Auriez vous explications et/ou solution à ce problème ?
Merci.
Hors ligne
je supose que tu ne crée pas correctement ton animator
sceneManager->createCollisionResponseAnimator(metaSelector, pNode,,core::vector3df(0, -1, 0));
me parait un peut mieux, et puis si ce n'est toujours pas correct il est probable que cela vienne de ton mesh, au qu'elle cas tu devrais regarder s'il n'y a pas un elemen qui augmente la boundingbox
sinon et bien tu peut diminuer chaque collision affactor par un dit facteur ( 1.01f )
Hors ligne
Tu n'aurai pas oublié des arguments à ta ligne ? (double ,)
Sinn sa ne peu pas venir des meshs, le problème arrive sur des différent meshs et les bouding box s'affiche correctement dans le mesh viewer d'Irrlicht.
Hors ligne
J'ai revu mon code avec la code et fait cela, mais quand je met le cinquième paramètres sa déconne complétement :
irr::scene::ISceneNodeAnimator* anim = m_scnMgr->createCollisionResponseAnimator(
meta, pNode, (pNode->getTransformedBoundingBox().MaxEdge - pNode->getBoundingBox().MinEdge),
irr::core::vector3df(0,-1,0), pNode->getTransformedBoundingBox().getCenter() - pNode->getPosition());
A quoi correspond cet arguments, que dois je y mettre ?
Hors ligne
Regarde la doc, c'est la translation de l'ellipsoid, met simplement vector3df(0,0,0) dans un premier temps. Pareil, pour tes essais met une gravité de 10.0 sur Y.
Une fois que tu auras quelque chose de fonctionnel, alors tu pourras commencer à faire varier tes paramètre de base pour tendre vers ce que tu veux.
Hors ligne
J'ai donc reprit le code de la doc, mais il ne fonctionne pas.
Voilà se qu'il me donne :
http://img38.imageshack.us/img38/4026/n … tmap2v.png
Hors ligne
Ton calcul de EllipsoidRadius est à mon sens erroné, ou tout du moins mal calculées. Essais dans un premier temps avec des valeurs fixes et génériques. Tu connais la taille globale de ton mesh,
donc fixe des valeurs adaptées, genre vector3df(2,5,2).
C'est pareil, 'meta' tu l’obtiens comment par curiosité ?
Hors ligne
J'utilisait déjà des valeurs fixes avant, et sa fonctionnez bien, jusqu'à se que je commence à intégrer l'ia.
En effet en utilisant des valeurs fixe, les écart bb-elipsoide de différent mesh était différents se qui faisait de gros foirage lorsque les 2 nodes avancaient l'un vers l'autre (l'une des ellipsoide rentrait dans la bouding box de l'autre, du fait du mouvement du 2eme mesh, donc les meshs se coincait entre eux).
Je cherche donc à se que les valeurs de l'ellipsoide se fasse automatiquement pour 2 raison :
-que l'ellipsoide colle a la bb, se qui permet des collisions précise et qui fonctionne parfaitement.
-par simplicité, je ne vais m'amuser à chercher les tailles correct des ellipsoide de tt mes personnages.
Donc il ne me faut pas de valeur fixe, j'ai déjà passé cet étape.
Voilà le code du méta :
pNode->removeAnimators();
irr::scene::IMetaTriangleSelector * meta = m_scnMgr->createMetaTriangleSelector();
irr::core::array<irr::scene::ISceneNode *> nodes;
m_scnMgr->getSceneNodesFromType(irr::scene::ESNT_ANY, nodes); // Find all nodes
for (irr::u32 i=0; i < nodes.size(); i++)
{
irr::scene::ISceneNode * node = nodes[i];
irr::scene::ITriangleSelector * selector = 0;
if (node->getID() != pNode->getID() )
{
switch(node->getType())
{
case irr::scene::ESNT_ANIMATED_MESH:
selector = m_scnMgr->createTriangleSelectorFromBoundingBox(node);
node -> setMaterialFlag(irr::video::EMF_LIGHTING, true);
break;
case irr::scene::ESNT_MESH:
selector = m_scnMgr->createTriangleSelectorFromBoundingBox(node);
node -> setMaterialFlag(irr::video::EMF_LIGHTING, true);
case irr::scene::ESNT_TERRAIN:
selector = m_scnMgr->createTerrainTriangleSelector((irr::scene::ITerrainSceneNode*)node);
node -> setMaterialFlag(irr::video::EMF_LIGHTING, true);
break;
case irr::scene::ESNT_OCTREE:
selector = m_scnMgr->createOctreeTriangleSelector(((irr::scene::ImeshSceneNode*)node)->getMesh(), node);
break;
default:
break;
}
}
if(selector)
{
meta->addTriangleSelector(selector);
selector->drop();
}
}
irr::scene::ISceneNodeAnimatorCollisionResponse* anim = m_scnMgr->createCollisionResponseAnimator
(meta, pNode,
(m_perso->getNode()->getBoundingBox().MaxEdge - m_perso->getNode()->getBoundingBox().getCenter()),
irr::core::vector3df(0, -1, 0), irr::core::vector3df(0,0,0));
pNode->addAnimator(anim);
meta->drop();
edit : en relisant mon code je viens de voir se que je m'étais trompé.
J'ai réctifié, voilà ce que sa me donne sur le rendu :
http://img263.imageshack.us/img263/6980 … tmap3a.png
faeri et sydney ne touche pas tt à fait le sol, mais sa je pense que c'est rectifiable avec le cinquieme argument : Le centre de l'elips ne doit pas etre le centre du mesh mais le centre de la bb.
Par contre pour le nain je vois pas...
Dernière modification par Superjaco (24-07-2011 12:01:44)
Hors ligne
Toujours besoin d'aide sur ce problème, pour :
-Savoir quoi faire de mon cinquième argument
-Trouver pourquoi le nain à autant de décalage.
Merci
Hors ligne
salut,
Je ne sais pas bien comment expliquer ma pensé, mais je vais essayer.
J Pour moi, ton modèle n'est pas bien centrer dans son propre espace, il doit être décalé par rapport à son centre, donc quand irrlicht le charge et créer sa collision par rapport à son centre, le modèle est décalé.
Un petit soft (gratuit en démo 30 jours) te permettra de le contrôler ma théorie et si elle savere exact, de le recentrer.
Fragmotion
Sinon, si tu peux nous mettre ton model et/ou code en téléchargement, que je fasse des tests avec, ce serais top.
Dernière modification par nabouill (29-02-2012 10:24:10)
Hors ligne
nabouill :
J Pour moi, ton modèle n'est pas bien centrer dans son propre espace, il doit être décalé par rapport à son centre, donc quand irrlicht le charge et créer sa collision par rapport à son centre, le modèle est décalé.
Bonne idé. A ce moment là je peut corriger sa avec Blender qui permet lui aussi de replacer origin du modèle à son centre géométrique, et qui à le mérite d'être 100% gratuit.
Cependant ce n'est pas plutôt sur le centre de la bb plutot que le centre géométrique que mon ellipsoide doit etre centré ?
Si tu veut faire les tests, voilà le code sur les collisions (je te passe pas tout le code, y fait 5000lignes environ) :
void AutrePerso::addPhysic()
{
if(pNode)
{
pNode->removeAnimators();
}
irr::scene::IMetaTriangleSelector * meta = m_scnMgr->createMetaTriangleSelector();
irr::scene::ITriangleSelector * selector = 0;
irr::core::array<irr::scene::ISceneNode *> nodes;
m_scnMgr->getSceneNodesFromType(irr::scene::ESNT_ANY, nodes); // Find all nodes
for (irr::u32 i=0; i < nodes.size(); i++)
{
irr::scene::ISceneNode * node = nodes[i];
if (node->getID() != pNode->getID()&& node->getID() != 777)
{
switch(node->getType())
{
case irr::scene::ESNT_ANIMATED_MESH:
selector = m_scnMgr->createTriangleSelectorFromBoundingBox(node);
break;
case irr::scene::ESNT_MESH:
selector = m_scnMgr->createTriangleSelector(((irr::scene::ImeshSceneNode*)node)->getMesh(), node);
break;
case irr::scene::ESNT_TERRAIN:
selector = m_scnMgr->createTerrainTriangleSelector((irr::scene::ITerrainSceneNode*)node);
break;
case irr::scene::ESNT_OCTREE:
selector = m_scnMgr->createOctreeTriangleSelector(((irr::scene::ImeshSceneNode*)node)->getMesh(), node);
break;
default:
break;
}
}
if(selector)
{
meta->addTriangleSelector(selector);
selector->drop();
}
}
irr::scene::ISceneNodeAnimator* anim = m_scnMgr->createCollisionResponseAnimator(
meta, pNode, (pNode->getTransformedBoundingBox().MaxEdge - pNode->getTransformedBoundingBox().getCenter()),
irr::core::vector3df(0,-10,0), irr::core::vector3df(0,0,0));
meta->drop();
pNode->addAnimator(anim);
//anim->drop();
// std::cout<<pNode->getTransformedBoundingBox().MaxEdge.X - pNode->getBoundingBox().MinEdge.X<<std::endl;
// std::cout<<pNode->getTransformedBoundingBox().MaxEdge.Y - pNode->getBoundingBox().MinEdge.Y<<std::endl;
// std::cout<<pNode->getTransformedBoundingBox().MaxEdge.Z - pNode->getBoundingBox().MinEdge.Z<<std::endl;
// std::cout<<pNode->getTransformedBoundingBox().MaxEdge.X <<" " <<pNode->getBoundingBox().MinEdge.X<<std::endl;
// std::cout<<pNode->getTransformedBoundingBox().MaxEdge.Y <<" " <<pNode->getBoundingBox().MinEdge.Y<<std::endl;
// std::cout<<pNode->getTransformedBoundingBox().MaxEdge.Z <<" " <<pNode->getBoundingBox().MinEdge.Z<<std::endl;
}
avec pode, le node à qui on ajoute le collision reponse et m_scnMgr le sceneManager.
Les modèles utilisé sont "sydney.md2", "faerie.md2" et "dwark.x" du dossier média d'Irrlicht.
Merci.
Hors ligne