Curso completo de Directx 9.0c Com C\C++
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 01-12
1.12 Compreendendo matrizes e transformações
1.1 Visão geral
A matemática de matrizes, vetores e transformações junto com os
típicos diagramas e notação particular é a parte mais intimidadora
da programação de jogos, entretanto há um caminho alternativo de
assimilá-la: o caminho da experiência direta.
Esse tópico vai estimular a compreensão de matrizes e transformações
através da experiência prática visualizando os efeitos ocasionados
pela mudança de valores dos argumentos das três matrizes principais:
Matriz de projeção:
- g_device->SetTransform( D3DTS_PROJECTION, &g_mtxProj );
Matriz de visualização:
- g_device->SetTransform( D3DTS_VIEW, &g_mtxVisao )
Matriz de espaço mundial:
- g_device->SetTransform( D3DTS_WORLD, &g_mtxMundo );
1.2 Matriz de mundo
Geralmente a rotação, escala e posicionamento dos objetos no mundo 3d
são estocadas em vetores 3d representados pela estrutura D3DXVECTOR3.
Geralmente a matriz, representada pela estrutura D3DXMATRIX vai
conter internamente estes 3 vetores. Portanto a matriz vai ter 9
elementos básicos para manipular rotação, escala e posicionamento das
entidades do mundo 3d. É importante informar que a matriz na realidade
é composta por 16 elementos, com um quarto elemento chamado 'w' que é
utilizado para uniformizar processos matemáticos internos.
Geralmente os vetores de rotação, escala e posicionamento se
apresentam de forma separada e o processo de juntá-los numa só matriz
consiste de uma sequência de multiplicações:
// Preparação da matriz de rotação
D3DXMatrixRotationYawPitchRoll ( &g_mtxRot, g_ymundo_rot, g_xmundo_rot,
g_zmundo_rot);
// Preparação da matriz de escala
D3DXMatrixScaling (&g_mtxEsc, g_xmundo_esc, g_ymundo_esc, g_zmundo_esc);
// Preparação da matriz de posicionamento
D3DXMatrixTranslation (&g_mtxPos, g_xmundo_pos, g_ymundo_pos, g_zmundo_pos);
// Combina rotação, escala e translação
g_mtxMundo = g_mtxRot * g_mtxEsc * g_mtxPos;
// Atualiza a matriz de mundo no dispositivo
g_device->SetTransform( D3DTS_WORLD, &g_mtxMundo );
Esse código reúne os dados de posicionamento, escala e rotação e
insere-os em matrizes temporárias. Na sequência multiplica as 3
matrizes temporárias para produzir a matriz de mundo final com todos
os elementos. Fique atento que a ordem de multiplicação das matrizes
importa e a permutação dessa sequência produz resultados finais
diferentes. Geralmente a ordem mais comum encontrada nos livros de
directx é matriz_final = rotação * escala * translação.
Veja que todo esse processo é amparado por funções do directx e
você não precisa saber exatamente as peripécias matemáticas da
multiplicação de matrizes. É comum manter uma matriz de mundo para
cada objeto 3d contendo seus dados individuais de rotação,
posicionamento e escala.
1.3 Nomeação dos elementos da matriz
O primeiro elemento da matriz é referido como m11 respectivo à
primeira linha e primeira coluna. O último chama-se m33, terceira
linha da terceira coluna. Veja na ilustração abaixo o esquema de
nomeação dos elementos da matriz:
(*) Os elementos foram nomeados para a nossa conveniência. Não é
correto acreditar que o directx utiliza ordem igual de posicionamento
dos elementos na matriz final. Por exemplo, os dados de rotação
também podem apresentar-se numa diagonal ou verticalmente em direta
oposição à nossa ilustração. Veja abaixo uma ilustração parcial da
definição da estrutura D3DXMATRIX do directx:
1.4 Estrutura da aplicação
Essa aplicação não apresenta novidades do directx e utiliza o código
fonte do projeto prj_Triangulo3d como base acrescido de controles do
Windows para alteração individual de cada argumento de configuração
das matrizes principais. A camada de código acrescentada ao projeto
anterior citado focaliza apenas na funcionalidade de ligar e desligar
o acesso aos vetores, matrizes e elementos para permitir a
visualização individual ou combinada do trabalho das matrizes na
movimentação dos elementos e formação da imagem 2d final.
O conhecimento essencial para conseguir usar as matrizes para produzir
efeitos com clareza de causa pode advir da experiência obtida através
dessa aplicação.
Forma de uso
A imagem abaixo ilustra a forma de uso do programa e de como a
experiência visual produzida se corresponde com o código fonte:
Selecione primeiro o eixo e depois o vetor na matriz desejada. Na
sequência pressione ++ ou -- e acompanhe o resultado visual da
configuração gerada na renderização do triângulo.
Produzido por Gameprog: Jair Pereira - Agosto/2014 ©
gameprog.br@gmail.com
http://www.gameprog.com.br