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

Développement 2D, 3D et Jeux Discussion :

Moteur de lumières dynamiques en dimension 2 [Tutoriel]


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Par défaut Moteur de lumières dynamiques en dimension 2
    Bonjour,

    Je viens vous présenter un moteur de lumières dynamiques en dimension 2 que j'ai conçu à la base pour mon projet jeu, mais qui peut facilement être adaptable à tout autre application en dimension 2.

    Suite à des avis positif sur ce moteur, j'ai décidé d'en faire un article sur mon blog et enfin un tutoriel sur Developpez.

    J'explique donc de A à Z le fonctionnement de ce moteur, ainsi que la façon dont je l'ai conçu.

    Vous pouvez consulter l'article ici.



    Bonne lecture.

  2. #2
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Par défaut
    Petite correction dans l'article :

    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
    if(l1.x * l1.x + l1.y * l1.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l1);
     
                if((pt1.x > i.x && pt2.x < i.x) || (pt1.x < i.x && pt2.x > i.x))
                if((pt1.y > i.y && pt2.y < i.y) || (pt1.y < i.y && pt2.y > i.y))
                    if((l1.y > 0 && i.y > 0) || (l1.y < 0 && i.y < 0))
                    if((l1.x > 0 && i.x > 0) || (l1.x < 0 && i.x < 0))
                    AddTriangle(i, pt2, w, m_wall), pt2 = i;
            }
            if(l2.x * l2.x + l2.y * l2.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l2);
     
                if((pt1.x > i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y > i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l2.y >= 0 && i.y >= 0) || (l2.y <= 0 && i.y <= 0))
                    if((l2.x >= 0 && i.x >= 0) || (l2.x <= 0 && i.x <= 0))
                    AddTriangle(pt1, i, w, m_wall), pt1 = i;
            }
    Devient :

    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
    if(l1.x * l1.x + l1.y * l1.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l1);
     
                if (pt1 != i && pt2 != i)
                if((pt1.x >= i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y >= i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l1.y >= 0 && i.y >= 0) || (l1.y <= 0 && i.y <= 0))
                    if((l1.x >= 0 && i.x >= 0) || (l1.x <= 0 && i.x <= 0))
                    AddTriangle(i, pt2, w, m_wall), pt2 = i;
            }
            if(l2.x * l2.x + l2.y * l2.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l2);
     
                if (pt1 != i && pt2 != i)
                if((pt1.x > i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y > i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l2.y >= 0 && i.y >= 0) || (l2.y <= 0 && i.y <= 0))
                    if((l2.x >= 0 && i.x >= 0) || (l2.x <= 0 && i.x <= 0))
                    AddTriangle(pt1, i, w, m_wall), pt1 = i;
            }
    Afin d'éviter des problèmes quand on a un mur vertical.

    PS : Merci à 4ian pour cette correction.

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 543
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 543
    Par défaut
    Salut tu pourrais un peu factoriser ton code il est pas terrible
    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
     
    if(l1.x * l1.x + l1.y * l1.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l1);
     
                if (pt1 != i && pt2 != i)
                if((pt1.x >= i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y >= i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l1.y >= 0 && i.y >= 0) || (l1.y <= 0 && i.y <= 0))
                    if((l1.x >= 0 && i.x >= 0) || (l1.x <= 0 && i.x <= 0))
                    AddTriangle(i, pt2, w, m_wall), pt2 = i;
            }
            if(l2.x * l2.x + l2.y * l2.y < m_radius * m_radius)
            {
                sf::Vector2f i = Intersect(pt1,pt2,sf::Vector2f (0,0),l2);
     
                if (pt1 != i && pt2 != i)
                if((pt1.x > i.x && pt2.x <= i.x) || (pt1.x <= i.x && pt2.x >= i.x))
                if((pt1.y > i.y && pt2.y <= i.y) || (pt1.y <= i.y && pt2.y >= i.y))
                    if((l2.y >= 0 && i.y >= 0) || (l2.y <= 0 && i.y <= 0))
                    if((l2.x >= 0 && i.x >= 0) || (l2.x <= 0 && i.x <= 0))
                    AddTriangle(pt1, i, w, m_wall), pt1 = i;
            }
    A quoi ça sert les fonctions en langage de programmation ?
    Tu vois bien qu'il y a du code qui se ressemble dans les 2 conditions donc tu peux faire une fonction qui teste si des coordonnées de points sont inférieures à un rayon au carré

  4. #4
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Par défaut
    Oui, j'y ait pensé, mais je ne trouvais pas ça particulièrement utile dans ce cas-ci.
    Maintenant, si tu trouve que c'est réellement important, ça peut facilement se faire.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 543
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 543
    Par défaut
    Citation Envoyé par Gregouar Voir le message
    Oui, j'y ait pensé, mais je ne trouvais pas ça particulièrement utile dans ce cas-ci.
    Maintenant, si tu trouve que c'est réellement important, ça peut facilement se faire.
    moi je m'en fiche mais imagines que tu gères un projet avec des milliers de lignes de code !
    Après si tu dois te relire et modifier un truc bonjour les problèmes !

  6. #6
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Par défaut
    C'est sûr, mais ici on ne parle que d'un groupe de quelques lignes qui ne revient que deux fois et dans le cadre d'un tutoriel.

    PS :
    moi je m'en fiche mais imagines que tu gères un projet avec des milliers de lignes de code !
    Ne t'en fais pas pour ça, j'ai l'habitude de m'y retrouver dans mon foutoir de 25 000 lignes.

  7. #7
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    J'avoue qu'il faudrait monter d'un cran le niveau d'abstraction là
    Sinon beau travail, le résultat est très sympathique

  8. #8
    Membre émérite
    Avatar de Gregouar
    Profil pro
    Chercheur en mathématiques
    Inscrit en
    Décembre 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur en mathématiques

    Informations forums :
    Inscription : Décembre 2007
    Messages : 246
    Par défaut
    Mise à jour du fichier d'exemple avec les sources pour la nouvelle API SFML2.

  9. #9
    Invité de passage
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2019
    Messages : 1
    Par défaut Division par 0
    Bonjour.
    Dans (d - b) / (a - c) on peux avoir une division par 0 si les droite sont parallèle a et c sont égaux donc a - c = 0, donc (d - b) / (a - c) = NaN.

    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
     
    sf::Vector2f Intersect(sf::Vector2f p1, sf::Vector2f p2, sf::Vector2f q1, sf::Vector2f q2)
    {
        sf::Vector2f i;
     
        if((p2.x - p1.x) == 0 && (q2.x - q1.x) == 0)
            i.x = 0, i.y = 0;
        else if((p2.x - p1.x) == 0)
        {
            i.x = p1.x;
     
            float c = (q2.y - q1.y) / (q2.x - q1.x);
            float d = q1.y - q1.x * c;
     
            i.y = c * i.x + d;
        }
        else if((q2.x - q1.x) == 0)
        {
            i.x = q1.x;
     
            float a = (p2.y - p1.y) / (p2.x - p1.x);
            float b = p1.y - p1.x * a;
     
            i.y = a * i.x + b;
        }
        else
        {
            float a = (p2.y - p1.y) / (p2.x - p1.x);
            float b = p1.y - p1.x * a;
     
            float c = (q2.y - q1.y) / (q2.x - q1.x);
            float d = q1.y - q1.x * c;
     
            i.x = (d-b)/(a-c);
            i.y = a * i.x + b;
        }
     
        return i;
    }

Discussions similaires

  1. Moteur de lumière 2D dynamique
    Par pokap dans le forum Débuter
    Réponses: 5
    Dernier message: 23/11/2010, 00h06
  2. Réponses: 4
    Dernier message: 19/12/2006, 21h06
  3. declaration d'un tableau dynamique 2 dimensions
    Par mike600river dans le forum C++Builder
    Réponses: 4
    Dernier message: 22/05/2006, 09h53
  4. Réponses: 1
    Dernier message: 09/03/2006, 18h25

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