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 :

pb de lumiere & transformation


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Par défaut pb de lumiere & transformation
    Bonjour,

    Je travaille sur un programme de visualisation scientifique base sur OpenGL et j'ai un probleme avec la lumiere. Jusqu'ici, je definissais ma matrice modelview de telle sorte que mes objets tombent dans le cube [-0.5 0.5 -0.5 0.5 -10 10] et puis je faisais:

    glOrtho(-0.5, 0.5, -0.5, 0.5, -10, 10);
    glViewport(0, 0, width, height);

    L'eclairage etait OK. Recemment, j'ai change mes transformations pour que ma matrice modelview "mappent" mes coordonnees objet directement en coordonnees fenetre et puis je fais:

    glOrtho(0, width, height, 0, 1000, -1000);
    glViewport(0, 0, width, height);

    Mais l'eclairage ne marche pas: j'ai juste la lumiere ambiante, la diffuse et speculaire n'a pas l'air d'apparaitre. Les normales sont identiques et j'active GL_NORMALIZE dans les 2 cas.

    Qu'est-ce qui peut provoquer cela? Merci.

    PS: Pour info, dans le premier cas, la matrice modelview est

    0.00366 -0.00281 0.00000 -0.00084
    0.00121 0.00158 0.66993 0.00000
    -0.00439 -0.00573 0.80760 -8.66025
    0.00000 0.00000 0.00000 1.00000

    dans le deuxieme cas, elle est

    2.16429 -1.66071 0.00000 295.00000
    -0.57461 -0.74884 -316.87822 238.00000
    0.00439 0.00573 -0.80760 8.66025
    0.00000 0.00000 0.00000 1.00000

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Il faudrait peut-être voir comment tu définis tes lumières et tu as fait exprès de changer les signes des deux derniers paramètres de glOrtho ?

    A mon avis, cela va changer la facon dont fonctionnera les lumières.

    Jc

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Par défaut
    Citation Envoyé par fearyourself
    Il faudrait peut-être voir comment tu définis tes lumières et tu as fait exprès de changer les signes des deux derniers paramètres de glOrtho ?

    A mon avis, cela va changer la facon dont fonctionnera les lumières.

    Jc
    Note que glOrtho est appele pour la matrice de projection.

    Oui, l'inversion est volontaire. Pour l'axe Y, j'avais trouve un exemple sur le web, permettant d'utiliser OpenGL avec des coordonnees fenetre; comme l'axe Y est inverse (haut->bas), l'inversion dans glOrtho fait directement le mapping bas->haut/haut->bas.

    Pour l'axe Z, pour etre plus exact, je calcule les coordonnees Z min/max apres la transformation modelview, et je definis la projection par

    glOrtho(0, width, height, 0, -zmin, -zmax);

    D'une maniere generale, je pensais que l'eclairage etait calcule avant la projection (auquel cas, cela ne devrait pas avoir d'influence), mais je me gourre peut-etre, je suis plutot novice.

    Les lumieres sont definies de la meme maniere dans les 2 cas: lumiere locale blanche

    double[] cp = {1,1,1,1};
    glLightfv(GL_LIGHT0, GL_DIFFUSE, cp, 0);
    glLightfv(GL_LIGHT0, GL_SPECULAR, cp, 0);
    glLightfv(GL_LIGHT0, GL_AMBIENT, new float[] {1,1,1,1}, 0);
    glLightfv(GL_LIGHT0, GL_POSITION,
    new float[] {p1, p2, p3, (isLocal ? 1.0f : 0.0f)}, 0);

  4. #4
    Membre éclairé Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    as tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glEnable(GL_LIGHT0)
    As tu mis des textures ?
    si oui as tu mis dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);
    et non
    as tu le culling d'activé ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glFrontFace(GL_CCW);//sens de construction des faces counter clock wise (sens direct)
    glCullFace(GL_BACK); //met le à front and back ça affichera les deux cotés des faces.
    glEnable(GL_CULL_FACE);
    Mais perso ton gluortho bidouillé avec des inversions d'axes, ça revien à faire des scale négatif. chose que j'aime pas trop (dans ce cas faut bien réfléchir au sens de contruction et au culling) . Pour ton near et ton far, ta caméra étant au milieu , je pense que -1000 -1 ou 1 1000 serait à essayer.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Par défaut
    Citation Envoyé par Suryavarman
    as tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glEnable(GL_LIGHT0)
    As tu mis des textures ?
    si oui as tu mis dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);
    et non
    as tu le culling d'activé ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glFrontFace(GL_CCW);//sens de construction des faces counter clock wise (sens direct)
    glCullFace(GL_BACK); //met le à front and back ça affichera les deux cotés des faces.
    glEnable(GL_CULL_FACE);
    Mais perso ton gluortho bidouillé avec des inversions d'axes, ça revien à faire des scale négatif. chose que j'aime pas trop (dans ce cas faut bien réfléchir au sens de contruction et au culling) . Pour ton near et ton far, ta caméra étant au milieu , je pense que -1000 -1 ou 1 1000 serait à essayer.
    La lumiere est bien activee. Il n'y a pas de texture. Le culling n'est pas active. Par acquis de conscience, j'ai remodifie mes matrices de transformations pour eviter l'inversion dans glOrtho; maintenant je n'ai plus de scale negatif et mon glOrtho ressemble a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glOrtho(0, width, 0, height, zmin, zmax);
    Mais ca ne change pas grand chose.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Par défaut
    Voici quelques infos supplementaires.

    J'ai repris mon ancien code (ou cela fonctionnait correctement) et j'ai essaye de reproduire le meme type de scaling que dans le nouveau. En effet, une des differences principales entre les 2, c'est que dans un cas mon cube unite est mappe en coordonnee normalisee dans un rectangle [-0.5, -0.5, 0.5, 0.5] alors que dans l'autre cas mon cube unite est mappe dans un rectangle dont les coordonnees correspondent aux pixels de ma fenetre [x, y, w, h], donc avec des valeurs beaucoup plus grande. Et le probleme d'eclairage apparait, meme avec mon ancien code.

    En pratique, cela donne ceci. Si ma fenetre OpenGL a un dimension (W,H) et que mon cube unite occupe le rectangle [x,y,w,h] en coordonnees fenetre, dans un cas (ou l'eclairage fonctionne) je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    glMatrixMode(GL_MODELVIEW);
    glTranslated(-0.5+(x+w/2)/W, -0.5+(y+h/2)/H, 0);
    glScaled(w/W, h/H, 1);
    // + d'autres operations (communes)
    glMatrixMode(GL_PROJECTION);
    glOrtho(-0.5, 0.5, -0.5, 0.5, 0, 20);
    Et dans l'autre cas (ou l'eclairage ne fonctionne pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    glMatrixMode(GL_MODELVIEW);
    glTranslated(x+w/2, y+h/2, 0);
    glScaled(w, h, 1);
    // + d'autres operations (communes)
    glMatrixMode(GL_PROJECTION);
    glOrtho(0, W, 0, H, 0, 20);
    Dans les 2 cas, GL_LIGHT0, GL_LIGHTING et GL_NORMALIZE sont active. GL_CULL_FACE est desactive.

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

Discussions similaires

  1. Comment eviter le changement de & en &amps lors d'une transformation?
    Par hutuchong dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 10/12/2009, 18h17
  2. [PERL] transformation de fichier
    Par bob20000 dans le forum Langage
    Réponses: 6
    Dernier message: 27/07/2006, 11h13
  3. transformer un jour en JJ/MM/AA
    Par gemini_010 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 08/11/2002, 22h55
  4. Transformer un caractère en type énuméré
    Par HT dans le forum Langage
    Réponses: 3
    Dernier message: 22/10/2002, 20h46
  5. FFT(Fast Fourier Transform)
    Par IngBen dans le forum Traitement du signal
    Réponses: 6
    Dernier message: 23/05/2002, 16h35

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