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

OpenSceneGraph Discussion :

Cube non illuminé par une source de lumière


Sujet :

OpenSceneGraph

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2022
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2022
    Messages : 25
    Points : 26
    Points
    26
    Par défaut Cube non illuminé par une source de lumière
    Bonjour Bonsoir

    J'ai une petit problème avec ma source de lumière.

    J'ai 2 cube l'un construit avec la classe osg::Box (le cube vert) et l'autre construit a la main (le cube rouge).

    Nom : 85.PNG
Affichages : 144
Taille : 4,6 Ko

    Comme vous pouvez le voir seulement le dessous du cube vert est illuminé par ma source de lumière mais pas le cube rouge fait a la main.

    Cela est peut-être du a la normal de mon cube rouge ? Je suis ouvert a toute explication

    le code du cube rouge :

    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
         osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(8);
         (*vertices)[0].set(0.0f, 0.0f, 0.0f);
         (*vertices)[1].set(10.f, 0.f, 0.0f);
         (*vertices)[2].set(10.f, 0.f, 10.f);
         (*vertices)[3].set(0.f, 0.f, 10.0f);
         (*vertices)[4].set(10.f, 10.f, 0.0f);
         (*vertices)[5].set(0.0f, 10.0f, 0.0f);
         (*vertices)[6].set(0.0f, 10.0f, 10.0f);
         (*vertices)[7].set(10.0f, 10.0f, 10.0f);
     
         osg::ref_ptr<osg::DrawElementsUInt> indices =
             new osg::DrawElementsUInt(GL_TRIANGLES, 36);
         (*indices)[0] = 0; (*indices)[1] = 1; (*indices)[2] = 2;
         (*indices)[3] = 0; (*indices)[4] = 3; (*indices)[5] = 2;
         (*indices)[6] = 1; (*indices)[7] = 4; (*indices)[8] = 7;
         (*indices)[9] = 1; (*indices)[10] = 2; (*indices)[11] = 7;
         (*indices)[12] = 0; (*indices)[13] = 5; (*indices)[14] = 4;
         (*indices)[15] = 0; (*indices)[16] = 1; (*indices)[17] = 4;
         (*indices)[18] = 3; (*indices)[19] = 6; (*indices)[20] = 2;
         (*indices)[21] = 2; (*indices)[22] = 6; (*indices)[23] = 7;
         (*indices)[24] = 0; (*indices)[25] = 3; (*indices)[26] = 5;
         (*indices)[27] = 3; (*indices)[28] = 6; (*indices)[29] = 5;
         (*indices)[30] = 6; (*indices)[31] = 7; (*indices)[32] = 5;
         (*indices)[33] = 5; (*indices)[34] = 4; (*indices)[35] = 4;
     
         osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
         colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
         colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
         colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
         colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
     
         osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
         normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
     
         osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
         geom->setVertexArray(vertices.get());
         geom->addPrimitiveSet(indices.get());
         geom->setNormalArray(normals.get());
         geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
         geom->setColorArray(colors.get());
         geom->setColorBinding(osg::Geometry::BIND_OVERALL);
    et le code de ma source de lumière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     osg::ref_ptr<osg::Light> light = new osg::Light;
         light->setLightNum(0);
     
         osg::LightSource* lightSource = new osg::LightSource;
     
         light = lightSource->getLight();
         light->setLightNum(0);
         light->setAmbient(osg::Vec4d(0.52, 0.52, 0.52, 1.0f));
         light->setDiffuse(osg::Vec4d(0.72, 0.72, 0.72, 1.0));
         light->setSpecular(osg::Vec4d(0.30, 0.30, 0.30, 1.0f));
     
         osg::Vec3f direction(osg::Vec3f(0., 0., -20.));
         direction.normalize();
         light->setPosition(osg::Vec4f(direction, 0.0));  // directional light
    Merci d'avance

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 987
    Points : 222 165
    Points
    222 165
    Billets dans le blog
    132
    Par défaut
    Bonjour,

    Comme vous le pensiez les normales ne sont pas correctement définies (une seule normale pour tout le cube ?). Il faut comprendre qu'une normale indique la direction d'une surface dans le monde (ou orientation). Si vous avez la même normale pour tout le cube, cela veut dire que tout le cube (ses six faces) est orienté d'une unique façon (comme s'il est déplié). Et c'est bel et bien la normale (et quasiment que la normale, dans ce cas) qui est utilisé pour calculé l'impact de la lumière sur l'objet.
    Bref, sans normale, pas d'effet de lumière.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2022
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2022
    Messages : 25
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Comme vous le pensiez les normales ne sont pas correctement définies (une seule normale pour tout le cube ?). Il faut comprendre qu'une normale indique la direction d'une surface dans le monde (ou orientation). Si vous avez la même normale pour tout le cube, cela veut dire que tout le cube (ses six faces) est orienté d'une unique façon (comme s'il est déplié). Et c'est bel et bien la normale (et quasiment que la normale, dans ce cas) qui est utilisé pour calculé l'impact de la lumière sur l'objet.
    Bref, sans normale, pas d'effet de lumière.
    Bonjour

    Merci pour ces informations.

    Donc une normale par face, je pourrais également utiliser des normales par sommets et dupliquer ces sommets pour chaque face pour ainsi configurer les normales ?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 987
    Points : 222 165
    Points
    222 165
    Billets dans le blog
    132
    Par défaut
    Oui. Une normale par sommet c'est ce que l'on fait généralement, car une normale par face, ça ne fonctionne que pour les formes simples (le cube).
    Cette image montre la différence :
    https://www.researchgate.net/profile...roup-Right.png
    À gauche, une normale par face, à droite une normale par sommet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème pour créer une illumination par dôme de lumière
    Par m-matthieu dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 09/11/2006, 14h54
  2. Impossible d'accéder aux tables non créées par dbo
    Par Pete dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/10/2005, 15h01
  3. [API]JTAPI non reconnu par eclipse
    Par julio84 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 15/04/2005, 15h03
  4. [Lomboz] [JBoss] JBoss 3.2.6 non reconnu par Lomboz ?
    Par romain3395 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 17/12/2004, 17h35
  5. [CR] Grouper des minutes par cinq et non une par une.
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 14/09/2004, 14h45

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