Pages: 1
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 !
Dernière modification par akrewTik (10-04-2012 13:53:45)
Hors ligne
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.
Hors ligne
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
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.
Hors ligne
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
Hors ligne
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.
Hors ligne
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
Pages: 1