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 :

Lumière qui suit la caméra


Sujet :

OpenGL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut Lumière qui suit la caméra
    Bonjour,

    J'utilise openTK pour coder en OpenGL, mais j'ai un soucis pour la l'affichage de la lumière: en effet, je souhaiterai placer un spot sur la caméra et éclairer la scène

    dans la direction de la caméra. Mais pour l'instant mon modèle ne s'éclaire pas et tout reste sombre.

    Voici mon code:
    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
     
    private void Render()
    {
        // Colorie Fond Ecran           
        GL.ClearColor(new Color4((byte)64, (byte)64, (byte)64, (byte)255));
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);     
     
    	// Caméra
        float demiAngleOuverture = 40.0f * ((float)(Math.PI / 180.0));
        float ratioLargeurSurHauteur = (float)((float)glControl1.Width / (float)glControl1.Height);
        float distanceFront = 0.1f;
        float distanceBack = 10000.0f;
        GL.MatrixMode(MatrixMode.Projection);
        GL.LoadIdentity();
        OpenTK.Matrix4 perspective = OpenTK.Matrix4.CreatePerspectiveFieldOfView(demiAngleOuverture, ratioLargeurSurHauteur, distanceFront, distanceBack);
        GL.LoadMatrix(ref perspective);
        float _alpha = (float)(alpha * (Math.PI / 180));
        float _beta = (float)(beta * (Math.PI / 180));
        float xO = (float)(rayonSphere * Math.Cos(_beta) * Math.Cos(_alpha));
        float yO = (float)(rayonSphere * Math.Cos(_beta) * Math.Sin(_alpha));
        float zO = (float)(rayonSphere * Math.Sin(_beta));
        float upX = (float)(-Math.Cos(_alpha) * Math.Sin(_beta));
        float upY = (float)(-Math.Sin(_alpha) * Math.Sin(_beta));
        float upZ = (float)Math.Cos(_beta);
        Matrix4 camera = Matrix4.LookAt((float)(xCentre + xO), (float)(yCentre + yO), (float)(zCentre + zO), xCentre, yCentre, zCentre, upX, upY, upZ);
        GL.MatrixMode(MatrixMode.Modelview);            
        GL.LoadMatrix(ref camera);            			
     
    	// Lumière
    	GL.LoadIdentity();
    	Lumiere(0,0,-1);
     
        // Modèle                                      
        // GL.ShadeModel(ShadingModel.Smooth);
        GL.Begin(PrimitiveType.Triangles);
        bool sens = false;
        for (int y = 0; y < nbPasY - 1; y++)
        {
            int indexDebut = y * nbPasX;
            sens = !sens;
            for (int i = indexDebut; i < indexDebut + nbPasX - 1; i++)
            {
                double nx = 0;
                double ny = 0;
                double nz = 0;
                if (sens)
                {
                    // 1er triangle
                    Normale(ref nx, ref ny, ref nz, strip[i].X1, strip[i].Y1, strip[i].Z1, strip[i].X0, strip[i].Y0, strip[i].Z0, strip[i + 1].X1, strip[i + 1].Y1, strip[i + 1].Z1);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i].X1, (float)strip[i].Y1, (float)strip[i].Z1);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i].X0, (float)strip[i].Y0, (float)strip[i].Z0);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i + 1].X1, (float)strip[i + 1].Y1, (float)strip[i + 1].Z1);
                    // 2ème triangle
                    Normale(ref nx, ref ny, ref nz, strip[i + 1].X0, strip[i + 1].Y0, strip[i + 1].Z0, strip[i + 1].X1, strip[i + 1].Y1, strip[i + 1].Z1, strip[i].X0, strip[i].Y0, strip[i].Z0);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i + 1].X0, (float)strip[i + 1].Y0, (float)strip[i + 1].Z0);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i + 1].X1, (float)strip[i + 1].Y1, (float)strip[i + 1].Z1);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i].X0, (float)strip[i].Y0, (float)strip[i].Z0);
                }
                else
                {
                    // 1er triangle
                    Normale(ref nx, ref ny, ref nz, strip[i].X0, strip[i].Y0, strip[i].Z0, strip[i].X1, strip[i].Y1, strip[i].Z1, strip[i + 1].X0, strip[i + 1].Y0, strip[i + 1].Z0);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i].X0, (float)strip[i].Y0, (float)strip[i].Z0);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i].X1, (float)strip[i].Y1, (float)strip[i].Z1);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i + 1].X0, (float)strip[i + 1].Y0, (float)strip[i + 1].Z0);
                    // 2ème triangle
                    Normale(ref nx, ref ny, ref nz, strip[i + 1].X1, strip[i + 1].Y1, strip[i + 1].Z1, strip[i + 1].X0, strip[i + 1].Y0, strip[i + 1].Z0, strip[i].X1, strip[i].Y1, strip[i].Z1);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i + 1].X1, (float)strip[i + 1].Y1, (float)strip[i + 1].Z1);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i + 1].X0, (float)strip[i + 1].Y0, (float)strip[i + 1].Z0);
                    GL.Normal3((float)nx, (float)ny, (float)nz);
                    GL.Vertex3((float)strip[i].X1, (float)strip[i].Y1, (float)strip[i].Z1);
                }
            }
        }
        GL.End();
     
        // Rendu
        glControl1.SwapBuffers();
    }
    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
     
    private void Lumiere(float xO,float yO,float zO)
    {
        GL.Enable(EnableCap.DepthTest);
        GL.FrontFace(FrontFaceDirection.Ccw);
        GL.Enable(EnableCap.CullFace);
        GL.CullFace(CullFaceMode.Front);
        float[] globalAmbient = new float[4] { 0.19f, 0.19f, 0.09f, 1.00f };
        GL.LightModel(LightModelParameter.LightModelAmbient, globalAmbient);
        GL.LightModel(LightModelParameter.LightModelLocalViewer, 1f);
        GL.LightModel(LightModelParameter.LightModelAmbient, 0.05f);
        float[] color = new float[4] { 0.19f, 0.19f, 0.09f, 1.00f };
        GL.LightModel(LightModelParameter.LightModelColorControl, color);
        float[] matDifus = new float[4] { 0.22f, 0.80f, 0.80f, 1.00f };
        GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Diffuse, matDifus);
        float[] matSpecu = new float[4] { 0f, 0f, 0f, 1.00f };
        GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Specular, matSpecu);
        float[] matAmbient = new float[4] { 0f, 0f, 0f, 1.00f };
        GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Ambient, matAmbient);
        float[] matEmis = new float[4] { 0.00f, 0.00f, 0.00f, 1.00f };
        GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Emission, matEmis);
        GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Shininess, 76f);
        float[] light0Diffuse = new float[4] { 0.6f, 0.6f, 0.6f, 1.00f };
        GL.Light(LightName.Light0, LightParameter.Diffuse, light0Diffuse);
        float[] light0Specular = new float[4] { 0.7f, 0.7f, 0.7f, 1.00f };
        GL.Light(LightName.Light0, LightParameter.Specular, light0Specular);
        float[] light0Ambient = new float[4] { 1f, 1f, 1f, 1.00f };
        GL.Light(LightName.Light0, LightParameter.Ambient, light0Ambient);
        // GL.Light(LightName.Light0, LightParameter.SpotCutoff, 180);
        float[] position = new float[3] { 0f, 0f, 0f };
        GL.Light(LightName.Light0, LightParameter.Position, position);
        float[] direction = new float[3] { 0f,0f,-1f };
        GL.Light(LightName.Light0, LightParameter.SpotDirection, direction);
        //GL.Light(LightName.Light0, LightParameter.SpotCutoff, 360f);
        GL.Enable(EnableCap.Lighting);
        GL.Enable(EnableCap.Light0);
        GL.Enable(EnableCap.Normalize);    
    }
    La caméra est affichée en ((float)(xCentre + xO), (float)(yCentre + yO), (float)(zCentre + zO)) et pointe vers (xCentre, yCentre, zCentre).

    Merci de votre aide.

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


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

    Ne faudrait t-il pas placer la lumière en : xCentre + xO, yCentre + yO, zCentre + zO ?
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    J'ai changé les coordonnées pas celle que vous indiquez et je n'obtient pas de modification sensible du halo du spot, la scène reste presque dans l'ombre.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Je viens de remarquer que dans votre fonction "Lumière", vous n'utilisez pas les x0,y0 et z0 que vous lui passez.
    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
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    oui, en effet, car j'ai lu sur le net que la position de la lumière était définit dans le repère de la caméra (GL.MatrixMode(MatrixMode.Modelview)) donc j'ai mis 0 en x et 0 en y.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Avez vous quand même essayé avec ma proposition ? (en utilisant les coordonnées de la caméra).
    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 du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Points : 66
    Points
    66
    Par défaut
    oui en effet j'ai essayé mais cela n'a pas marché.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    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 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    En théorie, la position de la lumière, c'est quatre coordonnée. La quatrième doit être mis à 1.0. Je pense que cela marchera ainsi mieux.
    ( http://www.opentk.com/node/355 )
    Oui alors, mettre à 0.0. Je vous conseille de tester les deux.
    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.

Discussions similaires

  1. Lumière et effet d'ombre qui suit le curseur
    Par dev14 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 29/08/2012, 12h55
  2. texte qui suit le contour d'une image
    Par Rocket666 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 07/02/2006, 11h45
  3. Lumière qui clignote
    Par seeme dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/02/2006, 15h48
  4. [FLASH MX2004] Un bouton qui suit mon curseur...
    Par gregooo dans le forum Flash
    Réponses: 17
    Dernier message: 03/02/2006, 11h27
  5. Fenêtre (sorte de popup) qui suit la souris en onmouseover
    Par yoyot dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/03/2005, 09h52

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