#1 

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


#2 

23-07-2011 11:21:09

Magun
Administrateurs
Avatar de Magun
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


#3 

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


#4 

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


#5 

23-07-2011 18:58:46

tmyke
Administrateurs
Avatar de tmyke
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


#6 

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


#7 

24-07-2011 09:27:09

tmyke
Administrateurs
Avatar de tmyke
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


#8 

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


#9 

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 smile


Hors ligne


#10 

29-02-2012 09:23:35

nabouill
Membres
Avatar de nabouill
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


#11 

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. smile


Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
119 invités en ligne
membre en ligne: -
RSS Feed