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

OpenGL Discussion :

problème avec les Spots


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut problème avec les Spots
    Bonjour à tous,

    je suis actuellement en train d'implémenter des spots et je suis trés surprise des résultats que j'obtiens (en prenant pourtant les exemples des tutorials...)
    En réalité :
    - lorsque l'angle du cône au sommet est inférieur à 90 degré, je n'obtiens aucune lumière
    - lorsqu'il est égale à 90 degré, j'obtiens bien le résultat voulu
    - lorsqu'il est supérieur à 90 degré, j'ai bien une lumière positionnelle

    je ne comprends donc pas pourquoi je n'obtiens aucune lumière lorsqu'on mon angle est égal par exemple à 45 degré.

    voici, à titre indicatif, les extraits du code qui concernent la lumière. l'objet éclairé est une sphère avec des propriétés ambiante, diffuse, spéculaire, émissive..
    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
     
    //Propriétés du spot lumnieux
    GLfloat lightAmbient[]={0.2, 0.2, 0.2,0.0};
    GLfloat lightDiffuse[]={1.0, 1.0, 1.0,0.0};
    GLfloat lightSpecular[]={1.0, 1.0, 1.0,0.0};
    GLfloat lightPosition[]={0.0, 0.0, 0.0,1.0};
    GLfloat lightDirection[]={0.0, -1.0, 0.0};
     
    void init(void)
    {
        glClearColor(0.0,0.0,0.0,0.5);
        glEnable(GL_DEPTH_TEST);
        glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
        glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
        glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);
        glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45);
        glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
        glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);   
        glEnable(GL_COLOR_MATERIAL);
      }
    Je tiens à préciser que ma sphère est positionnée en (0,-1.5,0), donc vu la direction du projecteur, la sphère devrait être éclairée non?
    merci pour votre aide

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 151
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Je vous conseille de lire (ou relire) ceci http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml
    Ou le red book d'OpenGL qui est disponible sur le site d'OpenGL.
    IL y a une explication pour les valeurs du SPOT_CUTOFF et surtout, ils disent que GL_POSITION va être transformé par la matrice de modèle vue (donc, un glTranslate a un effet dessus).
    Sinon je ne vois pas trop se qui cloche.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut
    Bonsoir!

    merci pour ces indications, cela m'a aidé à résoudre ce problème

    Après relecture du chapitre projecteurs (Guide officiel opengl 2.0), voilà ce qui est indiqué :
    "la valeur de GL_SPOT_CUTOFF doit être comprise entre 0.0 et 90.0 à moins qu'elle ne prenne la valeur particulière de 180.0 (dans ce cas la lumière est émise dans toutes les directions)." Donc la valeur de 45 degré était convenable

    En revanche, le truc le plus important est le suivant: " vous devez spécifier la direction du projecteur qui détermine l'axe du cône de lumière [...]. Rappelez vous que la direction du projecteur est transformée dans la matrice de modélisation-visualisation comme tout vecteur normal et que le résultat est stocké dans les coordonnées de l'oeil".

    Par conséquent, en appelant les fonctions suivantes:
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); // position du spot
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection); // direction du spot
    dans la fonction display(), ca marche

    En fait, j'initialisais toutes mes lumières dans la fonction init(), c'est pour cela que cela ne marchait pas

    La précision selon laquelle "GL_POSITION va être transformé par la matrice de modèle vue" est également trés importante et je n'avais pas réalisé ce point en étudiant le bouquin.

    Donc encore merci pour tout!

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

Discussions similaires

  1. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  2. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par Invité dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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