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

index << >>



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.
index << >>

Produzido por Gameprog: Jair Pereira - Agosto/2014 © gameprog.br@gmail.com http://www.gameprog.com.br