- La plupart des systèmes de coordonnées 2D écran / bitmap ont l'axe Y positif pointant vers le bas (avec l'origine dans le coin supérieur gauche).
- C'est contraire à la façon dont la plupart des gens pensent géométriquement avec l'axe Y positif pointant vers le haut (avec l'origine au centre).
Comment la plupart des jeux gèrent-ils les deux systèmes de coordonnées 2D différents? Il existe deux principaux types de coordonnées (écran vs cartésien), mais il peut y avoir de nombreux espaces de coordonnées différents: espace sprite, espace monde, espace vue, espace écran, etc ...
Contexte:
À l'origine, j'ai fait correspondre les coordonnées du monde dans mon jeu à la convention des coordonnées d'écran 2D. Cela rendait très naturel l'utilisation des routines de dessin graphique, mais des problèmes subtils se posaient lors de l'utilisation de fonctions trigonométriques comme atan2 (). Les résultats de l'alimentation des coordonnées d'écran 2D de atan2 () sont très déroutants car atan2 () suppose que l'axe y positif pointe vers le haut.
J'ai donc changé mes coordonnées universelles pour suivre le système de coordonnées cartésiennes classique (avec l'origine en bas à gauche de l'écran). Le raisonnement avec atan2 () est beaucoup plus simple, mais maintenant il est plus difficile de faire d'autres types de raisonnement:
- Si je clique sur l'écran ici, quel sprite est en dessous?
- Où ai-je cliqué sur ce sprite?
- Si un sprite est dessiné au mauvais endroit, qu'est-ce qui a été calculé incorrectement? Les coordonnées de l'écran ou les coordonnées du monde?
Je réalise que la conversion de l'écran en coordonnées cartésiennes implique simplement de mettre à l'échelle la valeur y de -1 avec une traduction facultative des deux valeurs (x, y). Je suis plus intéressé par les meilleures pratiques de conception de jeux:
- La plupart des jeux respectent-ils simplement la convention des coordonnées d'écran et changent-ils leur façon de penser comment des choses comme atan2 () devraient fonctionner?
- Quand / comment les conversions de système de coordonnées sont-elles effectuées? (Utilisation de matrices, abstraction OOP, etc.)
- Les emplacements des images-objets sont-ils stockés au centre de l'image-objet ou dans l'un des coins? La hauteur / largeur du sprite allant dans la «mauvaise» direction semble être un problème courant lorsque je les dessine.
Bien que ma question concerne principalement les jeux 2D, il semble qu'OpenGL utilise un système de coordonnées où l'axe Y pointe vers le haut. OpenGL doit éventuellement projeter ces coordonnées 3D sur un système de coordonnées d'écran 2D. Peut-être que quelques conseils pourraient être trouvés dans la méthode d'OpenGL ...
la source
Je préfère utiliser une arborescence d'affichage comme dans Flash. J'aurai un nœud racine (vue de jeu) qui contient un enfant pour le monde (nœud mondial) et un en haut pour le HUD. À l'intérieur du nœud du monde seront les nœuds des objets du monde du jeu.
Je transforme ensuite simplement le nœud mondial. En plus de la traduction (panoramique de la caméra) et de la mise à l'échelle proportionnelle (zoom de la caméra), j'applique également deux autres transformations:
J'utilise ensuite les coordonnées y-up / world dans le code de dessin d'objet de jeu et les coordonnées y-down / screen dans le code de dessin HUD, qui semblent toutes les deux très naturelles.
Pour répondre à des questions telles que "sur quel objet suis-je en train de cliquer", j'utilise des méthodes de noeud d'affichage pour convertir les coordonnées entre les systèmes de coordonnées (comme
globalToLocal
et son inverse dans Flash).Soit dit en passant,
atan
cela ne fonctionne pas vraiment différemment lorsque y est en baisse, il vous suffit de penser que tous les angles vont dans le sens horaire plutôt que dans le sens antihoraire.la source
OpenGL, comme DirectX, a les axes X et Z le long du plan horizontal et Y vers le haut.
Je n'ai jamais eu de problème avec les coordonnées d'écran, et je pense que la façon la plus simple serait simplement de la traiter telle qu'elle est: si quelque chose, comme atan2, ne l'aime pas, alors changez les paramètres en cours d'alimentation.
Si vous utilisez des coordonnées relatives ou locales, comme un graphique de scène, alors une fonction simple telle que ToGlobalCoords () est bonne. En fait, si vous voulez en savoir plus sur le positionnement spatial, les graphiques de scène et localToGlobal, l'extrait gratuit de Game Engine Architecture est à ce sujet.
Les sprites sont dessinés à partir du coin supérieur gauche ou (0,0) de l'origine. Les raisons en sont à cause de l'origine en haut à gauche de la fenêtre.
Il semble un peu idiot de changer le système de coordonnées de la fenêtre et rendrait les choses comme la saisie, qui joue un rôle plus important pour la plupart des jeux que le trig, beaucoup plus difficile. Il vous éloigne également de la norme et des utilisateurs de votre code.
la source