Bonjour tout le monde !
Je suis un nouvel utilisateur d'irrlicht (et oui , encore un ^^) et plus largement un nouveau developpeur c++ .
Je créé ce topic pour exposer mon problême :
j'ai remarqué que , lorsque je charge une camera (en x=0,y=0,z=0) qui "regarde" un nouvel objet 3d ,elle regarde vers le haut (en plus de regarder l'oblet 3d) donc elle est alignée avec l'axe des Z par défaut :S .
Je trouve pas ça particulièrement génial , alors j'essaie de tout réaligner "correctement" (camera qui pointe vers l'axe des Y positifs et objet 3d à y=100...) .
Seulement , je sèche :S .J'ai toujours eu du mal avec ces histoires ...
Il faudrait que je tourne X de 90° sur les deux objets , non ?Mais ca ne semble pas marcher ...
ma camera ne semble plus regarder l'objet
Si une âme charitable pouvait m'éclairer , se serait gentil !
merci d'avance !!!
Dernière modification par ramis (28-10-2008 11:59:47)
Hors ligne
Salut
Le mieux serait peut être de nous passer ton code pour pouvoir le corriger par se que la j'ai du mal a te suivre, et je ne sais pas quel fonction tu utilise.
Dans le doute je precise quand même que l'axe des y est celui de la hauteur et z est donc la profondeur mais cela ne devrait pas avoir trop d'importance dans ton cas et tu le sais surement.
dark calculator
Hors ligne
oki , pas de problême, merci de m'avoir répondu , en tout cas
mon code est le suivant (oui , je suis en train de suivre le tuto du site du zero :
#include <iostream> #include <irrlicht.h>//heu ...ben voila , je fais les include , quoi ! using namespace irr; int main(void) { IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(800,600),32,false,false,false);//je créé un device scene::IAnimatedMesh* modele = device->getSceneManager ()->getMesh("sydney.md2");//j'importe sydney scene::IAnimatedMeshSceneNode* Nmodele = device->getSceneManager ()->addAnimatedMeshSceneNode(modele);//je l'ajoute à la scène Nmodele->setMaterialFlag(video::EMF_LIGHTING, false);//je le rend indépendant de la lumière Nmodele->setFrameLoop(1, 1);//je bloque l'animation car ça m'énerve Nmodele->setMaterialTexture( 0, device->getVideoDriver ()->getTexture("sydney.bmp") );//je lui met une texture //La caméra scene::ICameraSceneNode *camera = device->getSceneManager ()->addCameraSceneNodeFPS (0,0,-0);//je met ma caméra en x=0,y=0,z=0 Nmodele->setPosition(core::vector3df<0,0,100>);//je règle la position du machin un peu au pif pour que la camera n'atterisse pas entre les jambes de sydney while (device->run()) { device->getVideoDriver()->beginScene(true,true,video::SColor(0,200,200,200)); device->getSceneManager ()->drawAll ();//bon , ben voilà , quoi device->getVideoDriver()->endScene ();//normal } device->drop (); return 0; }
et voilà , avec ce code , ma scène est comme ça (le cube est a la place du sydney) :
et donc ca ne va pas du tout , je voudrais que la camera et l'objet soit alignés de la même facon, mais sur l'axe Y ou X ! que ce soit un peu plus ... normal , quoi ! là ils regardent en haut !!!(et ça me stresse horriblement car toutes les scènes que j'aient faites regardaient en haut , du coup !)
donc j'aimerais savoir , quelles rotations il faut faire , autour de quels axes , pour changer ca ?
merci d'avance !
Hors ligne
Tiens voilà un code de base :
#include <irrlicht.h> using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; #ifdef _IRR_WINDOWS_ #pragma comment(lib, "Irrlicht.lib") #endif int main() { // create device // IrrlichtDevice *device = createDevice(EDT_OPENGL,dimension2d<s32>(640,480),32,false,true,false); // on déclare les environnements IVideoDriver *driver = device->getVideoDriver(); ISceneManager *smgr = device->getSceneManager(); IGUIEnvironment *env = device->getGUIEnvironment(); // brouillard // driver->setFog(SColor(255,120,120,120), true, 0, 3000, 0, true, true); // couleur ombres // smgr->setShadowColor(SColor(150,0,0,0)); // node de l'univers // ISceneNode* univers = 0; // fond du décor // driver->setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, false); smgr->addSkyBoxSceneNode( driver->getTexture("irrlicht2_up.jpg"), driver->getTexture("irrlicht2_dn.jpg"), driver->getTexture("irrlicht2_lf.jpg"), driver->getTexture("irrlicht2_rt.jpg"), driver->getTexture("irrlicht2_ft.jpg"), driver->getTexture("irrlicht2_bk.jpg")); driver->setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, true); // importation d'un mesh // IAnimatedMesh* modele = smgr->getMesh("sydney.md2");//j'importe sydney IAnimatedMeshSceneNode* Nmodele = smgr->addAnimatedMeshSceneNode(modele);//je l'ajoute à la scène Nmodele->setMaterialFlag(EMF_LIGHTING, false);//je le rend indépendant de la lumière Nmodele->setFrameLoop(1, 1); //je bloque l'animation car ça m'énerve Nmodele->setMaterialTexture( 0, driver->getTexture("sydney.bmp") );//je lui met une texture Nmodele->setPosition(vector3df(0,0,0);//on place sydney à l'origine // ajout de la camera // ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(univers,50.0f,1000.0f,-1,0,0,false,0.0f); //création de la camera camera->setPosition(vector3df(100,50,100)); // positionnement de la camera camera->setTarget(Nmodele->getPosition()); // on dit à la camera de regarder sydney à l'initialisation ////////////////////////// // disable mouse cursor // ////////////////////////// device->getCursorControl()->setVisible(false); int lastFPS = -1; while(device->run()) if (device->isWindowActive()) { driver->beginScene(true, true, 0); smgr->drawAll(); env->drawAll(); driver->endScene(); ////////////////// // informations // ////////////////// int fps = driver->getFPS(); if (lastFPS != fps) { core::stringw str = L"Mon jeu 3D ["; str += driver->getName(); str += "] FPS:"; str += fps; device->setWindowCaption(str.c_str()); lastFPS = fps; } } device->drop(); return 0; };
Hors ligne
merci , mais ca ne marche toujours pas
c'est toujours aligné sur l'axe des Z ...
Hors ligne
Y-a un truc qui me chiffonne. Avec Irrlicht, l'axe vertical est l'axe Y et non Z, ou alors il y a un truc qui m'a échappé...
Hors ligne
Re
Comme je l'est dit l'axe des z correspond a la profondeur dans irrlicht(et dans tous les moteurs 3d d'aileurs), c'est une convention. Ceci s'oppose au convention utilisé en math et par extension au modeleur 3d qui place l'axe des z pour la hauteur.
Dans les modeleurs 3d cela vient du fait que x et y sont les coordonnées de l'ecran et z vient rajouter la profondeur a l'ecran.(A confirmer mes en perspective dans la peinture on utilise z comme profondeur aussi car x et y sont les coordonnées du tableau.
C'est pour sa que dans les exporteurs de modeleur 3d ils y a souvent une option flip y and z.
Donc c'est normal que la cam et ton objet soit aligné sur l'axe des z car c'est la profondeur et c'est le plus naturel. Ils ne regardent pas un haut.
En espérant avoir bien compris ta question, sinon n'hésite pas a redemander on a tous debuter un jour.
dark calculator
P.S. si tu veux vraiment faire des rotations et tout c'est set position pour les objets et le mieu pour la cam c'est d'utiliser setTarget et un setPosition mais je sais plus comment les deux fonctionne vraiment l'un avec l'autre.
Mais je maintient que dans ton cas je pense pas que se soit se que tu veulent faire.
P.P.S : Pourquoi se moin devant la coordonnée en z de ta cam, Ca sa me stress. lol
Hors ligne
oki
merci beaucoup , je crois que j'ai compris ^^
C'est peut etre l'habitude du gameblender ???
Je pensais que le modeleur et le moteur 3d correspondait , alors , pour moi , ca allait vers le haut ^^ .
merci à tous
Hors ligne