#0 

10-04-2012 13:52:56

akrewTik
Petit nouveau
Date d'inscription: 04-04-2012
Messages: 6

Bonjour à tous,

Je rencontre un problème assez curieux actuellement. Un Petit bout de code :

Code:

//node = smgr->addBillboardSceneNode(terrain,irr::core::dimension2d<irr::f32>(17.0f, 17.0f),irr::core::vector3df(480, 27, 430)); //Cas 1
node = smgr->addBillboardSceneNode(0,irr::core::dimension2d<irr::f32>(17.0f, 17.0f),irr::core::vector3df(30, 10, 0)); //Cas 2

anim = smgr->createCollisionResponseAnimator
                            (selector, node,
                            core::vector3df(17, 17, 1), //la taille de ton objet (ici ta cam)
                            core::vector3df(0, -0.1, 0)); //la gravité
                            node->addAnimator(anim);
anim->drop();

J'ai oublié de préciser que selector est le triangleSelector du terrain.

Donc ce code fonctionne à merveille dans le cas 2 mais pas du tout dans le cas1.

Dans le cas 1, la gravité est bien appliquée mais il n'y a aucune réponse à la collision. Vous noterez que la seule différence est le parent du billboard qui est le terrain dans le cas 1.

Quelqu'un serait-il en mesure de m'expliquer comment faire pour garder le lien de parenté entre le terrain et mes billboard tout en appliquant une réponse à la collision de manière à ce que mes billboard, se posent sur mon terrain ?

s'il vous plait, évitez les réponses du style : "Le tutoriel d'irrlicht montre un exemple" ==> Ok mais cet exemple ne gère pas la parenté. Et puis le problème n'est pas de faire fonctionner la fonction puisqu'elle marche si j'enlève la parenté. Le top serait un exemple que vous avez rencontré/codé sur lequel vous appliquez une gravité sur un élément fils d'un autre. Le tout si possible sans Newton ou autre moteur physique pour l'instant.

Merci de votre aide avisée !

Dernière modification par akrewTik (10-04-2012 13:53:45)

Hors ligne


#1 

10-04-2012 16:41:11

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Montre le code de création de terrain et du selector. ça pourrait peut-etre etre la ton probleme.
Et essaie d'attacher ton node à un EmptySceneNode au lieu du terrain pour voir s'il réagit pareil.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

10-04-2012 17:13:24

akrewTik
Petit nouveau
Date d'inscription: 04-04-2012
Messages: 6

Ok,

et voici :

Code:

irr::scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
                "./media/Map1_field.bmp",
                0,                                      // parent node
                -1,                                     // node id
                irr::core::vector3df(-900.f, -50.f, -900.f),         // position
                irr::core::vector3df(0.f, 0.f, 0.f),         // rotation
                irr::core::vector3df(2.f, 1.0f, 2.f),      // scale
                irr::video::SColor ( 255, 255, 255, 255 ),   // vertexColor
                5,                                      // maxLOD
                irr::scene::ETPS_17,                         // patchSize
                4                                       // smoothFactor
                );
        irr::core::vector3df center = terrain->getTerrainCenter();
        terrain->setMaterialFlag(video::EMF_LIGHTING, false);

        terrain->setMaterialTexture(0,
                                    driver->getTexture("./media/Maps/Ground_Global.jpg"));
                        //driver->getTexture("./media/terrain-texture.jpg"));
        terrain->setMaterialTexture(1,
                        driver->getTexture("./media/Maps/Grass_Global.jpg"));
                        //driver->getTexture("./media/detailmap3.jpg"));

        terrain->setMaterialType(video::EMT_DETAIL_MAP);

        terrain->scaleTexture(150.0f, 400.0f);
        // create triangle selector for the terrain
        scene::ITriangleSelector* selector = smgr->createTerrainTriangleSelector(terrain, 0);
        terrain->setTriangleSelector(selector);

Merci de ta réponse rapide !

Hors ligne


#3 

10-04-2012 21:46:08

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Jai trouvé ça dans ITerrainSceneNode.h :

     * The Patch Size of the terrain must always be a size of ( 2^N+1, i.e. 8+1(9), 16+1(17), etc. ).
     * The MaxLOD available is directly dependent on the patch size of the terrain. LOD 0 contains all
     * of the indices to draw all the triangles at the max detail for a patch. As each LOD goes up by 1
     * the step taken, in generating indices increases by - 2^LOD, so for LOD 1, the step taken is 2, for
     * LOD 2, the step taken is 4, LOD 3 - 8, etc. The step can be no larger than the size of the patch,
     * so having a LOD of 8, with a patch size of 17, is asking the algoritm to generate indices every
     * 2^8 ( 256 ) vertices, which is not possible with a patch size of 17. The maximum LOD for a patch
     * size of 17 is 2^4 ( 16 ). So, with a MaxLOD of 5, you'll have LOD 0 ( full detail ), LOD 1 ( every
     * 2 vertices ), LOD 2 ( every 4 vertices ), LOD 3 ( every 8 vertices ) and LOD 4 ( every 16 vertices ).

Moi et l'anglais, ça fait 4 voire 5 donc à vérifier^^ mais ton problème vient peut-être du fait que dans :

Code:

scene::ITriangleSelector* selector = smgr->createTerrainTriangleSelector(terrain, 0);
// Tu as mis le 2 ème paramètres à 0.  Essaie de mettre le maxLOD de ton terrain :
scene::ITriangleSelector* selector = smgr->createTerrainTriangleSelector(terrain, 5);

Ou l'inverse :

Code:

irr::scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
                "./media/Map1_field.bmp",
                0,                                      // parent node
                -1,                                     // node id
                irr::core::vector3df(-900.f, -50.f, -900.f),         // position
                irr::core::vector3df(0.f, 0.f, 0.f),         // rotation
                irr::core::vector3df(2.f, 1.0f, 2.f),      // scale
                irr::video::SColor ( 255, 255, 255, 255 ),   // vertexColor
                5,                                      // maxLOD      => Le remplacer par 0 et garder scene::ITriangleSelector* selector = smgr->createTerrainTriangleSelector(terrain, 0); ?
                irr::scene::ETPS_17,                         // patchSize
                4                                       // smoothFactor
                );

Sinon tu as essayé de l'attacher à un autre node que celui de ton terrain? C'est peut-être la construction de ITerrainSceneNode qui pose problème.

J'espère avoir fait avancer le schmilblick.

MODE HS = ON; ^^
Sinon j'ai aussi un conseil qui n'a rien à voir avec ton problème. Si tu as la version 1.7.2 ou supérieur d'Irrlicht (les plus anciennes, je ne sais pas si elles acceptent), tu peux essayer les VBOs.

Code:

terrain->getMesh()->setHardwareMappingHint( EHM_STREAM );
// tu auras peut-être même plus de performances avec :
terrain->getMesh()->setHardwareMappingHint( EHM_DYNAMIC );

C'est pas garanti sur ce genre de mesh mais ça vaut le coup d'essayer.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#4 

11-04-2012 09:14:02

akrewTik
Petit nouveau
Date d'inscription: 04-04-2012
Messages: 6

Bon alors, verdict des tests : c'est encore plus bizarre.

Si je met 5 partout en LOD, ca crash avec un std::bad_alloc. (J'ai pas encore compris le rapport entre std et irrlicht mais bon)...
si je met 0 partout, ça fait pareil : pas de réponse à la collision.

Peux-tu m'expliquer en 2 mots la différence entre

terrain->getMesh()->setHardwareMappingHint( EHM_STREAM );
et
terrain->getMesh()->setHardwareMappingHint( EHM_DYNAMIC );

Je suis pas super à l'aise en openGL, donc je suis pas sur de mon coup mais à mon avis à cause du LOD terrain->getMesh ne retourne pas toutes les infos seulement les infos statiques. et je n'ai aucune différence de performances avec ou sans ces 2 paramètres.


P.S. : Du coup je n'ai pas mis mes billboards comme fils du terrain et tout marche bien.

Connais-tu un tuto pour irrEdit parce que faire les maps à la main ca va un moment mais bon  smile

Hors ligne


#5 

11-04-2012 11:14:43

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Le rapport avec std, c'est parce que (que quelqu'un de plus compétent me corrige si je me trompe) Irrlicht réimplémente une partie des classes de la std (IrrAllocator est "repris" de la std).

Pour le plantage, ça veut dire que tu avais correctement paramétré avant, j'ai dû mal comprendre la doc.

Et pour la différence entre EHM_STREAM et EHM_DYNAMIC, je te renvoie à la doc qui est très explicite:
http://irrlicht.sourceforge.net/docu/na … bb17231c27

Sinon pour ton problème, je crois que si ce n'est que la parenté qui pose problème utilise le cas 2 que tu as ennoncé au début du thread. A moins que tu es une raison vraiment importante pour effectué à tout cette parenté.
En tout cas, je ne suis pas en mesure de résoudre ton problème à l'heure actuelle.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#6 

12-04-2012 00:29:06

RVM
Membre
Date d'inscription: 08-08-2010
Messages: 20

A première vue, il faut que tu crée un IMetaTriangleSelector qui regroupe tous les animator de collision Terrain <=> Billboard, puis créer un reponseanimator avec celui-ci.

Sinon j'ai retrouver un lien qui signale le bug de collision entre père/fils ( http://irrlicht.sourceforge.net/forum/v … amp;t=7336) mais aucune réponse et il date...

RVM

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
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
70 invités en ligne
Aucun membre connecté
RSS Feed