23-07-2011 07:34:06
- Superjaco
- Membres
- Date d'inscription:
- Messages: 20
- IP: 90.30.148.157
- Courriel
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
23-07-2011 11:21:09
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
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
23-07-2011 11:26:08
- Superjaco
- Membres
- Date d'inscription:
- Messages: 20
- IP: 90.30.148.157
- Courriel
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
23-07-2011 17:21:29
- Superjaco
- Membres
- Date d'inscription:
- Messages: 20
- IP: 90.30.148.157
- Courriel
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
23-07-2011 18:58:46
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.139.35
- Courriel
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.
Force et sagesse...
Hors ligne
24-07-2011 08:44:48
- Superjaco
- Membres
- Date d'inscription:
- Messages: 20
- IP: 90.30.148.157
- Courriel
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/nouvelleimagebitmap2v.png
Hors ligne
24-07-2011 09:27:09
- tmyke
- Administrateurs

- Date d'inscription:
- Messages: 1025
- IP: 92.130.139.35
- Courriel
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é ?
Force et sagesse...
Hors ligne
24-07-2011 09:48:59
- Superjaco
- Membres
- Date d'inscription:
- Messages: 20
- IP: 90.30.148.157
- Courriel
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;
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/nouvelleimagebitmap3a.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...
Hors ligne
28-02-2012 13:31:19
- Superjaco
- Membres
- Date d'inscription:
- Messages: 20
- IP: 90.16.3.63
- Courriel
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
29-02-2012 09:23:35
- nabouill
- Membres

- Date d'inscription:
- Messages: 242
- IP: 82.127.58.127
- Courriel
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.
Hors ligne
29-02-2012 14:54:12
- Superjaco
- Membres
- Date d'inscription:
- Messages: 20
- IP: 90.16.3.63
- Courriel
nabouill Ecris:
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;
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



