Ogre3D, le portail francophone du moteur Ogre

Accueil Wiki Forums RechercheConnexion Inscription
Forums - Graphisme et modeling - Impossible de changer la couleur d'une sphere - [1]
Impossible de changer la couleur d'une sphere
plinuxke Citer
[Jeune Ogre]
2 posts
382.5 mots/post
Bonjour,

Je suis nouveau avec la technologie Ogre et je rencontre un probleme plutot agacant... (2 jours de recherche)

J'ai mis des spheres mais je peux pas changer la couleur. Les seuls cas que j'ai c'est :
- des spheres blanches avec ombres
- des spheres blanches sans ombres
- des spheres noires.

Code : cpp
  1. // Fichier TutorialApplication.cpp
  2. #include "TutorialApplication.h"
  3.  
  4. TutorialApplication::TutorialApplication(void)
  5. {
  6. }
  7.  
  8. TutorialApplication::~TutorialApplication(void)
  9. {
  10. }
  11.  
  12. void    TutorialApplication::createScene(void)
  13. {
  14.   mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE);
  15.  
  16.   // Creation du fond Ciel
  17.   mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
  18.  
  19.   // Creation et parametrage d'une sphere
  20.   createSphere("mySphereMesh", 5, 64, 64);
  21.   Entity* sphereEntity = mSceneMgr->createEntity("mySphereEntity", "mySphereMesh");
  22.   SceneNode* sphereNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
  23.   sphereEntity->setMaterialName("material_name_goes_here");
  24.   sphereNode->attachObject(sphereEntity);
  25.  
  26.   // Creation et parametrage d'une sphere
  27.   createSphere("mySphereMesh2", 20, 21, 53);
  28.   Entity* sphereEntity2 = mSceneMgr->createEntity("mySphereEntity2", "mySphereMesh2");
  29.   SceneNode* sphereNode2 = mSceneMgr->getRootSceneNode()->createChildSceneNode();
  30.   sphereEntity2->setMaterialName("material_name_goes_here");
  31.   sphereNode2->attachObject(sphereEntity2);
  32.   sphereNode2->translate(50.0, 50.0, 50.0);
  33.  
  34.   Ogre::Plane plane(Ogre::Vector3::UNIT_Y, 0);
  35.   Ogre::MeshManager::getSingleton().createPlane("ground", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 1500, 1500, 20, 20, true, 1, 5, 5, Ogre::Vector3::UNIT_Z);
  36.  
  37.   // Gestion lumiere et ombre
  38.   mSceneMgr->setAmbientLight(Ogre::ColourValue(0, 0, 0));
  39.   Ogre::Light* directionalLight = mSceneMgr->createLight("SunLight");
  40.   directionalLight->setType(Ogre::Light::LT_DIRECTIONAL);
  41.   // directionalLight->setDiffuseColour(Ogre::ColourValue(0, 0, 0));
  42.   // directionalLight->setSpecularColour(Ogre::ColourValue(0, 0, 0));
  43.   directionalLight->setDirection(Ogre::Vector3(0, -1, 1));
  44. }
  45.  
  46. void    TutorialApplication::createSphere(const std::string& strName, const float r, const int nRings = 16, const int nSegments = 16)
  47. {
  48.   ManualObject * manual = mSceneMgr->createManualObject(strName);
  49.   manual->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST);
  50.   float fDeltaRingAngle = (Math::PI / nRings);
  51.   float fDeltaSegAngle = (2 * Math::PI / nSegments);
  52.   unsigned short wVerticeIndex = 0;
  53.   for (int ring = 0; ring <= nRings; ring++) {
  54.     float r0 = r * sinf (ring * fDeltaRingAngle);
  55.     float y0 = r * cosf (ring * fDeltaRingAngle);
  56.     for (int seg = 0; seg <= nSegments; seg++) {
  57.       float x0 = r0 * sinf(seg * fDeltaSegAngle);
  58.       float z0 = r0 * cosf(seg * fDeltaSegAngle);
  59.       manual->position( x0, y0, z0);
  60.       manual->normal(Vector3(x0, y0, z0).normalisedCopy());
  61.       manual->textureCoord((float) seg / (float) nSegments, (float) ring / (float) nRings);
  62.       if (ring != nRings) {
  63.         manual->index(wVerticeIndex + nSegments + 1);
  64.         manual->index(wVerticeIndex);
  65.         manual->index(wVerticeIndex + nSegments);
  66.         manual->index(wVerticeIndex + nSegments + 1);
  67.         manual->index(wVerticeIndex + 1);
  68.         manual->index(wVerticeIndex);
  69.         wVerticeIndex ++;
  70.       }
  71.     };
  72.   }
  73.   manual->colour(ColourValue(0, 0, 0));
  74.   manual->end();
  75.   MeshPtr mesh = manual->convertToMesh(strName);
  76.   mesh->_setBounds( AxisAlignedBox( Vector3(-r, -r, -r), Vector3(r, r, r) ), false );
  77.   mesh->_setBoundingSphereRadius(r);
  78.   unsigned short src, dest;
  79.   if (!mesh->suggestTangentVectorBuildParams(VES_TANGENT, src, dest))
  80.     mesh->buildTangentVectors(VES_TANGENT, src, dest);
  81. }
  82.  
  83. int main(int argc, char *argv[]){
  84.   TutorialApplication   app;
  85.  
  86.   try {
  87.     app.go();
  88.   } catch( Ogre::Exception& e ) {
  89.     std::cerr << "An exception has occured: " <<
  90.       e.getFullDescription().c_str() << std::endl;
  91.   }
  92. }

Code : h
  1.  
  2. #ifndef __TutorialApplication_h_
  3. #define __TutorialApplication_h_
  4.  
  5. #include "BaseApplication.h"
  6.  
  7. class TutorialApplication : public BaseApplication
  8. {
  9. public:
  10.     TutorialApplication(void);
  11.     virtual ~TutorialApplication(void);
  12.     void createSphere(const std::string&, const float, const int, const int);
  13.  
  14. protected:
  15.     virtual void createScene(void);
  16. };
  17.  
  18. #endif // #ifndef __TutorialApplication_h_



Si vous avez une idee, ca me sauverait!

PS: Je souhaite pouvoir colorer les spheres independement les unes des autres.

Merci!
Ezee Citer
L'avatar de Ezee
[Vétéran]
250 posts
133.5 mots/post
Grô !
Bienvenue !
^^
Citation
sphereEntity->setMaterialName("material_name_goes_here");

Mwah ah ah !
:D

Hey , plinuxke , es-tu sûr que ce soit logique d'appeller tes deux matériaux par un même nom : material_name_goes_here ( le_nom_dumat_vient_ici) ?
Pour répondre à :
Citation
PS: Je souhaite pouvoir colorer les spheres independement les unes des autres.


Commence par nommer avec bon sens tes matériaux , pour les retrouver aisément via le code et les différencier les uns des autres .
En faisant par exemple :

sphereEntity->setMaterialName("sphere1Mat");
ou
sphereEntity->setMaterialName("vertpomme");
ETC ...

En ce qui concerne la gestion des couleurs ( et le reste ...) , je te recommande de te référér TOUJOURS à la doc officielle , pour COMPRENDRE LA RAISON d'une instruction :
Doc officielle : ManualObject

Voilà pour le petit conseil .
Maintenant mon petit doigt me dit que :

La couleur est définie sur la ligne 73 :
Citation
manual->colour(ColourValue(0, 0, 0));


ColourValue(0, 0, 0) est égal à la couleur noire .
voir doc :ColourValue

C'est donc ici que tu paramètres la couleur de ton objet .
Si tu veux "spécialiser" ta fonction "createSphere" en lui permettant de "peindre"
aussi l'objet selon des paramètres , ajoutes simplement un paramètre Ogre::ColourValue
dans sa déclaration :

Code : text
  1. void    TutorialApplication::createSphere(const std::string& strName, const float r, const int nRings = 16, const int nSegments = 16 , const Ogre::ColourValue &color )


ou 3 floats Rouge,Green,Blue :
Code : text
  1. void    TutorialApplication::createSphere(const std::string& strName, const float r, const int nRings = 16, const int nSegments = 16 , const float red,const float green ,const float blue )


Et tu peux encore trouver d'autres moyens ...
Bref , commence par faire ces modifications , APRES être passé sur la doc officielle
pour bien saisir l'action de chaque fonction "invoquée" dans le coeur de l'ogre .

Tu verras plus tard que l'utilisation des materiaux est + riche encore que ce que tu imagines. Mais chaque chose se réalise en son temps . :)

Bonne étude et à bientôt !
^^







plinuxke Citer
[Jeune Ogre]
2 posts
382.5 mots/post
Merci de ta reponse!

Pour ce qui est du nom des material, je sais ^^ J'ai pas encore mis mon code au propre.
Pour ce qui est de passer en parametre la couleur j'y avais pense mais c'est pas ca le probleme.

La ligne 73 c'est moi qui l'est mis, et quelque soit les valeurs que je met dedans, ca ne fait rien. J'ai lu la doc, et la fct colour est bien le moyen de changer la couleur du manualObject.

Ce que je comprend pas c'est pourquoi colour() ne fait rien??
Ezee Citer
L'avatar de Ezee
[Vétéran]
250 posts
133.5 mots/post
Parce que tu l'as mise en dehors de la boucle je pense .
Cette fonction définit la couleur d'un seul vertex ,selon la doc .
Tu dois donc traiter chaque vertex à l'intérieur de ta boucle .

Une autre approche est de créer un fichier .material et de le charger en temps
que ressource .
Puis l'affecter à ton mesh .
Cela a l'avantage d'offrir la gestion avancée des textures et shaders .
Je n'ai pas le temps de t'expliquer now , mais j'y reviendrai au besoin .
Ou un ogre qui passe par là te servira de guide .
++
Membres sur ce topic :

http://ogre3d.fr - Propulsé par azmeuk - 2012 - Tous droits réservés.
4 requètes sql - Haut de page - Page exécutée en 108.6 millisecondes
Valid xHTML 1.1 Valid CSS 2.0 Get Firefox ! No-www Class B