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 :

Rotation 2d mais déformation [OpenGL 3.x]


Sujet :

OpenGL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2019
    Messages : 4
    Par défaut Rotation 2d mais déformation
    Bonjour je souhaiterais faire tourner un rectangle 2d à l'aide d'une matrice mais il se déforme (comme vous pouvez le voir ici). On dirait que la largeur se transforme en la hauteur et la hauteur en large plus on va vers les 90°, et les angles ne sont pas droit à 45°.
    J'utilise la matrice ci-dessous. Il y a également dans la matrice dstRct qui représente la largeur/hauteur et scale pour gérer la taille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		(*projMat)[0] = (dstRct.w * scale / WINW)*GetCos(angle);
    		(*projMat)[1] = (dstRct.w * scale / WINW) *GetSin(angle)*-1;
    		(*projMat)[2] = 0;
    		(*projMat)[3] = (dstRct.h * scale / WINH) *GetSin(angle);
    		(*projMat)[4] = (dstRct.h * scale / WINH)*GetCos(angle);
    		(*projMat)[5] = 0;
    		(*projMat)[6] = 0;
    		(*projMat)[7] = 0;
    		(*projMat)[8] = 0;
    Si Quelqu'un pouvait m'aider j'en serais reconnaissant. Merci d'avance.
    edit: je précise que cela fonctionne correctement pour les carrés.

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    D'habitude pour une matrice on fait du 4*4 et pas du 3*3 (enfin techniquement il est plus rapide de faire du 4*4 vu qu'il y'a des instructions SIMD qui manipule 4 mul /4 add)
    Ton problème vient sûrement de : tu n'as pas besoin de faire : (dstRct.w * scale / WINW) et (dstRct.h * scale / WINH).

    L'autre souci est peut être venant de ton affichage, si tu donne directement les coordonnés de OpenGL , ben forcément y'a une déformation vu que la largeur et plus grand que la hauteur.
    Je m'explique :
    Pour une résolution de 640*480 si tu fait 1.0 en X ça te 320 pixel , et 1.0 en Y fait 240 pixel
    Donc forcément si fait une rotation , ben vu qu'elle baserai par ces borne là , y'aura une déformation.

    Si c'est pour de la 2d , techniquement je met des coordonné en pixel (via une conversion ensuite).

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2019
    Messages : 4
    Par défaut
    D'accord merci, mais même sans spécifier de taille ça ne marche pas ça fait juste la même chose sauf que ça prend toute la fenêtre.
    Nom : Sans-titre.png
Affichages : 254
Taille : 725,4 Ko

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 36
    Par défaut
    Il faudrait voir toute la suite d'opérations que tu fais dans le shader, et les matrices impliquées. Mais déjà ta matrice de rotation n'est est pas une, puisqu'elle n'est pas orthogonale, en cause:
    - les (dstRct.w * scale / WINW) et compagnie qui font que chaque colonne n'a pas une norme de 1.
    - la dernière colonne qui est le vecteur nul (remplace la valeur de l'indice 8 par la valeur 1).

  5. #5
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Vu le screen , ça me semble être un sacré bidouillage

    Une matrice de rotation , ne contient pas la taille de ton rectangle.
    Normalement on a une matrice ModelViewProjection (MVP) de 4*4 , ensuite il faut juste multiplier les matrices entre elle.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2019
    Messages : 4
    Par défaut
    Citation Envoyé par Tony310 Voir le message
    Il faudrait voir toute la suite d'opérations que tu fais dans le shader, et les matrices impliquées. Mais déjà ta matrice de rotation n'est est pas une, puisqu'elle n'est pas orthogonale, en cause:
    - les (dstRct.w * scale / WINW) et compagnie qui font que chaque colonne n'a pas une norme de 1.
    - la dernière colonne qui est le vecteur nul (remplace la valeur de l'indice 8 par la valeur 1).
    Je n'utilise qu'une matrice et je fais ça gl_Position = vec4(vertCoords*projMat, 1.0); pour le dstRct.w*scale/WINW je l'ai enlevé et j'ai rajouté 1 dans la dernière case mais ça ne marche toujours pas

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2015
    Messages : 36
    Par défaut
    gl_Position = vec4(vertCoords*projMat, 1.0);
    Ah oui d'accord, donc projMat est directement la matrice mvp (mais en version 3x3 ). Un peu casse gueule de la construire composante par composante à la main (pourquoi n'utilises tu pas glm ou des classes Mat3, Vec3 etc pour te simplifier la vie?).

    Par contre, si tu n'as pas transposé ta matrice lors du Uniform, il faudrait plutôt faire projMat * vertCoords dans le shader (à vue de nez ta matrice mvp est column major order, tout comme la représentation des matrices dans openGL). Essaie voir (en remettant les valeurs données dans ton premier post).

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2019
    Messages : 4
    Par défaut
    Citation Envoyé par Tony310 Voir le message
    Ah oui d'accord, donc projMat est directement la matrice mvp (mais en version 3x3 ). Un peu casse gueule de la construire composante par composante à la main (pourquoi n'utilises tu pas glm ou des classes Mat3, Vec3 etc pour te simplifier la vie?).
    Je ne connais pas vraiment tout ce qui existe mais jusqu'à présent ça marchait bien donc je m'y étais pas penché.
    Citation Envoyé par Tony310 Voir le message
    Par contre, si tu n'as pas transposé ta matrice lors du Uniform, il faudrait plutôt faire projMat * vertCoords dans le shader (à vue de nez ta matrice mvp est column major order, tout comme la représentation des matrices dans openGL). Essaie voir (en remettant les valeurs données dans ton premier post).
    ça donne le même résultat, opengl les lit comme ça [0]*x+[3]*y+[6]*z si je fais projMat*vertCoords sinon il fait [0]*x+[1]*y+[2]*z

    Edit: je viens de trouver complétement par hasard en faisant une gourde, il fallait diviser la hauteur par la largeur de la fenêtre et la largeur par la hauteur de la fenêtre. A mon avis personne ne s'en serait douté...

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

Discussions similaires

  1. [Toutes versions] Rotation d'un simple trait mais sans variation de longueur
    Par bendesarts dans le forum Visio
    Réponses: 0
    Dernier message: 26/04/2014, 17h28
  2. Rotation rectangle => déformation
    Par spin0us dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 25/08/2010, 09h02
  3. Réponses: 1
    Dernier message: 07/09/2009, 22h13
  4. Script rotation ok mais ouverture fenetre non
    Par guillaumeIOB dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 28/12/2007, 23h09
  5. bannière en rotation, mais comment indiquer le lien ?
    Par JAVA Good dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/03/2006, 18h41

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