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

3D Java Discussion :

[JOGL/JSR-231] Problème de composante spéculaire


Sujet :

3D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 1
    Par défaut [JOGL/JSR-231] Problème de composante spéculaire
    Bonjour à tous.

    Je début en JOGL (JSR-231) et je rencontre des difficultés avec la composante spéculaire de mon éclairage.

    1 / Lorsque ma caméra et ma lumière pointent vers les Z négatif, pas de problème, le résultat semble correct.

    Voici dans le code les positions de ma caméra et de ma lumière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final float[] CAMERA_POSITION = new float[]{0F, 5F, 15F};
    final float[] CAMERA_DIRECTION = new float[]{0F, 0F, 0F};
    final float[] SPOT_POSITION = new float[]{0F, 5F, 15F, 1F};
    final float[] SPOT_DIRECTION = new float[]{0F, 0F, -1F, 1F};

    Mais si je regarde l’objet par derrière en inversant TOUTES les composantes Z, je perds le reflet spéculaire. Voilà la nouvelle portion de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final float[] CAMERA_POSITION = new float[]{0F, 5F, -15F};
    final float[] CAMERA_DIRECTION = new float[]{0F, 0F, 0F};
    final float[] SPOT_POSITION = new float[]{0F, 5F, -15F, 1F};
    final float[] SPOT_DIRECTION = new float[]{0F, 0F, 1F, 1F};
    2 / Autre problème : si j'active le paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gl.glLightModeli(GL.GL_LIGHT_MODEL_LOCAL_VIEWER, GL.GL_TRUE)
    là aussi je perds la composante spéculaire


    Voilà enfin la totalité de mon code (celui avec qui marche) …

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    package Test1;
     
    import com.sun.opengl.util.Animator;
    import com.sun.opengl.util.GLUT;
    import java.awt.Dimension;
    import java.awt.Frame;
    import java.awt.Insets;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import javax.media.opengl.*;
    import javax.media.opengl.glu.*;
    import javax.swing.SwingUtilities;
     
    public class TestAPoster extends Frame implements GLEventListener {
     
        private final GLU GLU = new GLU();
        private final GLUT GLUT = new GLUT();
        private final Dimension CLIENT_MINIMUM_DIMENSION = new Dimension(640, 480);
     
        final float[] CAMERA_POSITION = new float[]{0F, 5F, 15F};
        final float[] CAMERA_DIRECTION = new float[]{0F, 0F, 0F};
        final float[] SPOT_POSITION = new float[]{0F, 5F, 15F, 1F};
        final float[] SPOT_DIRECTION = new float[]{0F, 0F, -1F, 1F};
     
        public TestAPoster() {
     
            // Hardware OpenGl
            GLCapabilities glCapabilities = new GLCapabilities();
            glCapabilities.setDoubleBuffered(true);
            glCapabilities.setHardwareAccelerated(true);
     
            // Canvas JOGL
            GLCanvas canvas = new GLCanvas();
            canvas.addGLEventListener(this);
            canvas.setPreferredSize(CLIENT_MINIMUM_DIMENSION);
            add(canvas);
     
            // Fenêtre
            setTitle(getClass().getSimpleName());
            setLocation(20, 20);
            setVisible(true);
            final Insets insets = getInsets();
            setMinimumSize(new Dimension(CLIENT_MINIMUM_DIMENSION.width + insets.left + insets.right, CLIENT_MINIMUM_DIMENSION.height + insets.top + insets.bottom));
            pack();
     
            // Boucle d'affichage
            final Animator animator = new Animator(canvas);
            addWindowListener(new WindowAdapter() {
     
                @Override
                public void windowClosing(WindowEvent e) {
                    new Thread(new Runnable() {
     
                        @Override
                        public void run() {
                            animator.stop();
                            System.exit(0);
                        }
                    }).start();
                }
            });
            // Et c'est parti ...
            animator.start();
        }
     
        @Override
        public void init(GLAutoDrawable _glDrawable) {
        }
     
        @Override
        public void display(GLAutoDrawable _glDrawable) {
            final GL gl = _glDrawable.getGL();
            gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
            GLUT.glutSolidTeapot(3);
        }
     
        @Override
        public void reshape(GLAutoDrawable _glDrawable, int _x, int _y, int _width, int _height) {
            final GL gl = _glDrawable.getGL();
     
            // Couleur de fond et du zbuffer
            gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            gl.glClearDepth(1.0f);
     
            // Caméra et projection
            gl.glMatrixMode(GL.GL_PROJECTION);
            gl.glLoadIdentity();
            GLU.gluPerspective(45, (double) ((double) _width / (double) _height), 0.1D, 100D);
            GLU.gluLookAt(CAMERA_POSITION[0], CAMERA_POSITION[1], CAMERA_POSITION[2], CAMERA_DIRECTION[0], CAMERA_DIRECTION[1], CAMERA_DIRECTION[2], 0D, 1D, 0D);
     
            // Matrix de vue
            gl.glMatrixMode(GL.GL_MODELVIEW);
            gl.glLoadIdentity();
     
            // Modèle d'éclairage
            gl.glShadeModel(GL.GL_SMOOTH);
            //gl.glLightModeli(GL.GL_LIGHT_MODEL_LOCAL_VIEWER, GL.GL_TRUE);
     
            // Lumière ponctiuelle
            gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, SPOT_POSITION, 0);
            gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPOT_DIRECTION, SPOT_DIRECTION, 0);
            gl.glLightf(GL.GL_LIGHT0, gl.GL_SPOT_CUTOFF, 60F);
            gl.glLightf(GL.GL_LIGHT0, GL.GL_SPOT_EXPONENT, 3.0F);
     
            gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1F}, 0);
            gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, new float[]{1F, 0F, 0F, 1F}, 0);
            gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, new float[]{1F, 1F, 1F, 1F}, 0);
     
            // Matériau de l'objet
            gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1F}, 0);
            gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, new float[]{1F, 0F, 0F, 1F}, 0);
            gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, new float[]{1F, 1F, 1F, 1F}, 0);
            gl.glMaterialfv(GL.GL_FRONT, GL.GL_SHININESS, new float[]{30F}, 0);
     
            // Etats
            gl.glEnable(GL.GL_DEPTH_TEST);
            gl.glEnable(GL.GL_LIGHTING);
            gl.glEnable(GL.GL_LIGHT0);
        }
     
        @Override
        public void displayChanged(GLAutoDrawable _glDrawable, boolean _modeChanged, boolean _deviceChanged) {
        }
     
        public static void main(String[] _args) {
            final TestAPoster test = new TestAPoster();
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    test.setVisible(true);
                }
            });
        }
    }
    En pièce jointe les 3 images obtenues.

    Par avance merci à tous pour votre aide
    Images attachées Images attachées    

Discussions similaires

  1. OpenGL (JSR 231) intégré à Java 7 ?
    Par FGuyno dans le forum 3D
    Réponses: 2
    Dernier message: 07/04/2009, 02h07
  2. Probléme application jarée et jogl.
    Par Asaturne dans le forum 3D
    Réponses: 11
    Dernier message: 10/10/2006, 10h13
  3. problème de spéculaire
    Par jerell dans le forum OpenGL
    Réponses: 1
    Dernier message: 14/06/2006, 11h59
  4. Réponses: 10
    Dernier message: 16/11/2005, 08h33
  5. [Debutant Java JOGL] problème glVertexPointer()
    Par Stef784ever dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/04/2004, 17h43

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