Compartilhar via


Visão geral da transformação

As transformações de matriz lidam com grande parte da matemática de baixo nível dos gráficos 3D.

O pipeline de geometria usa vértices como entrada. O mecanismo de transformação aplica as transformações de mundo, visualização e projeção aos vértices, recorta o resultado e passa tudo para o rasterizador.

Transformar e espaço Descrição
Coordenadas do modelo no espaço do modelo No início do pipeline, 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. Essa orientação de coordenadas é frequentemente chamada de espaço do modelo. As coordenadas individuais são chamadas de coordenadas do modelo.
Mundo se transforma 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 se converte do espaço do modelo para uma nova orientação chamada espaço do mundo. Cada vértice no espaço do mundo é declarado usando coordenadas do mundo.
A visualização se transforma em espaço de visualização (espaço da câmera) No próximo estágio, os vértices que descrevem seu mundo 3D são orientados em relação a uma câmera. Ou seja, seu aplicativo escolhe um ponto de vista para a cena e as coordenadas do espaço mundial são realocadas e giradas em torno da exibição da câmera, transformando o espaço do mundo em espaço de exibição (também conhecido como espaço da câmera). Esta é a transformação View, que converte do espaço do mundo para o espaço de visualização.
Transformação de projeção em espaço de projeção O próximo estágio é a transformação de projeção, que converte do espaço de exibição para o espaço de projeção. Nesta parte do pipeline, os objetos geralmente são dimensionados em relação à sua distância do espectador, a fim de dar a ilusão de profundidade a uma cena; Objetos próximos são feitos para parecer maiores do que objetos distantes. Para simplificar, esta documentação refere-se ao espaço no qual os vértices existem após a transformação da projeção como espaço de projeção. Alguns livros gráficos podem se referir ao espaço de projeção como espaço homogêneo pós-perspectiva. Nem todas as transformações de projeção dimensionam o tamanho dos objetos em uma cena. Uma projeção como essa às vezes é chamada de projeção afim ou ortogonal.
Recorte no espaço da tela Na parte final do pipeline, todos os vértices que não serão visíveis na tela são removidos, para que o rasterizador não perca tempo calculando as cores e o sombreamento de algo que nunca será visto. Esse processo é chamado de recorte. Após o recorte, os vértices restantes são dimensionados de acordo com os parâmetros da viewport e convertidos em coordenadas de tela. Os vértices resultantes, vistos na tela quando a cena é rasterizada, existem no 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 coordenadas entre o espaço do modelo, o espaço do mundo e o espaço da vista.

  • Transformação do mundo - Converte do espaço do modelo para o espaço do mundo.
  • Transformação de exibição - Converte do espaço do mundo para o espaço de exibição.
  • Transformação de projeção - Converte de espaço de exibição em espaço de projeção.

Transformações de matriz

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 dimensione objetos.
  • Altere as posições, direções e perspectivas de visualização.

Você pode transformar qualquer ponto (x,y,z) em outro ponto (x', y', z') usando uma matriz 4x4, conforme mostrado na equação a seguir.

Equação de transformar qualquer ponto em outro ponto

Execute as seguintes equações em (x, y, z) e na matriz para produzir o ponto (x', y', z').

Equações para o novo ponto

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 de uma só vez. Por exemplo, você pode criar uma única matriz para transladar e girar uma série de pontos.

As matrizes são escritas em ordem de linha e coluna. Uma matriz que dimensiona uniformemente os vértices ao longo de cada eixo, conhecida como escala uniforme, é representada pela seguinte matriz usando notação matemática.

Equação de uma matriz para escala uniforme

Em C++, o Direct3D declara matrizes como uma matriz bidimensional, usando um struct de matriz. O exemplo a seguir mostra como inicializar uma estrutura 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 a seguir traduz o ponto (x, y, z) para um novo ponto (x', y', z').

Equação de uma matriz de translação para um novo ponto

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 converter 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').

Equação de uma matriz de escala para um novo ponto

Girar

As transformações descritas aqui são para sistemas de coordenadas canhotos e, portanto, podem ser diferentes das matrizes de transformação que você viu em outro lugar.

A equação a seguir gira o ponto (x, y, z) em torno do eixo x, produzindo um novo ponto (x', y', z').

Equação de uma matriz de rotação X para um novo ponto

A equação a seguir gira o ponto em torno do eixo y.

Equação de uma matriz de rotação Y para um novo ponto

A equação a seguir gira o ponto em torno do eixo z.

Equação de uma matriz de rotação Z para um novo ponto

Nessas matrizes de exemplo, a letra grega theta representa o ângulo de rotação, em radianos. Os ângulos são medidos no sentido horário ao olhar 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 em torno do 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;
}

Concatenação de matrizes

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 convertê-lo em 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. Esse processo, chamado de concatenação matricial, pode ser escrito com a seguinte equação.

Equação de concatenação matricial

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 esquerda para a direita da concatenação matricial. 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 do mundo 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 traduzi-lo para algum outro local em sua cena. Para obter esse efeito, primeiro crie uma matriz de rotação e, em seguida, multiplique-a por uma matriz de translação, conforme mostrado na equação a seguir.

equação de spin baseada em uma matriz de rotação e uma matriz de translação

Nesta fórmula, Ry é uma matriz para rotação em torno do eixo y e Tw é uma translação para alguma posição nas coordenadas do mundo.

A ordem em que você multiplica as matrizes é importante porque, ao contrário da multiplicação de dois valores escalares, a multiplicação de matrizes não é comutativa. Multiplicar as matrizes na ordem oposta tem o efeito visual de traduzir o disco voador para sua posição no espaço mundial e, em seguida, girá-lo em torno da origem do mundo.

Não importa que tipo de matriz você esteja criando, lembre-se da regra da esquerda para a direita para garantir que você alcance os efeitos esperados.

Transformações