Partilhar via


Transformações (Direct3D 9)

A parte do Direct3D que empurra a geometria através do pipeline de geometria de função fixa é o mecanismo de transformação. Ele localiza o modelo e o visualizador no mundo, projeta vértices para exibição na tela e clipa vértices para o visor. O mecanismo de transformação também realiza cálculos de iluminação para determinar componentes difusos e especulares em cada vértice.

O pipeline de geometria usa 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.

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 de modelo, e coordenadas individuais são chamadas coordenadas de modelo.

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. Esta nova orientação é comumente referida como espaço do mundo, e cada vértice no espaço do mundo é declarado usando coordenadas do mundo.

Na próxima etapa, 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 visão da câmera, transformando o espaço do mundo em espaço da câmera. Esta é a transformação da visão.

A próxima etapa é a transformação da projeção. Nesta parte do pipeline, os objetos são geralmente 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, e assim por diante. 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 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 toda projeção transforma o tamanho de objetos em uma cena. Uma projeção como esta é às vezes chamada de projeção afim ou ortogonal.

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 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. Esta seção explica como matrizes criam transformações 3D, descreve alguns usos comuns para transformações e detalha como você pode combinar matrizes para produzir uma única matriz que engloba várias transformações.

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

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

equação de uma matriz para escala uniforme

Em C++, o Direct3D declara matrizes como uma matriz bidimensional, usando a estrutura D3DMATRIX. O exemplo a seguir mostra como inicializar uma estrutura de D3DMATRIX para atuar como uma matriz de dimensionamento uniforme.

// In this example, s is a variable of type float.

D3DMATRIX scale = {
    s,               0.0f,            0.0f,            0.0f,
    0.0f,            s,               0.0f,            0.0f,
    0.0f,            0.0f,            s,               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').

equação de uma matriz de traduçã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 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

Por conveniência, a biblioteca de utilitários D3DX fornece a funçãoD3DXMatrixTranslation.

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ê já viu em outros lugares.

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

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.

Em um aplicativo C++, use o D3DXMatrixRotationX, D3DXMatrixRotationYe D3DXMatrixRotationZ funções fornecidas pela biblioteca de utilitários D3DX para criar matrizes de rotação. A seguir está o código para a função D3DXMatrixRotationX.

D3DXMATRIX* WINAPI D3DXMatrixRotationX
    ( D3DXMATRIX *pOut, float angle )
{
#if DBG
    if(!pOut)
        return NULL;
#endif

    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 Concatenantes

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.

equação da 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.

Use a função D3DXMatrixMultiply para executar a multiplicação da matriz.

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

equação de spin baseada numa matriz de rotação e numa matriz de translação

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 traduzir o disco voador para sua posição espacial mundial e, em seguida, 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.

Introdução