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 :

probleme lumiere position & direction


Sujet :

OpenGL

  1. #1
    Membre actif
    probleme lumiere position & direction
    Salut...
    Je developpe sous delphi et voici mon probleme.

    Je declare ceci:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       Light_Model        : Array[0..3] Of GLfloat = (1,1,1, 1.0 );
       Lumiere_blanche    : Array[0..3] Of GLfloat = (1,1,1, 1.0 );
       Lumiere_violet     : Array[0..3] Of GLfloat = (0.6,0.2,1, 1.0 );
     
       Lumiere_Position   : Array[0..3] Of GLfloat = (-2.0, 0.0, 0.0, 1.0 );
       Lumiere_Direction  : Array[0..3] Of GLfloat = (0, 0.0, 0.0, 1.0 );
    ensuite je parametre mes source de lumiere comme ceci
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        glLightfv(GL_LIGHT0,GL_POSITION,@Lumiere_Position);
        glLightfv(GL_LIGHT0,GL_DIFFUSE ,@Lumiere_blanche);
        glLightfv(GL_LIGHT0,GL_SPECULAR,@Lumiere_violet);
        glLightfv(GL_LIGHT0,GL_AMBIENT ,@Lumiere_violet);
        glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,@Lumiere_Direction);
        glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@Light_Model);
     
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glEnable(GL_DEPTH);
    et j'obtient ceci:
    http://www.developpez.net/forums/attachment.php?attachmentid=253&stc=1&d=1145870051
    Le carré jaune symbolise la source de lumiere et le carré rouge sa direction.

    Mon probleme, vous l'aurais peut-etre remarqué, vient du fait que les position et direction de la
    source lumineuse ne correspondent pas du tout aux positions des carrés.
    On voit clairement que celle-ci vient plutot du coin superieur gauche.

    Si quelqu'un a deja eu ce soucis, ou si quelqu'un voit d'ou cela peut venir
    Alors n'hésitez pas à vous faire connaitre
    (On dirai un algo)

    D'avance merci

  2. #2
    Rédacteur

    a priori, le probleme viens d'un glTranslate...
    en effet, les glTranslate affecte tout les objets qui sont situé apres l'appel au glTranslate donc si tu fais
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    positionnement lumiere
    glTranslate(x,y,z)
    affichage cube
    affichage position lumieres

    les lumieres serons aussi translaté. ce qu'il faut faire dans ce cas la c'est :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    positionnement lumieres
    glPushMatrix()
    glTranslate(x,y,z)
    affichage cube
    glPopMatrix()
    affichage position lumieres

    ou encore (moins propre mais doit aussi fonctionner)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    positionnement lumiere
    affichage position lumieres
    glTranslate(x,y,z)
    affichage cube
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  3. #3
    Membre actif
    Salut.
    Bon ben deja je n'utilise pas de glTranslate. Mais J'utilise des glRotatef (le probleme est le meme) donc a priori et selon toi le probleme peut venir de là (moi ca me semble bizare mais soit..).
    Bon je vais tout de meme essayer.

    qu'entend tu par
    affichage position lumieres

  4. #4
    Rédacteur

    simplement
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    glLightfv(GL_LIGHT0,GL_POSITION,@Lumiere_Position);
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  5. #5
    Membre actif
    D'accord.
    Dans ce cas qu'entends tu par:
    positionnement lumieres

  6. #6
    Rédacteur

    argle... je me suis melangé la...
    donc le positionnement de la lumiere c'est quand on donne la position de la lumiere à openGL, donc c'est
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    glLightfv(GL_LIGHT0,GL_POSITION,@Lumiere_Position);


    et l'affichage de la position de la lumiere, c'est quand tu affiche le point dans l'espace avec un
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glBegin(GL_POINTS);
    glVertex3f(x,y,z)
    glEnd();
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  7. #7
    Membre actif
    Ah Ok.
    Bon ben ca change rien.
    Si la lumiere ne tourne pas avec la scene. c'est déja ca.
    Mais j'ai toujours le meme probleme.
    http://www.developpez.net/forums/attachment.php?attachmentid=277&stc=1&d=1145959322
    Le point jaune est censée etre la source lumineuse.
    Or on voit bien que la lumiere provient d'ailleur.
    Ou alors montrez moi qu'il faut que j'aille chez l'ophtalmo.
    Au fait..
    on voit bien qu'il y a également une lumiere ambiente alors que je ne me sert que GL_LIGHT0. est-ce normal?

  8. #8
    Expert confirmé
    Salut,

    il faudrait que tu revois tes paramèteres, entre autres :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Lumiere_Direction  : Array[0..3] Of GLfloat = (0, 0.0, 0.0, 1.0 );
    Ton vecteur direction est... NULL, comment veux tu qu'OpenGL sache dans quelle direction ton SPOT envoie la lumière ?
    à moins que tu ne voulais pas utiliser un SPOT ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@Light_Model);

    et là tu met la lumière ambiante à la valeur Light_Model
    donc normal qu'il y ait une lumière ambiante

    [EDIT] je reviens pour te préciser 2 petites choses qui peuvent t'aider à comprendre l'utilisation des sources lumineuses OpenGL :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    glLightfv(GL_LIGHTi, GL_AMBIENT, @tab_valeurs);
    te permet de paramétrer la valeur d'éclairage ambient d'une source lumineuse
    afin d'éviter le noir complet
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@Light_Model);
    te permet de paramétrer l'intensité et la couleur de la lumière ambiante partout dans ton univers, quelque soit la ou les lumières présentes qui viennent ajouter leur grain de sel
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Membre actif
    Merci Shenron666. Mon probleme est résolu grace a tes explications.
    Direction est un vecteur. Je pensais qu'il s'agissait du point vers lequel le spot donnais.
    Merci également à bafman qui avait raison. On peut avoir des probleme en bougeant les plan. On peut obtenir un resultat qui n'est pas le bon.
    J'espere ne pas vous avoir trop ennuyé pour une tel etourderie.
    MERCI