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 :

Position d'une lumière


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut Position d'une lumière
    Salut à tous,

    J'ai actuellement un petit problème avec le positionnement d'une lumière sous openGL.

    Je m'explique:

    Je dessine une grosse sphère en (0, 0, 0) et une petite en (0, 0, 1).

    Dans une fonction appelée par le main() et jamais plus appelée ensuite, je positionne une lumière en (10, 10, 0).

    Dans mon callBack de display displayFunc(), je positionne une caméra (lookAt() ) en (0, 0, 5).

    Je vois donc mes 2 sphères. Ca ok !

    Par contre, ma lumière semble se placer en (10, 10, 5) au lieu de (10, 10, 0) et je corrige ce problème en remettant un glLightfv(GL_LIGHT0, GL_POSITION, lightPosition) juste après le lookAt() dans mon displayFunc()...

    Pourquoi la lumière se place-t-elle en relatif par rapport au lookAt() et non pas en absolu (donc en 10, 10, 0) ?

    Pourquoi si je la repositionne après le lookAt(), tout à l'air de bien se passer ?

    Plus grave, si mon lookAt() est maintenant en (0, 0, -5), ma lumière est du mauvais côté ? (en fait, elle se positionne encore par rapport au lookAt() et se trouve alors à l'envers ????

    Je dois passer à côté de quelques chose non ?

    Je peux fournir un code si besoin.

    Merci.
    Joe.

  2. #2
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    le positionnement de ta lumière est influencé par tous les rotate et translate exactement comme le seraint les sommets transmis
    gluLookAt effectue ce genre de transformation et influe donc sur la position de ta lumière
    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.

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    le positionnement de ta lumière est influencé par tous les rotate et translate exactement comme le seraient les sommets transmis
    gluLookAt effectue ce genre de transformation et influe donc sur la position de ta lumière
    Merci de ta réponse.

    C'est bien ce qu'il me semblait mais alors, est-ce normal de repositionner sa lumière à chaque rendu ?

    Est-ce correct de le faire après le lookAt() justement ?
    Quelle est la façon correcte de faire ?

    Et dans mon cas, je plaçais la lumière dans le main() avant toute transformation donc, je pensais que la position de la lumière était absolu...
    Est-ce le cas ?

    Merci encore.
    Joe.

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    à ma connaissance, le positionnement de la lumière est absolu
    et le lookat est à faire en premier

    lorsque tu plaçais ta lumiètre dans le main, tu "chargeais" bien a trice identité avant ? histoire de commencer sur de bonnes bases

    autre chose, dans opengl la "gestion de la caméra" s'effectue en faisant les opération inverse sur le "monde"
    autrement dit, lorsque tu fait un lookat, en fait ce sont les opérations inverses qui sont effectuées sur le monde, ta vue se trouve toujours en (0, 0, 0)
    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.

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut
    Et bien, j'aurais dit ça aussi mais, regarde ce code tout simple:

    ----------------
    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
    #include <iostream>
    #include "glut.h"
    
    using namespace std;
    
    GLfloat lightPosition[]={ 10.0, 10.0, 0.0, 0.0 };
    
    void initGL(void) {
    	cout << "...dans initGL()" << endl;
    
    	glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
    
    	// On autorise la lumière.
    	glEnable(GL_LIGHTING);
    	glEnable(GL_LIGHT0);
    }
    
    void displayFunc(void) {
    	cout << "...dans display()" << endl;
    
    	//Effacement des pixels.
    	glClear(GL_COLOR_BUFFER_BIT);
    
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    
    	gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    	
    	// LIGNE A METTRE POUR NE PLUS AVOIR LE PHENOMENE --> glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
    
    	glutSolidSphere(1.0, 64, 64);
    	
    	glFlush();
    	glutSwapBuffers();
    }
    
    
    void reshapeFunc(int w, int h) {
    	cout << "...dans reshape() w=" << w << " h=" << h << endl;
    
    	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
    
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    
    	glFrustum(-w/(float) h, w/(float) h, -1.0, 1.0, 2.0, 20.0);
    }
    
    int main(int argc, char *argv[]) {
    	// Initialisation de GLUT.
    	glutInit(&argc, argv);
    
    	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    
    	// On crée la première fenêtre.
    	glutInitWindowSize(500, 500);
    	glutInitWindowPosition(100, 100);
    
    	glutCreateWindow("Fenetre #1");
    
    	initGL();
    
    	glutDisplayFunc(displayFunc);
    	glutReshapeFunc(reshapeFunc);
    	
    	// On entre dans la boucle GLUT.
    	glutMainLoop();
    
    	return(0);
    }
    ----------------

    Et bien, si tu le compiles et si le lookAt() vaut:
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

    la lumière vient de la droite.

    Et si le lookAt() vaut:
    gluLookAt(0.0, 0.0, -5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

    La lumière vient encore de la droite alors qu'on est à l'opposé de l'origine (z passe de 5.0 à -5.0)....

    Si tu rajoutes la ligne (en rouge ci dessus) suivante:

    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition)

    dans le displayFunc(), le phénomène n'a plus lieu et là, la lumière vient bien de la gauche dans le 2e cas....

    Alors, comment est-ce possible ?????

    Merci.
    Joe.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    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 157
    Billets dans le blog
    152
    Par défaut
    ATTENTION : je vais peut être dire une connerie

    le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLfloat lightPosition[]={ 10.0, 10.0, 0.0, 0.0 };
    essaie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GLfloat lightPosition[]={ 10.0, 10.0, 0.0, 1.0 };
    Je crois que le dernier paramètre sert à ça ... mais j'en suis pas sur ... D'ailleurs si quelqu'un peut m'expliquer ce dernier paramètre simplement et en français
    Merci.

    ( Conseil , met ton code entre les balises : [ CODE ] [ / CODE ] c'est mieux ... et le site gère assez bien , merci )
    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.

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut
    Si tu rajoutes la ligne (en rouge ci dessus) suivante:

    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition)

    dans le displayFunc(), le phénomène n'a plus lieu et là, la lumière vient bien de la gauche dans le 2e cas....

    Alors, comment est-ce possible ?????
    Après pas mal de recherche, je viens d'avoir la réponse (proche de ce que disait shenron666) :

    Il s'agit d'un phénomène normal, la lumière doit se placer en absolu juste après un lookAt() afin d'avoir une lumière fixe dans la scène. Cela n'influe pas du tout sur les perfs bien sûr !!!!

    Voilà.
    Merci et @+
    Joe.

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

Discussions similaires

  1. [GLSL] Position et direction d'une lumière
    Par coda_blank dans le forum OpenGL
    Réponses: 5
    Dernier message: 02/06/2010, 14h41
  2. Position d'une ScrollBar dans un TRichEdit (ou TMemo)
    Par Troll dans le forum C++Builder
    Réponses: 9
    Dernier message: 24/02/2005, 15h18
  3. Récuperer la taille & position d'une fenêtre
    Par TheDarkLewis dans le forum Windows
    Réponses: 3
    Dernier message: 20/09/2004, 22h15
  4. Position d'une balise dans un document externe
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 02h56
  5. [VB6] Position d'une MDIchild dans un MDI
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/01/2003, 14h02

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