- A maioria dos sistemas de coordenadas de tela / bitmap 2D tem o eixo Y positivo apontando para baixo (com a origem no canto superior esquerdo).
- Isso é contrário à maneira como a maioria das pessoas pensa geometricamente com o eixo Y positivo apontando para cima (com a origem no centro).
Como a maioria dos jogos gerencia os dois sistemas de coordenadas 2D diferentes? Existem dois tipos principais de coordenadas (tela vs. cartesiana), mas pode haver muitos espaços de coordenadas diferentes: espaço de sprite, espaço do mundo, espaço de visualização, espaço da tela, etc.
Fundo:
Originalmente, fiz com que as coordenadas do mundo no meu jogo correspondessem à convenção de coordenadas da tela 2D. Isso tornou muito natural o uso das rotinas de desenho gráfico, mas surgiram problemas sutis ao usar funções trigonométricas como atan2 (). Os resultados da alimentação das coordenadas da tela atan2 () 2D são muito confusos porque atan2 () assume que o eixo y positivo aponta para cima.
Então mudei minhas coordenadas mundiais para seguir o sistema de coordenadas cartesianas clássico (com a origem na parte inferior esquerda da tela). O raciocínio com atan2 () é muito mais direto, mas agora é mais difícil executar outros tipos de raciocínio:
- Se eu clicar na tela aqui, qual sprite está por baixo?
- Onde eu cliquei nesse sprite?
- Se um sprite é desenhado no local errado, o que foi calculado incorretamente? A tela coordena ou o mundo coordena?
Percebo que a conversão da tela para coordenadas cartesianas envolve simplesmente escalar o valor de y em -1 com uma tradução opcional de ambos os valores (x, y). Estou mais interessado nas práticas recomendadas para design de jogos:
- A maioria dos jogos segue a convenção de coordenadas da tela e muda seu pensamento sobre como coisas como atan2 () devem funcionar?
- Quando / como são feitas as conversões do sistema de coordenadas? (Usando matrizes, abstração OOP, etc)
- Os locais dos sprites são armazenados como o centro do sprite ou um dos cantos? A altura / largura do sprite indo na direção "errada" parece ser um problema comum quando os desenho.
Embora minha pergunta seja principalmente sobre jogos 2D, parece que o OpenGL usa um sistema de coordenadas em que o eixo Y aponta para cima. O OpenGL deve eventualmente projetar essas coordenadas 3D em um sistema de coordenadas da tela 2D. Talvez alguma orientação possa ser encontrada no método OpenGL ...
fonte
Eu prefiro usar uma árvore de exibição como no Flash. Vou ter um nó raiz (visão do jogo) que contém um filho para o mundo (nó do mundo) e um no topo para o HUD. Dentro do nó do mundo, estarão os nós dos objetos no mundo do jogo.
Eu simplesmente transformo o nó do mundo. Junto com a tradução (panning da câmera) e a escala proporcional (zoom da câmera), também aplico duas outras transformações:
Em seguida, uso as coordenadas y-up / world no código de desenho do objeto de jogo e as coordenadas y-down / screen no código de desenho HUD, que parecem naturais.
Para responder perguntas como "em que objeto estou clicando", uso métodos de nó de exibição para converter coordenadas entre sistemas de coordenadas (como
globalToLocal
e sua inversa no Flash).A propósito,
atan
realmente não funciona de maneira diferente quando y está baixo, você só precisa pensar em todos os ângulos no sentido horário, e não no sentido anti-horário.fonte
O OpenGL, como o DirectX, possui os eixos X e Z ao longo do plano horizontal e Y voltados para cima.
Eu nunca tive problemas com as coordenadas da tela e acho que a maneira mais fácil seria simplesmente tratá-lo como é: se algo, como o atan2, não gostar, altere os parâmetros que estão sendo alimentados.
Se você estiver usando coordenadas relativas ou locais, como um gráfico de cena, uma função simples como ToGlobalCoords () é boa. De fato, se você quiser aprender mais sobre posicionamento espacial, gráficos de cena e localToGlobal, a extração gratuita da Game Engine Architecture é sobre isso.
Os sprites são desenhados no canto superior esquerdo ou (0,0) na origem. Razões pelas quais são devido à origem superior esquerda da janela.
Parece um pouco tolo alterar o sistema de coordenadas da janela e tornaria coisas como entrada, que desempenham um papel maior na maioria dos jogos do que o trig, significativamente mais difícil. Também o afasta da norma e de qualquer usuário do seu código.
fonte