#0 

28-04-2012 14:12:16

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Salut, et oui encore moi ^^ désolé mais j'ai beaucoups de questions en ce moment...

Actuellement je rencontre le problème suivant, lorsque je dépasse 4 meshs sur ma scene irrlicht alors l'animation de mon mesh
principal ne fonctionne plus, si je mets 3 meshs aucun problème...

PS : J'utilise setframeloop pour l'animation. Mes meshs sont aux format md2

Hors ligne


#1 

28-04-2012 22:05:08

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

Tu pourrais dire comment tu crées ta scene? *.irr ou en c++. Si c'est du code, poste-le qu'on puisse chercher d'où vient le problème.


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


#2 

29-04-2012 00:19:56

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Oui ma scène est créer à la fois avec un loadScene (fichier .irr) et des meshs charger normalement en c++.

Voilà mon main :

Code c++ :

#include <irrlicht.h>
#include <vector>
#include "eventDebugger.h"
#include "event.h"
#include "camera.h"

using namespace irr;
using namespace io;

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif

int transition_alpha = FADEINOUT;
f32 transition_time_start = -1;

void startTransitionFadeOut(IrrlichtDevice* device)
{
    transition_time_start = device->getTimer()->getTime();
}

void updateFadeOut(f32 speed, f32 current_time, video::IVideoDriver* driver)
{
    float difference = (current_time - transition_time_start)/1000;

    driver->draw2DRectangle(video::SColor(transition_alpha,0,0,0),
                                core::rect<s32>(0,0 ,driver->getScreenSize().Width, driver->getScreenSize().Height));
    if(difference >= speed/1000)
    {
        transition_alpha--;
        transition_time_start = current_time;
    }
}

int main(int argc, char* argv[])
{
    int NombreMeshs;
    int ref = CURRENTSCENE, NumScene = 1, init = 0;
    core::matrix4 IsoMatrix;
    core::array<scene::ISceneNode *> nodes;
    scene::IAnimatedMeshMD2** modele;
    scene::IAnimatedMeshSceneNode** Nmodele;
    video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
    Caractere personnages;

    IrrlichtDevice* device = createDevice(driverType, core::dimension2d<u32>(WEIGHT, HEIGHT),32,true);
    if (device == 0)    return 1;

    gui::IGUIFont* font  = device->getGUIEnvironment()->getBuiltInFont();

    device->setWindowCaption(L"Orion Engine");

    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();
    //device->getFileSystem()->addZipFileArchive("../../media/map-01.pk6");

    smgr->loadScene("../../media/Save.irr");

    modele = new scene::IAnimatedMeshMD2*[MAXMESH];
    Nmodele = new scene::IAnimatedMeshSceneNode*[MAXMESH];

    scene::ICameraSceneNode * camera;
    camera = smgr->addCameraSceneNode(0,core::vector3df(0,0,0),core::vector3df(0,0,0));
    SetCamera(camera, 1);

    smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes);

    personnages.Initfilecaracteres(1,driver, smgr, modele, Nmodele);
    CEventReceiver receiver(1,Nmodele);
    //CEventDebugger debug(camera,Nmodele);      // Initialisation des evenements de debugging
    device->setEventReceiver(&receiver);
    //device->setEventReceiver(&debug);          // Gestion des evenements de debugging
    receiver.Initfilecollide();
    receiver.InitEvenements();



    while (device->run())
    {
        if (device->isWindowActive())
        {

            driver->beginScene(true, true, video::SColor(0,200,200,200));
            //debug.majPosCam();
            device->getGUIEnvironment()->drawAll();
            smgr->drawAll();

        if (ref == CURRENTSCENE)
        {
              if(transition_alpha != 0)
                {
                    updateFadeOut(5, device->getTimer()->getTime(),driver);
                }
        receiver.MajEventMesh(driver,font,camera,init);
        init = 1;
        receiver.Collide(ref, nodes);
        }

            /*if (ref != CURRENTSCENE)
            {
        init = 0;
                smgr->clear();
                //device->getFileSystem()->addZipFileArchive("../../media/map-01.pk6");
                smgr->loadScene("../../media/Save.irr");

        personnages.Initfilecaracteres(ref,driver,smgr,modele,Nmodele);
                nodes = NULL;
                smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes);
                camera = smgr->addCameraSceneNode(0,core::vector3df(0,0,0),core::vector3df(0,0,0));
                SetCamera(camera, ref);

                receiver.Initfilecollide();
                receiver.InitEvenements();
        ref = CURRENTSCENE; startTransitionFadeOut(device); transition_alpha = FADEINOUT;
            }*/

        }
        driver->endScene();
    }

    device->drop();
    return 0;

}


Et voilà la fonction de chargement des meshs

Code c++ :

void Caractere::Initfilecaracteres(int NumScene, irr::video::IVideoDriver* driver, irr::scene::ISceneManager* smgr, irr::scene::IAnimatedMeshMD2** p_modeles, irr::scene::IAnimatedMeshSceneNode** p_Nmodeles)
{
    FILE *config = NULL;
    char lignes[BUFFER_MAX];
    char path[BUFFER_MAX];
    int position[3];
    int rotation[3];
    int signe[3];
    int i = 0, mesh = 0;
    int animate = 0;

    snprintf(path,BUFFER_MAX,"Orion Engine",NumScene);
    config = fopen(path,"../../media/Save.irr");
    if (!config) perror("../../media/Config/models%i");

    while (fgets(lignes,BUFFER_MAX,config) != NULL)
    {
        i++;
        if (lignes[strlen(lignes) - 1] == '\n') lignes[strlen(lignes) - 1] = '\0';
        switch (i)
        {
        case 1:
            p_modeles[mesh] = (irr::scene::IAnimatedMeshMD2*)smgr->getMesh(lignes);
            p_Nmodeles[mesh] = smgr->addAnimatedMeshSceneNode(p_modeles[mesh]);
            p_Nmodeles[mesh]->setMaterialFlag(irr::video::EMF_LIGHTING, false);
            break;
        case 2:
            p_Nmodeles[mesh]->setMaterialTexture( 0, driver->getTexture(lignes));
            break;
        case 3:
            sscanf(lignes,"r",&(signe[0]), &(signe[1]), &(signe[2]), &animate);
        if(animate == 1)
        {
        p_Nmodeles[mesh]->setAnimationSpeed(SPEED_MESH);
        p_Nmodeles[mesh]->setFrameLoop(STAND_BAS, STAND_BAS);
        }
        else
        {
        p_Nmodeles[mesh]->setAnimationSpeed(SPEED_MESH);
        p_Nmodeles[mesh]->setFrameLoop(START_HAUT, END_HAUT);
        }
            break;
        case 4:
            sscanf(lignes,"Mesh file error",&(position[0]), &(position[1]), &(position[2]));
        if(signe[0] == 1) position[0] -= position[0] * 2;
        if(signe[1] == 1) position[1] -= position[1] * 2;
        if(signe[2] == 1) position[2] -= position[2] * 2;
            p_Nmodeles[mesh]->setPosition(irr::core::vector3df(position[0],position[1],position[2]));
            break;
        case 5:
            sscanf(lignes,"%i %i %i %i",&(rotation[0]), &(rotation[1]), &(rotation[2]));
            p_Nmodeles[mesh]->setRotation(irr::core::vector3df(rotation[0], rotation[1], rotation[2]));
            i = 0;
            mesh++;
            break;
        }

    }
    fclose(config);

}


Enfin même en commentant la fonction Collide et MajEventMesh le résultat est le même.

Je précise que même en ajoutant un mesh dans blender puis en exportant au format 3ds le problème reste le même...

Dernière modification par AntiLoxy (29-04-2012 17:24:38)

Hors ligne


#3 

30-04-2012 11:43:16

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Personne n'a de problèmes avec la fonction setframeloop ?

Hors ligne


#4 

30-04-2012 12:25:43

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

non, en même temps d'initialise un peut tout bizarement ...
pourquoi initialiser t'est array statiquement avec MAXMESH ? alouer dynamiquement l'array par rapport au nombre de ligne de ton cfg serait plus jusditieux, enfin le mieux reste avec d'utiliser irr::core::array ou irr::core::list
tu semble fragmenter ta scene en mesh, mais les dit mesh semble être t'est personnages, donc, tu auras a terme un duplicas des donner par scene ?
pourquoi coder un interpreter cfg, alors que tu as du xml livré avec irrlicht ?
tu devrait utiliser ton EventReceiver pour géré le changement de scene, c'est plus propre
il existe un Fader in/out dans la gui irrlicht, ça peut être plus légé, si ça t'intéresse

bref, je soulève juste quelque hypotèse sur ton programme ... wink

Hors ligne


#5 

30-04-2012 22:27:25

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

C'est vrai que le code n'est pas trés optimiisé ^^.

J'entend bien tes remarques mais je ne pense pas que ce soit la cause des problèmes d'animation du mesh.
Je vais remplacer les doubles pointeurs par un array on verra bien...
La gestion du fichier de cfg je le laisse comme ca ^^.

Je vous tiens au courant pour la suite des évenements.

Hors ligne


#6 

04-05-2012 16:53:13

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

J'ai le même problème en utilisant l'exemple 15.LoadIRR. L'animation des meshs s'arrete avec une caméra normal, en fps cela depend de sa position et en maya les animations sont toujours active. J'ai la version 1.7.2.

Autre précision lorsque je change de drivers (non opengl) mes animations fonctionne.

Dernière modification par AntiLoxy (04-05-2012 20:52:52)

Hors ligne


#7 

05-05-2012 00:08:10

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 908
Corrections: 2
Site web

uhm, étonant, essaye de dl la svn, et de compiler en manuel ....
normalement il n'est pas sencer y avoir ce genre de probleme étant donner que les animations sont géré logistiquement et non par l'hardware
c'est possible que le bug soit régler depuis, sinon l'alternative possible reset d'utiliser une ancienne version.

sur ce bonne soiré wink

Hors ligne


#8 

06-05-2012 00:18:49

AntiLoxy
Membre
Date d'inscription: 07-11-2011
Messages: 17

Je viens de regler partiellement le problème, j'ai tout simplement recompiler mon projet sous windows 7 à la place de ubuntu, toujours sous opengl
et les soucis ont disparus ^^.
Certainement ma version d'opengl qui était en cause...

Dernière modification par AntiLoxy (06-05-2012 00:19:40)

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
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
48 invités en ligne
Aucun membre connecté
RSS Feed