28-04-2012 12:12:16
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 88.168.7.117
- Courriel
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
28-04-2012 20:05:08
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.96.246
- Courriel
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
28-04-2012 22:19:56
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 88.168.7.117
- Courriel
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,"../../media/Config/models%i",NumScene);
config = fopen(path,"r");
if (!config) perror("Mesh file error");
while (fgets(lignes,BUFFER_MAX,config) != NULL)
{
i++;
if (lignes[strlen(lignes) - 1] == '\
') 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,"%i %i %i %i",&(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,"%i %i %i",&(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",&(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...
Hors ligne
30-04-2012 09:43:16
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 90.60.201.32
- Courriel
Personne n'a de problèmes avec la fonction setframeloop ?
Hors ligne
30-04-2012 10:25:43
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.73.22.156
- Courriel 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 ... ![]()
Hors ligne
30-04-2012 20:27:25
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 88.168.7.117
- Courriel
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
04-05-2012 14:53:13
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 90.60.201.32
- Courriel
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.
Hors ligne
04-05-2012 22:08:10
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 90.5.236.98
- Courriel 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é ![]()
Hors ligne
05-05-2012 22:18:49
- AntiLoxy
- Membres
- Date d'inscription:
- Messages: 17
- IP: 88.168.7.117
- Courriel
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...
Hors ligne



