Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As transformações matriciais lidam com grande parte da matemática de baixo nível dos gráficos 3D.
A linha de processamento de geometria recebe vértices como entrada. O mecanismo de transformação aplica as transformações de mundo, visão e projeção aos vértices, corta o resultado e passa tudo para o rasterizador.
Transformar e espaço | Descrição |
---|---|
Coordenadas do modelo no espaço do modelo | Na cabeça do gasoduto, os vértices de um modelo são declarados em relação a um sistema de coordenadas local. Esta é uma origem local e uma orientação. Esta orientação de coordenadas é muitas vezes referida como espaço modelo. As coordenadas individuais são chamadas de coordenadas de modelo . |
Mundo transformado em espaço mundial | O primeiro estágio do pipeline de geometria transforma os vértices de um modelo de seu sistema de coordenadas local em um sistema de coordenadas que é usado por todos os objetos em uma cena. O processo de reorientação dos vértices é chamado de transformação do mundo, que converte do espaço modelo para uma nova orientação chamada espaço mundo. Cada vértice no espaço global é declarado usando coordenadas globais. |
Transformação de vista no espaço de visualização (espaço da câmara) | Na próxima etapa, os vértices que descrevem seu mundo 3D são orientados em relação a uma câmera. Ou seja, a sua aplicação escolhe um ponto de vista para a cena, e as coordenadas do espaço do mundo são realocadas e giradas em torno da visão da câmera, transformando o espaço do mundo em espaço de visão |
Projeção transformada em espaço de projeção | A próxima etapa é a transformação de projeção , que converte de espaço de visão para espaço de projeção. Nesta parte do pipeline, os objetos são normalmente escalonados com base na sua distância em relação ao espectador, para criar a ilusão de profundidade numa cena; objetos próximos são feitos para parecer maiores do que objetos distantes. Para simplificar, esta documentação refere-se ao espaço em que os vértices existem após a transformação de projeção como o espaço de projeção. Alguns livros gráficos podem referir-se ao espaço de projeção como espaço homogéneo pós-perspetiva. Nem toda projeção transforma o tamanho de objetos numa cena. Uma projeção como esta é às vezes chamada de projeção afim ou ortogonal. |
Recorte no espaço da tela | Na parte final da tubulação, todos os vértices que não serão visíveis na tela são removidos, para que o rasterizador não tenha tempo para calcular as cores e sombreamento para algo que nunca será visto. Esse processo é chamado de clipping. Após o recorte, os vértices restantes são dimensionados de acordo com os parâmetros do visor e convertidos em coordenadas de tela. Os vértices resultantes, vistos na tela quando a cena é rasterizada, existem em espaço da tela. |
As transformações são usadas para converter a geometria do objeto de um espaço de coordenadas para outro. O Direct3D usa matrizes para executar transformações 3D. As matrizes criam transformações 3D. Você pode combinar matrizes para produzir uma única matriz que engloba várias transformações.
Você pode transformar as coordenadas entre o espaço do modelo, o espaço do mundo e o espaço de visualização.
- World transform - Converte do espaço modelo para o espaço global.
- View transform - Converte do espaço mundial para o espaço de visualização.
- Transformação de Projeção - Converte do espaço de visualização para o espaço de projeção.
Transformações matriciais
Em aplicativos que trabalham com gráficos 3D, você pode usar transformações geométricas para fazer o seguinte:
- Expresse a localização de um objeto em relação a outro objeto.
- Gire e ajuste o tamanho dos objetos.
- Altere as posições, direções e perspetivas de visualização.
Você pode transformar qualquer ponto (x,y,z) em outro ponto (x', y', z') usando uma matriz 4x4, como mostrado na equação a seguir.
Execute as seguintes equações em (x, y, z) e na matriz para produzir o ponto (x', y', z').
As transformações mais comuns são translação, rotação e dimensionamento. Você pode combinar as matrizes que produzem esses efeitos em uma única matriz para calcular várias transformações ao mesmo tempo. Por exemplo, você pode criar uma única matriz para traduzir e girar uma série de pontos.
As matrizes são escritas em ordem de linha-coluna. Uma matriz que escala uniformemente vértices ao longo de cada eixo, conhecida como escala uniforme, é representada pela seguinte matriz usando notação matemática.
Em C++, o Direct3D declara matrizes como uma matriz bidimensional, usando uma estrutura de matriz. O exemplo a seguir mostra como inicializar uma estrutura de D3DMATRIX para atuar como uma matriz de escala uniforme (fator de escala "s").
D3DMATRIX scale = {
5.0f, 0.0f, 0.0f, 0.0f,
0.0f, 5.0f, 0.0f, 0.0f,
0.0f, 0.0f, 5.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
};
Traduzir
A equação seguinte traduz o ponto (x, y, z) para um novo ponto (x', y', z').
Você pode criar manualmente uma matriz de tradução em C++. O exemplo a seguir mostra o código-fonte de uma função que cria uma matriz para traduzir vértices.
D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
D3DXMATRIX ret;
D3DXMatrixIdentity(&ret);
ret(3, 0) = dx;
ret(3, 1) = dy;
ret(3, 2) = dz;
return ret;
} // End of Translate
Escala
A equação a seguir dimensiona o ponto (x, y, z) por valores arbitrários nas direções x-, y-, e z para um novo ponto (x', y', z').
Girar
As transformações descritas aqui são para sistemas de coordenadas levógiros e, portanto, podem ser diferentes das matrizes de transformação que tens visto em outros locais.
A equação a seguir gira o ponto (x, y, z) em torno do eixo x, produzindo um novo ponto (x', y', z').
A equação a seguir gira o ponto em torno do eixo y.
A equação a seguir gira o ponto em torno do eixo z.
Nestas matrizes de exemplo, a letra grega theta representa o ângulo de rotação, em radianos. Os ângulos são medidos no sentido horário quando se olha ao longo do eixo de rotação em direção à origem.
O código a seguir mostra uma função para manipular a rotação sobre o eixo X.
// Inputs are a pointer to a matrix (pOut) and an angle in radians.
float sin, cos;
sincosf(angle, &sin, &cos); // Determine sin and cos of angle
pOut->_11 = 1.0f; pOut->_12 = 0.0f; pOut->_13 = 0.0f; pOut->_14 = 0.0f;
pOut->_21 = 0.0f; pOut->_22 = cos; pOut->_23 = sin; pOut->_24 = 0.0f;
pOut->_31 = 0.0f; pOut->_32 = -sin; pOut->_33 = cos; pOut->_34 = 0.0f;
pOut->_41 = 0.0f; pOut->_42 = 0.0f; pOut->_43 = 0.0f; pOut->_44 = 1.0f;
return pOut;
}
Matrizes de Concatenação
Uma vantagem de usar matrizes é que você pode combinar os efeitos de duas ou mais matrizes multiplicando-as. Isso significa que, para girar um modelo e depois traduzi-lo para algum local, você não precisa aplicar duas matrizes. Em vez disso, você multiplica as matrizes de rotação e translação para produzir uma matriz composta que contém todos os seus efeitos. Este processo, chamado concatenação matricial, pode ser escrito com a seguinte equação.
Nesta equação, C é a matriz composta que está sendo criada, e M₁ a Mn são as matrizes individuais. Na maioria dos casos, apenas duas ou três matrizes são concatenadas, mas não há limite.
A ordem em que a multiplicação da matriz é realizada é crucial. A fórmula anterior reflete a regra da concatenação matricial da esquerda para a direita. Ou seja, os efeitos visíveis das matrizes que você usa para criar uma matriz composta ocorrem na ordem da esquerda para a direita. Uma matriz de mundo típica é mostrada no exemplo a seguir. Imagine que você está criando a matriz mundial para um disco voador estereotipado. Você provavelmente gostaria de girar o disco voador em torno de seu centro - o eixo y do espaço do modelo - e movê-lo para algum outro local em sua cena. Para obter esse efeito, você primeiro cria uma matriz de rotação e, em seguida, multiplica-a por uma matriz de translação, conforme mostrado na equação a seguir.
Nesta fórmula, Ry é uma matriz para rotação sobre o eixo y, e Tw é uma tradução para alguma posição em coordenadas mundiais.
A ordem em que você multiplica as matrizes é importante porque, ao contrário da multiplicação de dois valores escalares, a multiplicação da matriz não é comutativa. Multiplicar as matrizes na ordem oposta tem o efeito visual de mover o disco voador para a sua posição no espaço mundial e depois girá-lo em torno da origem mundial.
Não importa o tipo de matriz que você está criando, lembre-se da regra da esquerda para a direita para garantir que você alcance os efeitos esperados.
Tópicos relacionados