Comment transformer le monde 2D en coordonnées écran OpenGL
Je travaille actuellement sur la mise en œuvre d'un OpenGL alimenté rendu dans un moteur de jeu 2D.
Parce que l'OpenGL écran de l'espace de coordonnées est [-1,1], je suis un peu confus quant à la façon dont il devrait être interfacé avec un générique, Cartésien 2D système de coordonnées monde.
Disons que le viewport dans mon monde [-500,-500] [1200, 1200], [0, 0] est l'origine du monde. Dois-je seulement besoin de traduire et vers le bas l'échelle de coordonnées entre -1 et 1? Ou est-il une autre forme de transformation qui doit être effectuée?
Comment calculez-vous où à dessiner des objets sur l'écran qui ont des positions définies dans votre propre système de coordonnées?
J'aimerais avoir une explication avec et sans glOrtho (donc on peut utiliser de l'axe Z aussi bien pour des effets de perspective).
source d'informationauteur bgroenks
Vous devez vous connecter pour publier un commentaire.
D'abord, OpenGL utilise plusieurs systèmes de coordonnées, donc il n'y a pas de "la OpenGL système de coordonnées". Ce que vous faites allusion à normaliser les coordonnées de périphérique (Centre), où les trois coordonnées sont dans l'intervalle [-1, 1]. Les différents systèmes de coordonnées et leurs noms sont expliquées icidans la section "9.011 Comment sont coordonnées transformées? Quels sont les différents espaces de coordonnées?". 1)
Deuxièmement, pour éviter toute confusion, dans OpenGL, le terme "viewport" désigne la partie de la fenêtre que vous vous êtes rendu, et c'est dans la fenêtre de coordonnées. Dans votre question vous avez utilisé pour décrire la partie (l,r,t,b)=(-500, -500, 1200, 1200) de votre monde que vous voulez le rendre, qui est dans les coordonnées du monde.
Vous demandé comment "calculer où dessiner des objets sur l'écran". Ce que vous devez faire est de définir une transformation (une matrice de 4x4) que les cartes d'un système de coordonnées à un autre. Votre monde 2D est donnée dans les coordonnées du monde, si vous avez besoin de définir une matrice qui transforme les coordonnées du monde en Sncd, c'est à dire une matrice de projection. Dans vos shaders il vous suffit alors de multiplier vos sommets avec cette matrice de projection, et vous obtenez Sncd.
glm::ortho
/glOrtho
calcule une telle matrice de projection. Comme pour la projection de perspective, il n'est pas clair ce que vous voulez faire, mais vous devriez expérimenter avec laperspective
etlookat
fonctions dans les glm.Pour être clair, vous définissez les sommets quel que soit le système de coordonnées que vous voulez (ce qui est appelé le système de coordonnées monde), et il suffit de dessiner ces sommets. Votre vertex shader est d'appliquer la transformation que vous avez défini.
Notez également que vous avez spécifié un carré, et généralement ce n'est pas ce que vous voulez. Surveille et la plupart des fenêtres ne sont pas carrés, donc si vous avez une carte qui place sur un typique de la fenêtre d'affichage, vous obtiendrez une vision déformée de votre monde. Vous avez besoin de prendre en compte le rapport d'aspect (largeur:hauteur) de la fenêtre d'affichage. J'ai essayé d'expliquer que ici.
1) Comme une note de côté, la FAQ est assez ancien, et fait référence à d'anciennes versions d'OpenGL. De nos jours, les programmeurs sont encouragés à gérer à la fois le modèle-vue et les matrices de projection d'eux-mêmes, car vous avez besoin dans vos shaders. Je recommande fortement glmc'est d'en-tête uniquement donc très facile à intégrer, et a une belle syntaxe que les miroirs GLSL.
Utilisation glOrtho sur la matrice de projection, puis tirer normalement. Pour votre exemple, Im deviner que vous voulez glOrtho(0, 1000, 0, 3000, -1, 1) cela vous donne une fenêtre d'affichage 1000 unités de largeur et de 3000 unités en hauteur
Place de votre scène en quel que soit le système de coordonnées que vous voulez. Je recommande d'utiliser glm (http://glm.g-truc.net/) pour initialiser les matrices et d'effectuer des opérations mathématiques, etc. Donc, vous avez probablement un graphe de scène moteur, vous permet de gérer tous les objets dans votre 2D/3D du monde. Il suffit de configurer la vue et la projection correcte dans les glm. En fait, vous ne devriez pas avoir besoin de tout le pipeline graphique détails de mise en œuvre - alors il pourrait être une mauvaise décision dans votre moteur de jeu.