IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ogre Discussion :

Impossible de changer la couleur d'une sphere


Sujet :

Ogre

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

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Tu devrais plutôt poser la question sur le forum de Ogre. Du peu que je me souvienne, pour donner une couleur à ta sphère, il faut lui attribuer des propriété lumineuse (le matériau).

    Les matériaux se stockent dans des fichiers texte qui sont ensuite chargés par Ogre et que tu peux attacher aux entités de ton choix. C'est expliqué dans la doc.
    Find me on github

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci de ta réponse.

    Je connais les fichiers materials mais le soucis c'est que je vais avoir un nombre énorme de couleurs, je vais pas faire un fichier material par couleur? Il y a sûrement moyen de colorer avec la fonction colour() sur les manualObject?

    PS: J'ai aussi créé un topic sur le forum de Ogre mais pas de réponse encore.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    De mémoire (je l'ai fait il y a quelques jours), tu peux faire un truc comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Ogre::MaterialPtr lMaterial = Ogre::MaterialManager::getSingleton().getMaterial("material_name_goes_here"); //ou une fonction équivalente
    lMaterial->getTechnique(0)->getPass(0)->setAmbient(Ogre::ColourValue(1.f, 0.f, 0.f));//pour colorer en rouge
    Est-ce que ca fonctionne?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par alecool Voir le message
    De mémoire (je l'ai fait il y a quelques jours), tu peux faire un truc comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Ogre::MaterialPtr lMaterial = Ogre::MaterialManager::getSingleton().getMaterial("material_name_goes_here"); //ou une fonction équivalente
    lMaterial->getTechnique(0)->getPass(0)->setAmbient(Ogre::ColourValue(1.f, 0.f, 0.f));//pour colorer en rouge
    Est-ce que ca fonctionne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Ogre::MaterialPtr lMaterial = Ogre::MaterialManager::getSingleton().getByName("Sphere1");
      lMaterial.getTechnique(0)->getPass(0)->setAmbient(Ogre::ColourValue(1.f, 0.f, 0.f));
    getMaterial ne compilait pas, j'ai change par getByName, mais le soucis vient de la ligne d'apres, je vois pas trop

  6. #6
    Invité
    Invité(e)
    Par défaut
    En fait ca ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Ogre::MaterialPtr lMaterial = Ogre::MaterialManager::getSingleton().getByName("Sphere1");
      lMaterial.getPointer()->getTechnique(0)->getPass(0)->setAmbient(Ogre::ColourValue(1.f, 0.f, 0.f));
    J'ai pu compiler avec ceci mais il cherche le fichier .material associe (ce que je ne veux pas comme c'est des manualObject tout le temps differents)

    Message ERREUR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't assign material Sphere1 to SubEntity of mySphereEntity because this Material does not exist. Have you forgotten to define it in a .material script?
    Puis SIGSEV...

    Je vais regarder si ta methode marche avec des manualObject

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    Crée d'abord le material :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Ogre::MaterialPtr lMaterial = Ogre::MaterialManager::getSingleton().createOrRetrieve("sphere1", "Group");
    lMaterial->getTechnique(0)->getPass(0)->setAmbient(Ogre::ColourValue(1.f, 0.f, 0.f));
    Il me semble que lMaterial étant de type MaterialPtr, tu devrais l'appeler avec "->" et pas ".".

Discussions similaires

  1. [WD-2007] Impossible de changer la couleur d'une bordure de titre
    Par alers dans le forum Word
    Réponses: 6
    Dernier message: 16/05/2013, 09h05
  2. Changer la couleur d une ligne de tableau au survol
    Par logica dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 18/07/2005, 11h57
  3. Réponses: 7
    Dernier message: 28/06/2005, 11h53
  4. Réponses: 8
    Dernier message: 14/05/2004, 11h18
  5. [VB6]Changer la couleur d'une ligne d'un ListView
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/03/2003, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo