Pedro Antônio Silva e Gustavo Lindenberg Pacheco
https://github.com/gustavolp1/cube-rotato
git clone git@github.com:gustavolp1/cube-rotato.git
(Entre no diretório do repositório)
pip install -r "requirements.txt"
python cube-rotato.py
Para inicializar o cubo, apenas rode o arquivo "cube-rotato.py" na sua IDE de preferência. Uma vez com o programa aberto, você pode usar os seguintes comandos no teclado:
W/S
- Gira o cubo no eixo X, em sentidos opostos dependendo do botão;
A/D
- Gira o cubo no eixo Y, em sentidos opostos dependendo do botão;
Q/E
- Gira o cubo no eixo Z, em sentidos opostos dependendo do botão;
I/O
- Aumentam e diminuem a distância focal, respectivamente;
Roda do mouse
- Aumenta ou diminui a distância focal;
Espaço
- Aumenta o ângulo do cubo em todos os eixos simultaneamente enquanto é apertado.
Antes de começarmos a elaborar equações, precisamos antes definir como repesentaremos os pontos do nosso cubo, além de definir quais alterações serão necessárias para representá-lo em 2D e realizar rotações.
Primeiro definimos um cubo de dimensões arbitrárias nos eixos x
, y
e z
, além de uma dimensão adicional, w
representada por uma linha de 1
s.
Nosso objetivo será criar uma matriz generalizada T
que faz todas as transformações necessárias nos pontos ao realizarmos uma multiplicação matricial. Isso será feito a seguir.
Este será o formato dos pontos:
- A dimensão
w
é usada somente para cálculos. Ela não representa uma coordenada em nosso plano. Seu uso é feito da seguinte forma:
A matriz T
que será obtida até o final multiplicará com cada ponto.
- Rotação:
O primeiro componente de nossa matriz T
será o componente de rotação, constituido de três matrizes que representam uma rotação de x
, y
e z
.
Todas foram previamente adaptadas para rotacionar vetores de três dimensões e comportar uma dimensão a mais, que guarda uma variável de ajuste comumente usada para representação de objetos tridimensionais (mais detalhes na explicação da matriz T
).
O ângulo
Por fim, as multiplicamos entre si para obtermos uma única matriz de rotação para todas as dimensões envolvidas:
- Translação em Z (Profundidade):
O segundo componente será uma matriz comum de translação em Z, que definirá a distância aparente do cubo em relação à tela do computador, visto que Z será nosso eixo de profundidade:
Com Dz representando o deslocamento no eixo z por iteração do código/comando. Este componente estará multiplicando a matriz de Rotação diretamente, visto que altera a visualização 3D emulada dos pontos.
- Projeção:
A matriz de projeção será a responsável por projetar nossos pontos tridimensionais em duas dimensões representando uma transformação de 3D para 2D. Para criar uma matriz como essa, precisamos antes entender como e onde essa transformação já ocorre.
O exemplo que utilizaremos para identificar essa matriz será o de um "pin-hole" um mecanismo/técnica de projeção utilizada na criação de imagens de cameras, telas de cinema, etc...
A base do funcionamento de um pin-hole se dá de forma trigonométrica, significando que inicialmente usaremos equações de formato padrão.
- Neste gráfico, representamos o pin-hole pela origem.
- Estamos levando em conta duas dimensões do objeto (
$X_0,Y_0$ ) e uma no anteparo (linha em$X_p$ ) - Por conta disso podemos usar trigonometria simples para obter formulas.
-
$d$ representa a distância entre anteparo e origem com$\theta$ sendo o angulo usado no calculo da semelhança de triângulos.
Com isso, obtemos as seguintes fórmulas para nosso sistema/matriz:
Por semelhança de triângulos temos que:
Elaborando mais essa fórmula, para isolar
Como queremos passar esses calculos para uma matriz, precisamos colocar essa função em um formato com apenas somas ou multiplicações simples - atribuimos o valor W para esse fim, trocando a divisão por ele.
Assim, a formula que usaremos será esta:
Como consequência dessa troca por
Com essa elaboração feita e sabendo que
Podemos então gerar uma matriz com base nessas três funções, com todos os pontos recebendo coordendas homogenêas para podermos realizar o cálculo de W:
Para transferir para 3D, primeiro vamos trabalhar esse mesmo cálculo em 2D para os eixos
Note que
Com isso em mente, basta colocar o cálculo de
Assim obtivemos a matrix de projeção 3D para 2D que funciona para n pontos no plano 3D.
- Traslação em x e y:
Depois de aplicada a projeção para o plano 2D, ou seja, a tela, basta trasladar nosso cubo para uma posição onde ele possa ser visualizado melhor, através de uma matriz de traslação comum redimensionada para 3 dimensões e com uma dimensão extra em padrão identidade.
- Matriz T:
Com todas as matrizes anteriores, obtemos uma matriz de transformação T
quando as multiplicamos na ordem correta. Ou seja:
Que rotaciona, distância/aproxima e translada nosso cubo de uma vez!