#0 

27-10-2008 21:02:26

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

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 sad

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


#1 

28-10-2008 08:24:27

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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


#2 

28-10-2008 09:06:09

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

oki , pas de problême, merci de m'avoir répondu , en tout cas wink
mon code est le suivant (oui , je suis en train de suivre le tuto du site du zero wink :

Code:

#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


#3 

28-10-2008 09:40:44

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

Tiens voilà un code de base :

Code:

#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;
};

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 

28-10-2008 10:11:42

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

merci , mais ca ne marche toujours pas sad
c'est toujours aligné sur l'axe des Z ...

Hors ligne


#5 

28-10-2008 10:23:09

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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


Force et sagesse...

Hors ligne


#6 

28-10-2008 10:34:04

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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


#7 

28-10-2008 10:39:17

ramis
Membre
Date d'inscription: 27-10-2008
Messages: 92

oki smile
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 smile

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
104 invités en ligne
Aucun membre connecté
RSS Feed