#1 

10-04-2012 11:52:56

akrewTik
Membres
Date d'inscription:
Messages: 6
IP: 212.180.5.197
Courriel

Bonjour à tous,

Je rencontre un problème assez curieux actuellement. Un Petit bout de 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 !


Hors ligne


#2 

10-04-2012 14:41:11

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.223.56
Courriel

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


#3 

10-04-2012 15:13:24

akrewTik
Membres
Date d'inscription:
Messages: 6
IP: 212.180.5.197
Courriel

Ok,

et voici :

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


#4 

10-04-2012 19:46:08

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.223.56
Courriel

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 :

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


#5 

11-04-2012 07:14:02

akrewTik
Membres
Date d'inscription:
Messages: 6
IP: 212.180.5.197
Courriel

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


#6 

11-04-2012 09:14:43

johnplayer
Membres
Avatar de johnplayer
Date d'inscription:
Messages: 431
IP: 83.192.223.56
Courriel

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/namespaceirr_1_1scene.html#ac7d8ee8d77da75f2580bb9bb17231c27

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


#7 

11-04-2012 22:29:06

RVM
Membres
Date d'inscription:
Messages: 20
IP: 81.50.206.60
Courriel

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/viewtopic.php?f=7&t=7336) mais aucune réponse et il date...

RVM


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
118 invités en ligne
membre en ligne: -
RSS Feed