[irrlicht]Les Ombres dans irrlicht Difficulté : 20/100
Publié le 05/02/2008 à 20h 56min par Marco565



Ajouter des ombre a vos objets 3D dans irrlicht



Requis
Le moteur 3d irrlicht et quelques objet 3D

Cahier des charges :
Vous devez ajoutes des ombres a vos objet 3D, l'intégralité du code tiens dans le main.

Aide
Pour pouvoir ajouter une ombre a votre objet 3D il faut que votre sceneNode soit un IAnimatedMeshSceneNode.
Pour ajouter une ombre a votre objet ceux-ci est simple vous appellerais la fonction addShadowVolumeSceneNode();


Correction
L'exercice n'étant pas très dur si vous savez manipuler un minimum irrlicht vous n'avez pas eu de mal a réaliser cet exercice. Pour ce qui ne l'ont pas réussi regardez le code ci-dessous attentivement puis essayer de recommencer l'exercice sans regarder la correction.


Code : cpp
  1. #include <IRR/irrlicht.h>
  2.  
  3.  
  4. using namespace irr;
  5.  
  6.  
  7. int main(int argc, char **argv)
  8. {
  9. IrrlichtDevice *device = createDevice(video::EDT_OPENGL,
  10. core::dimension2d<s32>(800,600), 32, false, true, false);
  11.  
  12. video::IVideoDriver *driver = device->getVideoDriver();
  13. scene::ISceneManager *scenegraph = device->getSceneManager();
  14.  
  15. //une camera
  16. scene::ICameraSceneNode *camera = scenegraph->addCameraSceneNodeFPS();
  17. camera->setPosition(core::vector3df(0,10,-200));
  18.  
  19.  
  20.  
  21. //on ajoute un plan
  22. scene::IAnimatedMesh *mPlan = scenegraph->addHillPlaneMesh("myHill",
  23. core::dimension2d<f32>(20,20),core::dimension2d<u32>(40,40), 0, 0,
  24. core::dimension2d<f32>(0,0),core::dimension2d<f32>(10,10));
  25.  
  26. scene::ISceneNode *plan = scenegraph->addAnimatedMeshSceneNode(mPlan);
  27. plan->setMaterialTexture(0, driver->getTexture("media/floor055.jpg"));
  28. plan->setPosition(core::vector3df(0,-20,0));
  29.  
  30.  
  31.  
  32.  
  33. //Un soleil lumiere
  34. scene::ILightSceneNode *lumiere = scenegraph->addLightSceneNode(0);
  35. scene::ISceneNodeAnimator *anim = scenegraph->createFlyCircleAnimator(
  36. core::vector3df(0,300,0), 600, 0.0005);
  37.  
  38. lumiere->addAnimator(anim);
  39. //On crée une instance
  40. video::SLight light;
  41.  
  42. //On fait tous les réglages
  43. light.Type = video::ELT_POINT;
  44. light.Radius= 450.0f;
  45. light.AmbientColor = video::SColorf(1.0f,1.0f,1.0f,1);
  46. light.SpecularColor= video::SColorf(0.4f,0.0f,0.0f,1);
  47. light.DiffuseColor = video::SColorf(1.0f,1.0f,1.0f,1);
  48. light.CastShadows = true;
  49.  
  50. //Et on la copie dans un ILightSceneNode pour le paramètrer
  51. lumiere->setLightData(light);
  52. scene::IBillboardSceneNode *soleil = scenegraph->addBillboardSceneNode(lumiere,
  53. core::dimension2d<f32>(60,60));
  54.  
  55. soleil->setMaterialTexture(0, driver->getTexture("media/soleil.png"));
  56. soleil->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
  57. soleil->setMaterialFlag(video::EMF_LIGHTING, false);
  58.  
  59.  
  60.  
  61. //un petit modele pour le fun
  62. scene::IAnimatedMeshSceneNode *sydney = scenegraph->addAnimatedMeshSceneNode(
  63. scenegraph->getMesh("media/sydney.md2"));
  64.  
  65. sydney->setMaterialTexture(0, driver->getTexture("media/sydney.bmp"));
  66. sydney->addShadowVolumeSceneNode(-1, false);
  67. sydney->setPosition(core::vector3df(0,5,0));
  68.  
  69. //un petit cube
  70. scene::IAnimatedMeshSceneNode *cube = scenegraph->addAnimatedMeshSceneNode(
  71. scenegraph->getMesh("media/cube.3ds"));
  72.  
  73. cube->setPosition(core::vector3df(100,0,100));
  74. cube->addShadowVolumeSceneNode(-1, false);
  75. cube->setMaterialTexture(0, driver->getTexture("media/floor100.jpg"));
  76.  
  77. //une balle
  78. scene::IAnimatedMeshSceneNode *balle = scenegraph->addAnimatedMeshSceneNode(
  79. scenegraph->getMesh("media/balle.3ds"));
  80.  
  81. balle->setScale(core::vector3df(8,8,8));
  82. balle->setPosition(core::vector3df(-50,0,-50));
  83. balle->addShadowVolumeSceneNode();
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91. while(device->run())
  92. {
  93. driver->beginScene(true, true, video::SColor(255,209,68,14));
  94.  
  95. scenegraph->drawAll();
  96.  
  97.  
  98. driver->endScene();
  99. }
  100.  
  101.  
  102.  
  103.  
  104. device->drop();
  105.  
  106. return 0;
  107. }
  108.