Developers:
- João Lucas de Moraes Barros Cadorniga JoaoLucasMBC
- Eduardo Mendes Vaz EduardoMVaz
This repository is a Linear Algebra based project to perform projections of 3D objects and images to a 2D environment.
Para utilizar o projeto "Pycube Projection", você deve ter o Python instalado em seu computador e seguir os passos:
- Clone o repositório na sua máquina na pasta de sua escolha. Utilize o comando:
git clone https://github.com/JoaoLucasMBC/pycube-projection.git
- Utilizando o terminal / a IDE de sua escolha, crie uma Virtual Env de Python e a ative:
python -m venv env
env/Scripts/Activate.ps1
(Windows)
- Mude para a pasta do "Pycube Projection" e instale as bibliotecas requeridas:
cd ./pycube-projection
pip install -r requirements.txt
- Após a instalação, rode o arquivo main.py pelo terminal para acionar o projeto:
python main.py
A manipulação do cubo pode ser feita a partir de alguns comandos:
-
Q
eT
- Esses dois botões acionam o modo de rotação automática: o cubo gira ao redor de todos os seus eixos, indefinidamente (com incremento de 1 grau por loop).Q
aciona o modo de rotação, eT
o interrompe. Enquanto o cubo está em modo rotação, apenas o comandoMouse Scroll
pode ser utilizado simultaneamente, portanto, para manipular o cubo manualmente, interrompa o modo de rotação. -
W, A, S, D, Z, X
- Esses comandos realizam a rotação manual do cubo.W
eS
os comandos para realizar a rotação do eixo$x$ ,A
eD
os comandos para a rotação do eixo$y$ , eZ
eX
para o eixo$z$ . -
Mouse Scroll
- O scroll do mouse altera a distância focald
do cubo, dando um "zoom in" ou "zoom out" nele. O scroll para cima aumenta d, "zoom in", e o scroll para baixo diminui d, "zoom out". (Um mouse externo e um scroll de notebook são invertidos)
OBS: como as teclas de rotação apenas incrementam o ângulo da matriz de rotação, vale ressaltar, que, por exemplo, caso o usuário rotacione em 180° o cubo no eixo x, a rotação no eixo y estará com os controles invertidos. Ou seja, é necessário prestar atenção ao combinar rotações, pois elas alteram a direção que os eixos apontam.
O modelo matemático do pycube-rotation
é baseado inteiramente em projeções utilizando multiplicações matriciais. Como um cubo possui 3 dimensões, precisamos "achatá-lo", ou seja, projetar todas as coordenadas pygame
).
As projeções são realizadas respeitando um modelo de câmeras pinhole, baseado na presença de um anteparo de coordeanda
O processo de transformação pode ser dividido em algumas etapas.
Para os cálculos, podemos, em um primeiro momento, pensar separadamente: primeiro, projetamos as coordeandas
Esse processo é possível pois, realizando semelhanças entre os triângulos formados nos planos (feito no próximo passo), é possível constatar que as coordeandas de projeção,
Ao formarmos triângulos retângulos conectando os pontos
Substituindo
No entanto, como queremos utilizar multiplicações matriciais aplicadas as coordenadas originais para realizar os cálculos que resultam nas coordenadas de projeção, utilizamos de um artifício matemático: reescrever
Assim, podemos representar a nossa transformação das coordenadas
Agora, realizando o processo para as coordeandas
Dessa maneira, a matriz de transformação no código é sempre calculada da mesma maneira, de acordo com o valor de
Com a capacidade de montar as matrizes de projeção, precisamos imaginar a construção da matriz que representará os vértices do cubo e como ela será transformada antes de realizar o processo.
Primeiro, facilitando o processamento, o cubo é inicialmente construído ao redor da origem
Com essa matriz em mãos, podemos pré-multiplicá-la pela matriz de projeção
No entanto, antes de realizarmos a projeção de 3-d para 2-d, precisamos realizar as rotações no nosso sistema tridimensional. Para isso, geramos matrizes específicas para as rotações ao redor de cada eixo separadamente,
OBS:
Vale ressaltar que cada ângulo é incrementado em 1° por ciclo (na rotação automática). Além disso, apenas podemos realizar diretamente as rotações pois o cubo está centrado estratégicamente na origem, e as matrizes de transformação sempre atuam centradas na origem,
As aplicando na matriz de cubo
Após essa ação, é preciso transladar a coordenada
Agora, podemos realizar nossa projeção utilizando
Com a matriz projetada
Portanto, precisamos dividir todas as linhas da nossa matriz pela última linha (com os valores de
Agora, podemos extrair apenas o que nos interessa, os pares
No entanto, o nosso cubo ainda é muito pequeno para ser observado na tela e está centrado na origem no sistema de coordenadas. Portanto, vamos aplicar uma matriz de expansão 400
e uma matriz de translação
Por fim, para termos as coordenadas de cada ponto, podemos transpor a matriz, de modo que cada linha correspode às coordenadas de um vértice.
OBS: vale ressaltar que é realizada uma validação para evitar glitches. Ao alterar a distância focal
É importante realizar algumas observações sobre a distância focal e o seu funcionamento no modelo matemático.
A distância focal representa a distância entre o pinhole (origem) e o nosso "anteparo", isto é, a coordenada
Dessa maneira, ao calcular a matriz de projeção, sempre calculamos