#0 

04-02-2009 15:39:05

Djinner
Petit nouveau
Date d'inscription: 04-02-2009
Messages: 9

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

Code:

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 :

Code:

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 :

Code:

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

Code:

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


#1 

04-02-2009 18:00:23

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

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


#2 

04-02-2009 19:45:06

Djinner
Petit nouveau
Date d'inscription: 04-02-2009
Messages: 9

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

Code:

#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


#3 

06-02-2009 16:14:29

Djinner
Petit nouveau
Date d'inscription: 04-02-2009
Messages: 9

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


#4 

06-02-2009 18:31:11

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

dsl pas pu répondre hier soir,
je ne sais pas vraiment pourquoi mais il faut rajouter

Code:

driver->setTransform(video::ETS_WORLD, core::matrix4());

avant de dessiner tes lignes et normalement sa marche(cf draw3dLine dans l'API)

dark calculator

Hors ligne


#5 

06-02-2009 20:55:52

Djinner
Petit nouveau
Date d'inscription: 04-02-2009
Messages: 9

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


#6 

06-02-2009 21:59:16

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

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


#7 

06-02-2009 22:37:39

Djinner
Petit nouveau
Date d'inscription: 04-02-2009
Messages: 9

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


#8 

07-02-2009 13:43:15

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

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


#9 

07-02-2009 18:22:37

Djinner
Petit nouveau
Date d'inscription: 04-02-2009
Messages: 9

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


#10 

07-02-2009 19:30:44

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

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


#11 

07-02-2009 19:57:45

Djinner
Petit nouveau
Date d'inscription: 04-02-2009
Messages: 9

RHA ca gère trop !!!! Ca marche nickel !!!! Ca fait une semaine que je galère !!! Merci beaucoup wink

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
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
28 invités en ligne
Aucun membre connecté
RSS Feed