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 la lumière (jogl:opengl)


Sujet :

OpenGL

  1. #1
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Points : 0
    Points
    0
    Par défaut Problème avec la lumière (jogl:opengl)
    Bonjour j'ai un problème pour utiliser la lumière dans opengl ...

    je créé un cube sous maya je l'exporte en fichier.obj du coup dans mon programme java je récupère les points les normales et les faces (voir format obj ...) bref ensuite je veux l'afficher donc ça marche , je lui fais faire des rotations x y z ça marche.

    Là je veux mettre en place une lumière donc je fais ça là c'est ma méthode pour initialiser:

    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
     
    public void init(GLAutoDrawable gLDrawable) 
        {
        	System.out.println("init() called");
     
            GL2 gl = gLDrawable.getGL().getGL2();
            gl.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
            gl.glShadeModel(GL2.GL_FLAT);
            gl.glEnable(GL.GL_DEPTH_TEST);
     
     
            gl.glEnable(GL2.GL_LIGHTING);
            gl.glEnable(GL2.GL_LIGHT0);
            gl.glEnable(GL2.GL_SMOOTH);
            gl.glEnable(GL2.GL_NORMALIZE);
     
            //float light_diffuse[] ={1.0f,1.0f,0.0f,1.0f}; 
            //gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_DIFFUSE,light_diffuse,0);
            FPSAnimator a=new FPSAnimator(gLDrawable,60);
            a.start();
        }

    donc je mets en place la lumière 0 ensuite dans mon draw qui est appelé 60 fois /s (voir fpsanimator)

    la méthode est longue je la mets comme ça juste pour la mettre

    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
    public void display(GLAutoDrawable gLDrawable) 
        {
     
     
        	final GL2 gl = gLDrawable.getGL().getGL2();
            gl.glClear(GL2.GL_COLOR_BUFFER_BIT|GL.GL_DEPTH_BUFFER_BIT);
     
            gl.glMatrixMode(GL2.GL_MODELVIEW);
            gl.glLoadIdentity();
     
            float light_position[] ={-30.0f,0.0f,0.0f,1.0f}; // position de la lumière
            gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_POSITION,light_position,0);
     
     
            gl.glTranslatef(0.0f,0.0f,-20.0f);
            gl.glRotatef(angle,0.0f,1.0f,0.0f);
     
            gl.glBegin(GL2.GL_QUADS);
     
            Iterator t=faces.iterator();
            Integer []c;
     
            while(t.hasNext()){
     
            	c=(Integer[])t.next();
     
            	gl.glColor3f(1.0f,0.0f,0.0f);
     
     
            	gl.glNormal3f(normales.get(c[1]-1)[0],normales.get(c[1]-1)[1],normales.get(c[1]-1)[2]);
            	gl.glVertex3f(vertex.get(c[0]-1)[0],vertex.get(c[0]-1)[1],vertex.get(c[0]-1)[2]);
     
            	gl.glNormal3f(normales.get(c[3]-1)[0],normales.get(c[3]-1)[1],normales.get(c[3]-1)[2]);
                gl.glVertex3f(vertex.get(c[2]-1)[0],vertex.get(c[2]-1)[1],vertex.get(c[2]-1)[2]);
     
                gl.glNormal3f(normales.get(c[5]-1)[0],normales.get(c[5]-1)[1],normales.get(c[5]-1)[2]);
                gl.glVertex3f(vertex.get(c[4]-1)[0],vertex.get(c[4]-1)[1],vertex.get(c[4]-1)[2]);
     
                gl.glNormal3f(normales.get(c[7]-1)[0],normales.get(c[7]-1)[1],normales.get(c[7]-1)[2]);
                gl.glVertex3f(vertex.get(c[6]-1)[0],vertex.get(c[6]-1)[1],vertex.get(c[6]-1)[2]);
     
     
     
            }
     
            gl.glEnd();
            gl.glFlush();
            angle=(angle+1)%360;
     
        }

    bref dans cette méthode je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float light_position[] ={-30.0f,0.0f,0.0f,1.0f}; // position de la lumière
            gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_POSITION,light_position,0);

    normalement ma lumière est censé être à gauche de mon écran donc éclairer la gauche de mon cube qui tourne en sur lui même en y le problème c'est que ce n'est pas le cas les faces s'illuminent du côté gauche et quand elles sont faces à moi aussi et s'éteignent à droite ensuite le cube fais un tour sans qu'aucunes faces ne s'illuminent.

    j'ai essayé de mettre ma lumière à la meilleur hauteur que mon cube cad:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float light_position[] ={-30.0f,0.0f,-20.0f,1.0f}; // position de la lumière
            gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_POSITION,light_position,0);
    mais rien ne change ...


    edit: mes normales ont une norme == 1 je le précise au cas où

    re edit:une vidéo de ce que j'ai ici

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J'ose croire que la lumière tourne avec le cube.
    De mémoire, pour régler cela, il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float light_position[] ={-30.0f,0.0f,0.0f,0.0f}; // position de la lumière
    Sinon, il est très conseillé de passer à du vrai OpenGL 2 (ou plus) au lieu d'utiliser les vieilles et obsolètes fonctionnalité OpenGL 1 (pipeline fixe).
    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 du Club
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Points : 41
    Points
    41
    Par défaut
    ajoute glPushMatrix();
    apres le positionnement de la lumiere

    ajoute glPopmatrix avant ton glFlush()

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Pouvez vous me rappeler à quoi correspond le dernier paramètre de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_POSITION,light_position,0);
    je ne trouve pas la doc
    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.

  5. #5
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Salut

    Citation Envoyé par LittleWhite Voir le message
    Pouvez vous me rappeler à quoi correspond le dernier paramètre de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_POSITION,light_position,0);
    je ne trouve pas la doc
    A chercher dans la doc Jogl/Jogamp (lien)
    C'est un offset pour localiser les paramètres dans le tableau de float (pour le fois où on utilise un tableau de float "générique"). Dans le cas le plus simple, on met les 4 valeurs du vecteur position dans un tableau de float[4], et on met l'offset à 0 (il y a une fonction équivalente glLightfv à trois paramètres, plus en ligne avec OpenGL, qui utilise un Floatbuffer à la place du tableau de float + offset)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

Discussions similaires

  1. Problème avec la lumière (jogl:opengl)
    Par Alays dans le forum Général Java
    Réponses: 2
    Dernier message: 29/10/2012, 17h48
  2. Problème avec code::blocks et opengl
    Par Dietzer dans le forum Code::Blocks
    Réponses: 4
    Dernier message: 19/06/2009, 19h24
  3. Problème avec le "light mapping" OpenGL ?
    Par zambizi dans le forum OpenGL
    Réponses: 6
    Dernier message: 02/03/2008, 11h09
  4. [OpenGL] Problème avec glGetString
    Par djo.mos dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 17/06/2005, 11h12
  5. Problèmes avec les lumières
    Par Blackhorn dans le forum OpenGL
    Réponses: 2
    Dernier message: 27/12/2004, 12h14

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