#0 

23-07-2011 09:34:06

Superjaco
Membre
Date d'inscription: 22-07-2010
Messages: 20

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


#1 

23-07-2011 13:21:09

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
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


#2 

23-07-2011 13:26:08

Superjaco
Membre
Date d'inscription: 22-07-2010
Messages: 20

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


#3 

23-07-2011 19:21:29

Superjaco
Membre
Date d'inscription: 22-07-2010
Messages: 20

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


#4 

23-07-2011 20:58:46

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#5 

24-07-2011 10:44:48

Superjaco
Membre
Date d'inscription: 22-07-2010
Messages: 20

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


#6 

24-07-2011 11:27:09

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


#7 

24-07-2011 11:48:59

Superjaco
Membre
Date d'inscription: 22-07-2010
Messages: 20

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


#8 

28-02-2012 14:31:19

Superjaco
Membre
Date d'inscription: 22-07-2010
Messages: 20

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


#9 

29-02-2012 10:23:35

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

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)


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#10 

29-02-2012 15:54:12

Superjaco
Membre
Date d'inscription: 22-07-2010
Messages: 20

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

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
22 invités en ligne
Aucun membre connecté
RSS Feed