Comme je le disais plus haut, il y a plusieurs types d'émetteur. En voici la liste :
- IParticleBoxEmitter
- IParticleCylinderEmitter
- IParticleMeshEmitter
- IParticlePointEmitter
- IParticleRingEmitter
- IParticleSphereEmitter
J'imagine que les noms sont suffisamment explicites. Néanmoins si vous voulez en savoir plus,
la documentation est là pour ça.
Commençons par un facile, le
IParticleBoxEmitter. Comme son nom l'indique, il va générer des particules à partir d'une boite. La position de cette boite étant relative à la position du noeud
particle system, les coordonnées que nous allons renseigner aussi. 0 correspond donc à la position du noeud
particle system.
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | camera->setPosition(irr::core::vector3df(60.0f, 60.0f, 0.0f));
camera->setTarget(irr::core::vector3df(0.0f, 20.0f, 0.0f));
irr::scene::IParticleSystemSceneNode* particleSystem =
sceneManager->addParticleSystemSceneNode(false);
irr::scene::IParticleEmitter* emitter = particleSystem->createBoxEmitter(
irr::core::aabbox3d<irr::f32>(-3,0,-3,3,1,3), // coordonnees de la boite
irr::core::vector3df(0.0f,0.06f,0.0f), // direction de diffusion
80,100, // nb particules emises a la sec min / max
irr::video::SColor(0,0,0,0), // couleur la plus sombre
irr::video::SColor(0,255,255,255), // couleur la plus claire
600, 1000, // duree de vie min / max
0, // angle max d'ecart / direction prevue
irr::core::dimension2df(6.0f,6.0f), // taille minimum
irr::core::dimension2df(8.0f,8.0f)); // taille maximum
particleSystem->setEmitter(emitter); // on attache l'emetteur
emitter->drop(); // plus besoin de ca
particleSystem->setMaterialFlag(irr::video::EMF_LIGHTING, false); // insensible a la lumiere
|

Si tant est que vous codez sur un matériel un peu performant, vous devriez voir que ça va vite, très vite. C'est du au fait que nous n'avons pas imposé de limite de framerate. Comme il y a très peu de choses à calculer et à afficher, le nombre de FPS est très élevé. Vous remarquerez aussi qu'on a modifié le
material du
particle system pour le rendre insensible à la lumière. Ce qui est indispensable pour y voir quelque chose, sachant que la scène ne contient aucune source de lumière.
Poussons l'expérience un peu plus loin et tentons de reproduire un feu (pour être original) à l'aide du
material du
particle system. Avant tout, nous allons avoir besoin de la texture "fire.bmp", qui se trouve dans le dossier media du SDK. Ensuite, regardez le code qui suit et faites fonctionner vos méninges.
Code : C++ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | camera->setPosition(irr::core::vector3df(60.0f, 60.0f, 0.0f));
camera->setTarget(irr::core::vector3df(0.0f, 40.0f, 0.0f));
irr::scene::IParticleSystemSceneNode* particleSystem =
sceneManager->addParticleSystemSceneNode(false);
irr::scene::IParticleEmitter* emitter = particleSystem->createBoxEmitter(
irr::core::aabbox3d<irr::f32>(-6,0,-6,6,1,6), // coordonnees de la boite
irr::core::vector3df(0.0f,0.06f,0.0f), // direction de diffusion
80,100, // nb particules emises a la sec min / max
irr::video::SColor(0,255,255,255), // couleur la plus sombre
irr::video::SColor(0,255,255,255), // couleur la plus claire
600, 1200, // duree de vie min / max
0, // angle max d'ecart / direction prevue
irr::core::dimension2df(8.0f,8.0f), // taille minimum
irr::core::dimension2df(14.0f,14.0f)); // taille maximum
particleSystem->setEmitter(emitter); // on attache l'emetteur
emitter->drop(); // plus besoin de ca
particleSystem->setMaterialFlag(irr::video::EMF_LIGHTING, false); // insensible a la lumiere
particleSystem->setMaterialFlag(irr::video::EMF_ZWRITE_ENABLE, false); // desactive zbuffer pour surfaces derriere
particleSystem->setMaterialTexture(0, driver->getTexture("fire.bmp")); // on colle une texture
particleSystem->setMaterialType(irr::video::EMT_TRANSPARENT_VERTEX_ALPHA); // application transparence
|
Les seules nouveautés sont les trois dernière lignes qui collent une texture sur chaque particule et activent la transparence. De fait, si vous compilez tout ça vous verrez apparaitre un joli feu (comme à droite), et pas un amas immonde de particules carrées. Faites le test de retirer la transparence pour voir la différence.
L'ajout de texture est fondamental pour reproduire des phénomènes physiques naturels. A vrai dire les générateurs de particules sont (de manière générale) tellement souples et efficaces qu'ils permettent par exemple de générer une pelouse. Il suffit de ne pas re-générer les particules et de leur mettre une texture de brin d'herbe. Les possibilités sont énormes...