Mode 7 - Rotation

A rotação é algo simples para ser aplicado no Mode 7. Para este efeito, iremos utilizar o método de matriz de rotação onde nada mais é que uma formula para realizar a transformação das coordenadas.

Recomendo você dar uma olhada no tutorial iniciar do Mode 7, e no tutorial do Mode 7 de fog, onde foi realizado o ajuste da implementação para se utilizar um array de pixels.


A fórmula para realizar a rotação é a seguinte:

_y = x * cos(angulo) - x * sin(angulo)
_x = x * sin(angulo) + x * cos(angulo)

Após obter as novas coordenadas, devemos também realizar a divisão de Z, conforme a formula padrão do Mode 7, como vimos no primeiro tutorial.

1. Vamos começar a implementar. Primeiramente, iremos alterar nosso código e colocar nosso loop de renderização no início da lógica do mode 7, para repetir a geração dos frames, e podermos ajustar nosso ângulo e visualizar o resultado de forma corrente.



2. Criaremos a variável "angle", que irá obter o ângulo da visão.



3. Já que iremos mexer com rotação e realizar a geração dos valores a partir de ângulos, teremos que usar as funções Seno e Cosseno, e obter seus resultados tendo como parâmetro nosso ângulo. Lembrando que as funções Seno e Cosseno exigem que o parâmetro esteja em Radiano, e não Graus. Para a conversão, utilizei o método "toRadians()" da classe "Math".



4. Apagaremos nossa implementação do Mode 7 para ajustar conforme nossa nova implementação da rotação. Teremos que alterar a rotina pois a geração das novas coordenadas x e y irão ser alteradas conforma a fórmula.


5. Agora vamos ajustar nossa rotina de geração do Mode 7, para obter os novos valores para _x e _y através do resultado da fórmula de rotação. Lembrando que precisamos ao final, dividir o resultado da formula por Z, para obter o efeito de perspectiva. Também precisamos subtrair o valor da largura da tela em nossas variáveis x e y para centralizar o foco de visão.



6. Agora vamos criar o tratamento das restrições, como em nosso primeiro tutorial. Caso o valor seja negativo devemos torna-lo positivo.



7. Também devemos multiplicar pela nossa escala para alteração do tamanho dos pixels. Aproveitando, iremos inserir também o operador mod pelo tamanho da textura, para evitar que os valores de _x e _y ultrapasse os limites do tamanho da textura. (Falei sobre estas validações e atribuições no tutorial principal do Mode 7).



8. Por fim, vamos atribuir nosso array de pixels com o pixel da textura obtido pelas coordenadas _x e _y.



9. Vamos criar uma incrementação para nosso ângulo para podermos ver o efeito de rotação ser renderizado. Também inseri um controle de limite da variável "angle" para não ultrapassar o valor 360, já que este é o grau "mínimo" e "máximo" de Graus possíveis.



OK! Finalizados mais uma implementação em nosso Mode 7! O resultado deve ser algo como:



Caso você queria obter o código fonte, acesse meu repositório do GitHub.
https://github.com/vinibiavatti1/mode7

Comentários

  1. Bem interessante esse tutorial. Gostaria de saber se terá um sobre a projeção de entidades ou muros neste tutorial de mode 7.

    ResponderExcluir
    Respostas
    1. Ainda pretendo criar um projeto de RayCasting + Mode 7 sobrepostos. Assim, o mode 7 seria utilizado para a criação do floor e ceiling, e o RayCasting para os muros. Mas para frente, posso publicar algo com entidades como sprites em movimento e etc...
      Obrigado pelo feedback!! ;D

      Excluir
  2. É eu e o Vinícius nesse Brasil tentando entender o 3D.

    Vamos partir logo para o RayTrace, tenho muitos links interessantes p/ compartilhar.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Mode 7

RayCasting