27-02-2013 20:16:14
- ment0s-
- Membres
- Date d'inscription:
- Messages: 8
- IP: 78.244.216.212
- Courriel
Bonjour à tous,
Je me permets de revenir rapidement car j'ai un nouveau problème sous Irrlicht : lors de l'ajout d'une lumière ambiante (ainsi que l'ombre sur ma map), j'ai une "seconde" ombre qui apparaît loin derrière la map, au niveau de la projection de mon ombre.
Un screenshot pour vous montrer mon problème :
http://www.zimagez.com/zimage/rendu39.php
Le code source du main :
#include <iostream>
#include <irrlicht.h>
using namespace std;
/* Namespaces pour Irrlicht : */
using namespace irr;
using namespace video;
using namespace core;
using namespace scene;
int main(int argc, char** argv)
{
// On initialise le moteur
cout << "Choix de la resolution de l'ecran : " << endl;
cout << "a. 640*480 - 32 bits " << endl;
cout << "b. 1024*768 - 32 bits " << endl;
IrrlichtDevice* device;
char choix = 0;
cin >> choix;
if (choix == 'a')
device = createDevice(EDT_OPENGL,dimension2d<u32>(1366, 768), 32, true, true, false);
else if (choix == 'b')
device = createDevice(EDT_OPENGL,dimension2d<u32>(1024, 768), 32, false, true, false);
else
exit(0);
// On récupère le gestionnaire de scene
ISceneManager* scenemgr = device->getSceneManager();
scenemgr->setAmbientLight(SColorf(0.5f,0.5f,0.5f,0.5f));
// On récupère le pilote video
IVideoDriver* driver = device->getVideoDriver();
// On met un titre pour notre fenetre
device->setWindowCaption(L"Premier projet Irrlicht");
SKeyMap keyMap[5]; // re-assigne les commandes
keyMap[0].Action = EKA_MOVE_FORWARD; // avancer
keyMap[0].KeyCode = KEY_KEY_Z; // z
keyMap[1].Action = EKA_MOVE_BACKWARD; // reculer
keyMap[1].KeyCode = KEY_KEY_S; // s
keyMap[2].Action = EKA_STRAFE_LEFT; // a gauche
keyMap[2].KeyCode = KEY_KEY_Q; // q
keyMap[3].Action = EKA_STRAFE_RIGHT; // a droite
keyMap[3].KeyCode = KEY_KEY_D; // d
keyMap[4].Action = EKA_JUMP_UP; // saut
keyMap[4].KeyCode = KEY_SPACE; // barre espace
scenemgr->addCameraSceneNodeFPS( // ajout de la camera FPS
0, // pas de noeud parent
100.0f, // vitesse de rotation
0.01f, // vitesse de deplacement
-1, // pas de numero d'ID
keyMap, // on change la keymap
5); // avec une taille de 5
// On ajoute une map à la scene :
IAnimatedMesh *room = scenemgr->getMesh("media/MAP.obj");
IAnimatedMeshSceneNode *nRoom = scenemgr->addAnimatedMeshSceneNode(room);
scenemgr->getMeshManipulator()->makePlanarTextureMapping(room->getMesh(0), 1.0f);
nRoom->setScale(vector3df(4,4,4));
nRoom->setMaterialFlag(EMF_LIGHTING, true);
// Ajout d'une lumière diffuse :
ILightSceneNode *lumiere = scenemgr->addLightSceneNode();
ILightSceneNode *lumiere2 = scenemgr->addLightSceneNode();
lumiere->setRadius(5000);
lumiere2->setRadius(5000);
lumiere->setPosition(vector3df(500,200,250));
lumiere2->setPosition(vector3df(-50,200,5));
nRoom->addShadowVolumeSceneNode();
scenemgr->setShadowColor(SColor(150,0,0,0));
// Ajout du Skydome :
ISceneNode *ciel = scenemgr->addSkyDomeSceneNode(driver->getTexture("media/Skydome/Skydome.jpg"));
// On lance la boucle de rendu
while(device->run())
{
driver->beginScene(true, true, SColor(255,128,128,255));
scenemgr->drawAll();
driver->endScene();
}
device->drop();
return 0;
}J'ai remarqué que l'erreur se produit lorsque j'utilise la fonction addLightSceneNode(). N'ayant pas trouvé mon bonheur sur google, j'espère que je le trouverai ici..
PS : Je tiens à préciser que je me remets sur Irrlicht depuis un peu plus d'une semaine, lors de mon temps libre.. Donc certains éléments ont été oubliés.
Merci d'avance.
Hors ligne
02-03-2013 10:07:30
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.192.216.13
- Courriel
J'ai déjà eu le même problème. ça ne résoudra peut-être pas ton problème mais tu peux utiliser un IMesh* et un IMeshSceneNode* pour les objets statiques. Ensuite essaies de configurer tes lumières avec la structure video::SLight.
Enfin, dans "addShadowVolumeSceneNode()" mets en paramètres ton IMesh* précédemment chargé et testes différentes valeurs pour "infinity". A mon humble avis, ce dernier cause ton 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
04-03-2013 17:52:41
- ment0s-
- Membres
- Date d'inscription:
- Messages: 8
- IP: 78.244.216.212
- Courriel
Bonjour,
Merci de la réponse.
De mon côté, peu après mon post je m'étais orienté justement vers SLight (en créant avant tout une lumière grâce à ILightSceneNode.
Ensuite, j'ai utiliser SLight, et régler le champ de vision de ma camera ( camera->setFarValue(100000.0f)
.
Enfin, j'ai utiliser de l'ombre grâce à addShadowVolumeSceneNode() mais sans paramètres.
Voici le code qui fonctionne :
#include <iostream>
#include <irrlicht.h>
using namespace std;
/* Namespaces pour Irrlicht : */
using namespace irr;
using namespace video;
using namespace core;
using namespace scene;
int main(int argc, char** argv)
{
// On initialise le moteur
cout << "Choix de la resolution de l'ecran : " << endl;
cout << "a. 640*480 - 32 bits " << endl;
cout << "b. 1024*768 - 32 bits " << endl;
cout << "c. 1366*768 - 32 bits " << endl;
IrrlichtDevice* device;
char choix = 0;
cin >> choix;
if (choix == 'a')
device = createDevice(EDT_OPENGL,dimension2d<u32>(640, 480), 32, false, true, false);
else if (choix == 'b')
device = createDevice(EDT_OPENGL,dimension2d<u32>(1024, 768), 32, false, true, false);
else if (choix == 'c')
device = createDevice(EDT_OPENGL,dimension2d<u32>(1366, 768), 32, false, true, false);
else
exit(0);
// On récupère le gestionnaire de scene
ISceneManager* scenemgr = device->getSceneManager();
// On récupère le pilote video
IVideoDriver* driver = device->getVideoDriver();
// On met un titre pour notre fenetre
device->setWindowCaption(L"Premier projet Irrlicht");
SKeyMap keyMap[5]; // re-assigne les commandes
keyMap[0].Action = EKA_MOVE_FORWARD; // avancer
keyMap[0].KeyCode = KEY_KEY_Z; // z
keyMap[1].Action = EKA_MOVE_BACKWARD; // reculer
keyMap[1].KeyCode = KEY_KEY_S; // s
keyMap[2].Action = EKA_STRAFE_LEFT; // a gauche
keyMap[2].KeyCode = KEY_KEY_Q; // q
keyMap[3].Action = EKA_STRAFE_RIGHT; // a droite
keyMap[3].KeyCode = KEY_KEY_D; // d
keyMap[4].Action = EKA_JUMP_UP; // saut
keyMap[4].KeyCode = KEY_SPACE; // barre espace
// Camera et paramétrage :
ICameraSceneNode* camera = scenemgr->addCameraSceneNodeFPS( // ajout de la camera FPS
0, // pas de noeud parent
100.0f, // vitesse de rotation
0.01f, // vitesse de deplacement
-1, // pas de numero d'ID
keyMap, // on change la keymap
5); // avec une taille de 5
// Projection de la caméra et désactiver le curseur:
camera->setFarValue(100000.0f);
device->getCursorControl()->setVisible(false);
// On ajoute une map à la scene :
IAnimatedMesh *room = scenemgr->getMesh("media/MAP.obj");
IAnimatedMeshSceneNode *nRoom = scenemgr->addAnimatedMeshSceneNode(room);
scenemgr->getMeshManipulator()->makePlanarTextureMapping(room->getMesh(0), 1.0f);
nRoom->setScale(vector3df(2,2,2));
nRoom->setMaterialFlag(EMF_LIGHTING, true);
nRoom->setMaterialFlag(EMF_ANISOTROPIC_FILTER, true);
nRoom->setMaterialFlag(EMF_ANTI_ALIASING, true);
ILightSceneNode *lumiere = scenemgr->addLightSceneNode(0);
//ISceneNodeAnimator *anim = scenemgr->createFlyCircleAnimator(vector3df(500,500,500), 60, 0.0005);
//lumiere->addAnimator(anim);
ILightSceneNode *lumiere2 = scenemgr->addLightSceneNode(0);
//lumiere2->addAnimator(anim);
// Ajout d'une lumière diffuse n°1 :
//On crée une instance
//Un soleil lumiere
SLight light;
//On fait tous les réglages
light.Type = ELT_POINT;
light.Radius= 5000.0f;
light.AmbientColor = SColorf(1.0f,1.0f,1.0f,1);
light.SpecularColor= SColorf(0.4f,0.0f,0.0f,1);
light.DiffuseColor = SColorf(1.0f,1.0f,1.0f,1);
light.CastShadows = true;
lumiere->setPosition(vector3df(20,500,380));
lumiere->setLightData(light);
//lumiere2->setPosition(vector3df(-500,500,50));
lumiere2->setLightData(light);
nRoom->addShadowVolumeSceneNode();
scenemgr->setShadowColor(SColor(150,0,0,0));
// Ajout du Skydome :
ISceneNode *ciel = scenemgr->addSkyDomeSceneNode(driver->getTexture("media/Skydome/Skydome.jpg"));
// Position camera :
vector3df positionCam;
int lastFPS = -1;
// On lance la boucle de rendu
while(device->run())
{
driver->beginScene(true, true, SColor(255,128,128,255));
scenemgr->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"Projet Irrlicht - Phase de tests [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
device->drop();
return 0;
}Encore merci de ton aide, mais je te rassure je reviendrai prochainement lol ! Bonne soirée
Hors ligne



