Bonjour à tous, je viens vers vous pour vous demander de l'aide au sujet d'un placement de repère.
Pour créer mon repère j'ai dessiné 3 lignes 3D comme cela (avec des couleurs différentes) :
driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(20, 0, 0), video::SColor(0, 255, 0, 0)); driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 20, 0), video::SColor(0, 0, 255, 0)); driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 0, 20), video::SColor(0, 0, 0, 255));
Auparavant j'ai créé un cube dans un graphe de scène, comme ceci :
IVideoDriver* driver = device->getVideoDriver(); ISceneManager* scenegraph = device->getSceneManager(); //Création des éléments de notre graphe de scene cube1 = scenegraph->addCubeSceneNode(0.5f, scenegraph->getRootSceneNode()); cube1->setPosition(vector3df(5,5,5));
J'ai bien évidement créé une caméra pour visionner ma scène comme ceci :
//Création de la caméra selon un angle précis ICameraSceneNode* cam = scenegraph->addCameraSceneNode(scenegraph->getRootSceneNode(), core::vector3df(10,10,10), core::vector3df(-5,-5,-5));
La caméra visionne bien comme je veux, tout est bien dessiné (le cube et le repère), le soucis c'est que le cube est au centre du repère... Ce qui ne devrait pas être le cas... Ais-je oublié quelque chose ? Ou est l'erreur ?
Merci d'avance pour votre réponse !
PS : Je vous donne le code de ma boucle while qui run la scene 3D :
while(device->run()){ driver->beginScene(true, true, SColor(255,100,101,140)); scenegraph->drawAll(); //Création de la caméra selon un angle précis ICameraSceneNode* cam = scenegraph->addCameraSceneNode(0, core::vector3df(x,y,z), core::vector3df(u,v,w)); //On dessine les traits du repere video::SMaterial m; m.Lighting = false; driver->setMaterial(m); driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(20, 0, 0), video::SColor(0, 255, 0, 0)); driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 20, 0), video::SColor(0, 0, 255, 0)); driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 0, 20), video::SColor(0, 0, 0, 255)); driver->endScene(); }
Hors ligne
Bon je vois pas d'ou peu venir ton bug mais j'ai vu Quelques erreurs :
Pour commencer scenegraph->getRootSceneNode() est inutile, que se soit pour le cube ou la camera, remplace le par 0, le problème peut venir de la même si je vois pas pourquoi.
Ensuite tu cree une nouvelle camera a chaque boucle, se qui est surement pas la bonne solution, utilise plutot setPosition et setTarget (ou setRotation) dans la boucle sinon tu va te retrouver avec des millions de cameras inutiles.
sinon je vois pas d'autre erreurs, au pire donne tous le code
dark calculator
Hors ligne
Merci pour ta réponse, j'ai fais ce que tu m'as dis, et le problème n'est toujours pas résolu malheureusement.... Je te file tout le code du coup.... Dsl si ce n'est pas très très propre
#include <irr/irrlicht.h> #include <iostream> #include <stdlib.h> #include <stdio.h> #include <windows.h> bool _bExit; using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace std; ISceneNode *cube1; ISceneNode *cube2; ISceneNode *sphere1; ISceneNode *sphere2; ISceneNode *cube3; int x = 10; int y = 10; int z = 10; int u = -5; int v = -5; int w = -5; class MyEventReceiver : public IEventReceiver { private: ISceneNode* element; public: bool OnEvent(const SEvent& event) { if (event.EventType == irr::EET_KEY_INPUT_EVENT ) { switch(event.KeyInput.Key) { case KEY_ESCAPE: { _bExit = true; return true; } case KEY_KEY_Q: { x = 0; y = -5; z = 0; u = 0; v = 10; w = 0; return true; } case KEY_KEY_W: { x = 10; y = 0; z = 0; u = -5; v = 0; w = 0; return true; } } } /*if (event.Eventype == irr::EMIE_LMOUSE_PRESSED_DOWN ) { if (event.Eventype == irr::EMIE_MOUSE_MOVED){ element -> setPosition(vector3df(MOUSEEVENTF_XUP, MOUSEEVENTF_XDOWN) } }*/ return false; } }; int main(){ MyEventReceiver _EventReceiver; /* cout << "Bonjour, quelle vue désirez vous pour cette exemple ? \n(a) selon l'axe Ox \n(b) selon l'axe Oy \n(c) selon l'axe Oz \n(autre) quitter" <<endl; char choix; cin >> choix; switch(choix) { case 'a': x = 10; break; case 'b': y = 10; break; case 'c': z = 10; break; default: return 0; }*/ IrrlichtDevice *device = createDevice( video::EDT_OPENGL, dimension2d<s32>(640, 480), 32, false, false, true, &_EventReceiver); /* petite redifinition du titre de la fenetre. */ device->setWindowCaption(L"Tuto_Node - Premier nodes"); /* une fois le device créé, on va récupérer un certain nombre de pointeur qui vont nous être utile pour la suite. Entre-autre: video driver, SceneManager et gui. */ IVideoDriver* driver = device->getVideoDriver(); ISceneManager* scenegraph = device->getSceneManager(); //Création des éléments de notre graphe de scene cube1 = scenegraph->addCubeSceneNode(0.5f, 0); cube1->setPosition(vector3df(5,5,5)); //On ajoute les textures à nos éléments du graphe if (cube1) { cube1->setMaterialFlag(EMF_LIGHTING,false); cube1->setMaterialTexture( 0, driver->getTexture("C:/irrlicht/media/stones.jpg") ); } if (cube2) { cube2->setMaterialFlag(EMF_LIGHTING,false); cube2->setMaterialTexture( 0, driver->getTexture("C:/irrlicht/media/irrlichtlogo.bmp") ); } if (sphere1) { sphere1->setMaterialFlag(EMF_LIGHTING,false); sphere1->setMaterialTexture( 0, driver->getTexture("C:/irrlicht/media/irrlichtlogo.bmp") ); } /*if (sphere2) { sphere2->setMaterialFlag(EMF_LIGHTING, false); sphere2->setMaterialTexture( 0, driver->getTexture("C:/irrlicht/media/irrlichtlogo.bmp") ); }*/ ICameraSceneNode* cam = scenegraph->addCameraSceneNode(0, core::vector3df(5,5,5), core::vector3df(5,5,-5)); matrix4 orthoMatrix; orthoMatrix.buildProjectionMatrixOrthoLH(20.f, 15.f, 5.f, 100.f); cam->setProjectionMatrix(orthoMatrix,true); int frame =0; while(device->run()){ driver->beginScene(true, true, SColor(255,100,101,140)); scenegraph->drawAll(); //Création de la caméra selon un angle précis //cam->setIsOrthogonal(true); //On dessine les traits du repere video::SMaterial m; m.Lighting = false; driver->setMaterial(m); driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(20, 0, 0), video::SColor(0, 255, 0, 0)); driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 20, 0), video::SColor(0, 0, 255, 0)); driver->draw3DLine(core::vector3df(0, 0, 0), core::vector3df(0, 0, 20), video::SColor(0, 0, 0, 255)); driver->endScene(); } device->drop(); return 0; }
Hors ligne
Alors tu as pu tester ? Je n'ai toujours pas résolu le problème et je ne comprend toujours pas pourquoi les 3DLine s'attache à mon cube....
Hors ligne
Arf, même en ajoutant la ligne que tu m'as dis... Ca me fait toujours le même résultat ... Faut il créer un repaire sur chaque viewport ?
J'ai crée un repaire apres les viewport, et il ne l'affiche que dans le dernier viewport (en bas à droite)....
Hors ligne
En effet il va falloir creer les lignes sur chaque viewport car en fait quand tu fais un drawAll du scène manager il fais appels a toutes ces fonctions du driver du type draw3DLIne, draw3DTriangle... Donc puisque tu fais appels à un drawall pour chaque viewport il fais faire les lignes pour caque aussi.
Sinon sans tenir conte des viewports ton cube ou plutot ton repère se place t'il bien en 0?
Si tu galère vraiment trop comme ça tu peux utiliser des cubes pour faire le repère(avec un scale très petit sur y et z, pour le vecteur x...) ça ne solutionne pas ton problème mais le contourne et simplifirait ton code.
Hors ligne
Ce que je n'arrive pas à comprendre c'est qu'il me fait la bonne vue (la cam est bien placé) pour mon cube. Mais il me fait la mauvaise vue pour chaque repaire... On dirait qu'il mixe les deux...
Hors ligne
Encore une fois sans ton code complet cela va pas etre facile de t'aider (pour eviter de surcharger le post tu peux utililser http://pastebin.com/)
Sinon vérifie que se ne soit pas un problème d'origine des coordonnées 2d, il est possible que l'origine ne soit pas ou tu le pense, vérifie dans l'example irrlicht ou l'api
dark calculator
Hors ligne
J'ai essayé ta méthode avec les cubes, et il s'avère que ça marche plutôt bien ! Le problème est dans les draw3Dline... je t'ai fais un copier coller du code sur le site que tu m'as indiqué, à l'adresse suivante : http://pastebin.com/f12dab4ff
J'ai retesté le code et cela donne la même chose qu'au dessus visuellement parlant...
Hors ligne
ouf j'ai trouvé,
je ne comprends pas pourquoi mais il faut mettre smgr->drawAll() avant les drawLines sinon les lignes étaient dessiner sur le viewport.
j'ai pas verifier tous les repères ensuite mais sa devrait être sa.
Pour les explications, il faut quelqu'un qui connaise le fonctionnement du rendu irrlicht.
dark calculator
Hors ligne
RHA ca gère trop !!!! Ca marche nickel !!!! Ca fait une semaine que je galère !!! Merci beaucoup
Hors ligne