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

Moteurs 3D Discussion :

Moteur 3D (GL,D3D) et Matrices


Sujet :

Moteurs 3D

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Moteur 3D (GL,D3D) et Matrices
    Bonjour,

    Comme beaucoup de monde j'ai énormément apprécié les tutoriaux de loulou su la conception d'un moteur 3D : http://loulou.developpez.com/tutoriels/moteur3d

    Par contre, il a quelques points que j'ai du mal à comprendre; il me semble qu'entre OpenGL et Direct3D les matrices ne sont pas stockées de la même façon d'une part et que opengl utilise un sytème de coordonnées droit alors que celui de d3d est gauche d'autre part.

    Par contre dans le moteur de loulou je n'ai rien vu qui fait cette distinction mais pourtant tout fonctionne correctement, j'aimerais bien qu'on m'explique comment cela est possible d'autant qu'il me semble que dans d'autre moteur 3d il ya une distinction.

    merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    il me semble qu'entre OpenGL et Direct3D les matrices ne sont pas stockées de la même façon
    Juste dans la documentation. Niveau coding, ça ne change strictement rien.

    opengl utilise un sytème de coordonnées droit alors que celui de d3d est gauche d'autre part
    Il semblerait que non

    La seule différence que j'ai notée au niveau des coordonnées, c'est l'inversion des Y en espace écran.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci pour cette réponse rapide ,
    mais je ne suis pas sûr que celle-ci me convenient parfaitement.

    J'ai regardé plus précisement le code de Ogre et dans la définition d'une Matrix4 j'ai trouvé cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    The use of column vectors and right-to-left ordering is the
    standard in most mathematical texts, and id the same as used in
    OpenGL. It is, however, the opposite of Direct3D, which has
    inexplicably chosen to differ from the accepted standard and uses
    row vectors and left-to-right matrix multiplication.
    Un autre point que j'ai du mal à comprendre c la façon de calculer la matrice de projection:
    dans ton code tu utilises cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        float YScale = 1.0f / std::tan(Fov / 2);
        float XScale = YScale / Ratio;
        float Coeff  = Far / (Far - Near);
     
        a11 = XScale; a12 = 0.0f;   a13 = 0.0f;  a14 = 0.0f;
        a21 = 0.0f;   a22 = YScale; a23 = 0.0f;  a24 = 0.0f;
        a31 = 0.0f;   a32 = 0.0f;   a33 = Coeff; a34 = Near * -Coeff;
        a41 = 0.0f;   a42 = 0.0f;   a43 = 1.0f;  a44 = 0.0f;
    alors que les formules que j'ai trouvé font cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            Real h = std::cos(Fov/2) / std::sin(Fov/2);
            Real w = h / Ratio;
            Real zn  = Near;
    	Real zf  = Far;
     
            a11 = 2*zn/w; a12 = 0.0f;    a13 = 0.0f;	  a14 = 0.0f;
            a21 = 0.0f;     a22 = 2*zn/h; a23 = 0.0f;	  a24 = 0.0f;
            a31 = 0.0f;     a32 = 0.0f;     a33 = zf/(zf-zn); a34 = zn*zf/(zn-zf);
            a41 = 0.0f;     a42 = 0.0f;     a43 =1.0f;          a44 = 0.0f;
    J'aimerais bien savoir quelle est la différence entre les deux ?

    voilà c tout pour le moment

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'ai regardé plus précisement le code de Ogre et dans la définition d'une Matrix4 j'ai trouvé cela:
    Pour tout te dire, cette histoire de représentation des matrices a toujours été un grand mystère. La plupart des gens ont ce genre de discours, mais le fait est que dans aucun des moteurs 3D multi-API sur lesquels j'ai travaillé, ça n'a posé le moindre problème. Tu peux d'ailleurs constater que tout fonctionne très bien sans avoir la moindre transposition de matrice pour l'une ou l'autre API.

    Un autre point que j'ai du mal à comprendre c la façon de calculer la matrice de projection:
    [...]
    J'aimerais bien savoir quelle est la différence entre les deux ?
    Aucune, si tu décortiques tu te rendras compte que ce sont les mêmes.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci pour ces précisions, c vrai que cette histoire n'est pas très claire, j'avais quelques doutes lorsque j'ai regardé les sources de Ogre mais puisque cela fonctionne très bien comme ça je ne vais pas chercher plus loin.

    Aucune, si tu décortiques tu te rendras compte que ce sont les mêmes.
    Oups désolé j'aurais du regardé plus attentivement

    Il me reste une dernière question; j'essaye actuellement de rajouter la gestion des lumières (sans les shaders), pour cela j'ai créer les fonctions adéquates dans les 2 renderers D3D et OGL, par contre je n'ai pas le même comportement dans les 2 APIs.

    J'ai par exemple une scene contenant un cube, et je place une lumiere entre la caméra et le cube; sous d3d aucun problème, par contre avec OGL la lumière se place derrière le cube (il faut que j'inverse la coordonée Z sous OGL).

    Y a t'il une différence de comportement entre les lumières ogl et d3d au niveau de la position ?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Y a t'il une différence de comportement entre les lumières ogl et d3d au niveau de la position ?
    A priori non, ce serait bien étonnant.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    J'ai implanté la fonction suivante dans les renderers du 4ième tutorial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void COGLRenderer::EnableLight(TVector3F Direction)
    {
    	glEnable(GL_LIGHTING);
     
    	float lightPos[] = {Direction.x, Direction.y, Direction.z, 1.0};
    	GLfloat diffuseLight[] = { 1.0f, 1.0f, 1.0f, 1.0f };	
     
    	glEnable(GL_LIGHT0);
    	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
    	glLightfv(GL_LIGHT0, GL_POSITION, lightPos);	
    }
    et
    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
     
    void CDX9Renderer::EnableLight(TVector3F Direction)
    {
    	m_Device->SetRenderState(D3DRS_LIGHTING, true);
     
    	D3DLIGHT9 light_0;
    	ZeroMemory( &light_0, sizeof(D3DLIGHT9) );
    	light_0.Type = D3DLIGHT_DIRECTIONAL;
     
    	D3DXVECTOR3 vecDir(Direction.x, Direction.y, Direction.z);
    	D3DXVec3Normalize( (D3DXVECTOR3*)&light_0.Direction, &vecDir ) ;
    	light_0.Diffuse.r = 255.0f;
    	light_0.Diffuse.g = 255.0f;
    	light_0.Diffuse.b = 255.0f;
    	m_Device->SetLight( 0, &light_0 );
     
    	m_Device->LightEnable( 0, TRUE );
    }
    Malheureusement lorsque j'utilise ces fonctions pour éclairer une scène, cela fonctionne plutot bien mais sous opengl la direction est inversée par rapport à direct3d. Est ce que j'aurais fait une erreur quelque part ?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Une lumière directionnelle doit avoir une position ayant sa composante w égale à 0 sous OpenGL, vu qu'il n'existe pas de flag qui différencie lumières point et directionnelles comme sous DirectX.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Une lumière directionnelle doit avoir une position ayant sa composante w égale à 0 sous OpenGL, vu qu'il n'existe pas de flag qui différencie lumières point et directionnelles comme sous DirectX.
    Désolé je le savais, mais j'ai fait tellement de test que j'ai remis la mauvaise valeur
    Mais bon mon problème ne vient pas de là, c la même chose si je met w à 0.

    Par contre je crois que j'ai trouvé le pourquoi; apparement sous opengl le vecteur de direction de la lumière est le vecteur (0,0,0) - le vecteur passé en paramètre pour GL_POSITION c pour cela que j'ai un vecteur direction inversé par rapport à direct3d.

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Par contre je crois que j'ai trouvé le pourquoi; apparement sous opengl le vecteur de direction de la lumière est le vecteur (0,0,0) - le vecteur passé en paramètre pour GL_POSITION c pour cela que j'ai un vecteur direction inversé par rapport à direct3d.
    Oui, vu que tu spécifies une position, la direction sera forcément l'inverse

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Février 2006
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci pour toutes ces réponses !

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

Discussions similaires

  1. matrices D3D (C#.)
    Par Crypt dans le forum Moteurs 3D
    Réponses: 0
    Dernier message: 21/03/2008, 20h06
  2. Type de matrice dans un moteur 3D
    Par trecks dans le forum Moteurs 3D
    Réponses: 4
    Dernier message: 30/11/2007, 18h21
  3. Moteur 2D: Pb de calcul de Matrice de transformation
    Par themadmax dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 29/06/2006, 11h22
  4. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

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