Formes étirées OpenGL - format d'image
J'ai obtenu mon openGL vue à une taille de (disons..) 800(largeur)x600(hauteur).
Puis j'ai eu un objet 2D de coordonnées:
0.0 , 0.0
0.1 , 0.0
0.1 , 0.1
0.0 , 0.1
cela, comme vous le comprenez, est censé être un carré (basé sur l'analogie).
Mais sur mon openGL vue imprime cette étiré. Maintenant, je comprends pourquoi ce qui se passe. C'est en fait parce que je travaille sur le défaut de la matrice de -1,1.
Et depuis ma résolution de 800x600 n'a pas un rapport d'aspect de 1, ma forme est se tendu.
Maintenant je suis plus intéressé sur la façon de résoudre ce problème. J'ai lu à propos des fonctions comme glFrustum, glOrtho, glViewPort qui se passe sur la matrice de projection et peut répondre à de telles questions. La chose est, je ne suis pas sûr de les utiliser. Ce que j'ai voulons, c'est de rester au-dessus de la coords lors de la prise d'une place et fait apparaître un carré sur mon point de Vue.
Quel est le bon moyen de répondre à cette question?
source d'informationauteur Bisder
Vous devez vous connecter pour publier un commentaire.
Mise à jour: Explication de ce qui se passe
OpenGL est une machine de l'etat et dans le cas d'OpenGL 2.1 et ci-dessous maintient un ensemble de matrices de transformation. Un sommet ↑v première est multiplié avec le modelview matrice pour produire un œil coordonnées de vertex ↑v'qui est utilisé pour l'éclairage des calculs. Puis ↑v' est multiplié par le projection matrice pour atteindre le soi-disant clip de l'espace ↑v"où (le nom l'indique) les opérations de découpage (ou au moins leur résultat est défini). À partir de l'élément de l'espace de la dite Normalisé les Coordonnées de Périphérique (NDC) sont atteintes par le calcul de ↑v#{x,y,z,w} = ↑v{x,y,z,w}/↑v_w
↑v# est défini pour être dans l'intervalle [-1 ... 1], ce qui est mappé à remplir la fenêtre d'affichage sélectionné rect. La fenêtre n'a pas d'influence sur les matrices de transformation! C'est seulement à la transformation de la SDN à la fenêtre coordonnées qu'il définit.
Dans le code ci-dessus, je mis la matrice modelview à l'identité, c'est à dire les sommets aller dans une projection qui ils sont. La projection elle-même est un ortho projection, que les cartes de la valeur de x l'intervalle [-aspect aspect...] → [-1 ... 1] et une valeur y de la gamme [-1 ... 1] → [-1 ... 1] (c'est à dire pas de changement pour y). Si les sommets sont transformés par la fenêtre aspect pour s'insérer dans la NDC à la fenêtre d'affichage plage de valeurs.
Et pourquoi je vous ai dit que OpenGL est une machine à état? Parce que cela signifie que vous pouvez changer les projections et transformations à tout moment. Donc, si vous avez besoin de rendre une mini-carte, ne lutte pas à obtenir placé dans la scène 3D. Il suffit de passer la fenêtre d'affichage et de projection. En général, vous devez définir toutes les rendu de l'état (ce qui signifie que toutes les matrices) dans la fonction de dessin. La fenêtre de gestionnaires d'événements (à l'exception de la redessiner gestionnaire) doit effectuer pas OpenGL opérations à tous.