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 :

pourquoi faire la multiplication coordonnées du point avec matrice de projection


Sujet :

OpenGL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut pourquoi faire la multiplication coordonnées du point avec matrice de projection
    bonjour,
    je suis débutante dans la programmation 3d
    j'ai trouvé quelques information est je voudrais si possible quelqu'un m'expliquer
    1- si un point représenté par vecteur [x,y,z,1]
    pourquoi (ou dans quelle situation ) on multiplié ce vecteur avec une matrice de projection perspective et pourquoi en faire la normalisation ?
    est ce que on faire la normalisation pour trouvé les coordonnée 2d

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 394
    Points : 5 004
    Points
    5 004
    Par défaut
    alors tu as une scène en 3d, et tu dois l'afficher sur un écran en 2d, il faut donc transformer chacun des points de ta scène 3d en 2d.

    c'est là qu'intervient la matrice de projection, elle transforme un point 3d en un point 2d.

    par contre je ne vois pas ce que tu appelles normalisation.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    merci stardeath pour votre attention
    mais j'ai trouvé que la multiplication avec la matrice de projection nous donne (X, Y, Z, W)
    et est ce que la multplication avec la matrice de projection c'est une opération au lieu de faire glperspective () ou gluperspective()?

    est ce que la normalisation nous donne les coordonnée 2 d?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    la normalisation c'est transformer un vecteur par un autre vecteur parallèle mais de longueur 1.0, sous GLSL il y a la fonction normalize().

    en GLSL cette transformation des coordonnées 3D en coordonnées 2D dans l'espace de l'image finale ce fait comme suit :
    gl_Position = ModelViewProjectionMatrix * vec4(VertexPosition, 1.0);

    il n'y a pas de normalisation à ce niveau. Là où il peut y avoir une normalisation (entre autre) c'est au niveau des normales si celles-ci ne sont pas normalisées.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    bon ,
    j'ai trouvé la normalisation ici
    // Convert normalized device coordinates (X/W; Y/W)
    // to window coordinates (u2;v2).
    float u2 = fFrameWidth/2.0f * (1.0f + X/W);
    float v2 = fFrameHeight/2.0f * (1.0f - Y/W);

    fframe : la fenêtre

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par sara123 Voir le message
    et est ce que la multplication avec la matrice de projection c'est une opération au lieu de faire glperspective () ou gluperspective()?
    effectivement si tu utilises gluperspective() cela sous-entend l'utilisation interne de la matrice GL_PROJECTION, ces deux éléments correspondent à l'ancien model d'OpenGL (que tu utilises peut-être encore si tu es sous OpenGL 2.1). En OpenGL 3.X ces éléments sont obsolètes.

    Dans les spécification d'OpenGL 3 il est écrit :
    "OpenGL 3.0 introduces a deprecation model in which certain features may be marked as deprecated. Deprecated features are expected to be completely removed from a future version of OpenGL."
    Une traduction pourrait être:
    " OpenGL 3.0 indroduit un système de dépréciation qui a pour objet de marquer comme obsolète certaines fonctionnalités. Les fonctionnalités obsolètes sont susceptibles d'être totalement suprimées des futures versions d'OpenGL. "

    Ainsi si tu souhaites que ton programme assure la compatibilité ascendante, tu peux le faire même si tu utilises OpenGL 2.1. Il suffit alors (pour faire simple) de ne pas utiliser les fonctions obsolètes.

    gluperspective() est obsolète, tu peux trouver un remplacement pour cette fonction ici :
    http://www.opengl.org/wiki/GluPerspective_code

    La différence entre gluperspective() et glhPerspective() c'est que la première met à jour la matrice interne, tandis-que l'autre te retourne cette matrice et c'est alors à toi de multiplier tes coordonnées par cette matrice. Cette multiplication tu peux la faire au niveau de ton programme, mais généralement c'est au niveau du shader que cela ce fera, c'est pourquoi je donnais la ligne de code GLSL correspondante dans mon précédant message.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 394
    Points : 5 004
    Points
    5 004
    Par défaut
    @adtunum voilà un exemple sur lequel dire que c'est déprécié ne sert pas à grand chose, c'est une débutante.

    @sara123 en fait la division par W c'est nécessaire pour avoir tes points 2d sur l'écran, par contre ce n'est pas une normalisation.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par sara123 Voir le message
    bon ,
    j'ai trouvé la normalisation ici
    // Convert normalized device coordinates (X/W; Y/W)
    // to window coordinates (u2;v2).
    float u2 = fFrameWidth/2.0f * (1.0f + X/W);
    float v2 = fFrameHeight/2.0f * (1.0f - Y/W);

    fframe : la fenêtre
    ha oui, tu faisais donc référence à la quatrième composante des coordonnes 3D le "w"

    En général pour décrire nos objets 3D on se contente de spécifier nos points que par 3 coordonnées (X,Y,Z) mais pour multiplier ces coordonnées avec des matrices de dimensions 4x4 (4 colonnes x 4 lignes) il faut un vecteur de 4 composants, donc pour le dernier composant on ajoute un 1.0.

    Ici dans les formules que tu donnes tu remarqueras que la division par 1.0 peut être ignorée.

    Bon en fait la quatrième composante W peut parfois être utilisée dans certains cas (assez rare) mais pour comprendre cette utilisation il faut être calé en math ce qui n'est pas mon cas.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par stardeath Voir le message
    @adtunum voilà un exemple sur lequel dire que c'est déprécié ne sert pas à grand chose, c'est une débutante.
    Je ne suis pas d'accord avec toi. En effet je te ferais remarquer la question suivante que cette personne à posé :

    Citation Envoyé par sara123 Voir le message
    est ce que la multplication avec la matrice de projection c'est une opération au lieu de faire glperspective () ou gluperspective()?
    en l'occurrence le cas où on fait cette multiplication soit-même plutôt que d'utiliser gluPerspective() c'est dans le cas où on se préoccupe de la compatibilité ascendante et de l'obsolescence.

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @sara123 en fait la division par W c'est nécessaire pour avoir tes points 2d sur l'écran, par contre ce n'est pas une normalisation.
    j'ai compris maintenant
    mais j'ai pas bien compris votre explication Mr.adtunum sur les ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Convert normalized device coordinates (X/W; Y/W)
    // to window coordinates (u2;v2).
    float u2 = fFrameWidth/2.0f * (1.0f + X/W);
    float v2 = fFrameHeight/2.0f * (1.0f - Y/W);

  11. #11
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Points : 1 630
    Points
    1 630
    Par défaut
    les coordonnees windows sont entre [0,width]x[0,height] et les NDC (Normalized Device Coordinates, petite remarque: normalises dans le sens ou w=1 et non pas dans le sens plus connue ou norme(vecteur)=1) sont entre [-1,1]x[-1,1] pour (x,y). Il faut aussi savoir que en coordonnees windows, l'origin (0,0) est en haut a gauche donc l'axe y est descendant alors que dans opengl c'est l'inverse (d'ou le 1.0- y/w).

Discussions similaires

  1. Coordonnées d'un point avec j3D
    Par luffy27 dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 02/03/2010, 14h20
  2. [Débutant] Calculer un angle entre 3 points avec des coordonnées X Y Z
    Par mattparla dans le forum MATLAB
    Réponses: 6
    Dernier message: 28/11/2009, 17h43
  3. Retrouver les coordonnées 3D de 4 points avec contraintes
    Par jobigoud dans le forum Mathématiques
    Réponses: 13
    Dernier message: 22/10/2008, 11h55
  4. Tracer courbe avec coordonnées de points
    Par ddsjm dans le forum MATLAB
    Réponses: 6
    Dernier message: 10/12/2006, 21h02
  5. [D7] MySQL Embedded avec Delphi, pourquoi faire?
    Par raoulmania dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/11/2005, 16h25

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