Partilhar via


Transformação do Mundo (Direct3D 9)

A discussão sobre a transformação do mundo introduz conceitos básicos e fornece detalhes sobre como configurar uma transformação do mundo.

O que é uma transformação do mundo?

Uma transformação de mundo muda coordenadas do espaço modelo, onde vértices são definidos em relação à origem local de um modelo, para o Espaço Mundial, onde vértices são definidos em relação a uma origem comum a todos os objetos em uma cena. Em essência, a transformação do mundo coloca um modelo no mundo; daí o seu nome. O diagrama a seguir mostra a relação entre o sistema de coordenadas do mundo e o sistema de coordenadas locais de um modelo.

diagrama de como as coordenadas mundiais e as coordenadas locais estão relacionadas

A transformação do mundo pode incluir qualquer combinação de traduções, rotações e escalas.

Configurando uma matriz mundial

Como em qualquer outra transformação, crie a transformação do mundo concatenando uma série de matrizes em uma única matriz que contém a soma total de seus efeitos. No caso mais simples, quando um modelo está na origem mundial e seus eixos de coordenadas locais são orientados da mesma forma que o espaço mundial, a matriz do mundo é a matriz de identidade. Mais comumente, a matriz mundial é uma combinação de uma tradução para o espaço mundial e possivelmente uma ou mais rotações para transformar o modelo conforme necessário.

O exemplo a seguir, de uma classe de modelo 3D fictícia escrita em C++, usa as funções auxiliares incluídas na biblioteca de utilitários D3DX para criar uma matriz mundial que inclui três rotações para orientar um modelo e uma tradução para realocá-lo em relação à sua posição no espaço mundial.

/*
 * For the purposes of this example, the following variables
 * are assumed to be valid and initialized.
 *
 * The m_xPos, m_yPos, m_zPos variables contain the model's
 * location in world coordinates.
 *
 * The m_fPitch, m_fYaw, and m_fRoll variables are floats that 
 * contain the model's orientation in terms of pitch, yaw, and roll
 * angles, in radians.
 */
 
void C3DModel::MakeWorldMatrix( D3DXMATRIX* pMatWorld )
{
    D3DXMATRIX MatTemp;  // Temp matrix for rotations.
    D3DXMATRIX MatRot;   // Final rotation matrix, applied to 
                         // pMatWorld.
 
    // Using the left-to-right order of matrix concatenation,
    // apply the translation to the object's world position
    // before applying the rotations.
    D3DXMatrixTranslation(pMatWorld, m_xPos, m_yPos, m_zPos);
    D3DXMatrixIdentity(&MatRot);

    // Now, apply the orientation variables to the world matrix
    if(m_fPitch || m_fYaw || m_fRoll) {
        // Produce and combine the rotation matrices.
        D3DXMatrixRotationX(&MatTemp, m_fPitch);         // Pitch
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
        D3DXMatrixRotationY(&MatTemp, m_fYaw);           // Yaw
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
        D3DXMatrixRotationZ(&MatTemp, m_fRoll);          // Roll
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
 
        // Apply the rotation matrices to complete the world matrix.
        D3DXMatrixMultiply(pMatWorld, &MatRot, pMatWorld);
    }
}

Depois de preparar a matriz mundial, chame o IDirect3DDevice9::SetTransform método para defini-la, especificando a macro D3DTS_WORLD para o primeiro parâmetro.

Observação

O Direct3D usa as matrizes de mundo e exibição definidas para configurar várias estruturas de dados internas. Cada vez que você define uma nova matriz de mundo ou visão, o sistema recalcula as estruturas internas associadas. Definir essas matrizes com frequência - por exemplo, milhares de vezes por quadro - é computacionalmente demorado. Você pode minimizar o número de cálculos necessários concatenando suas matrizes de mundo e exibição em uma matriz de visão de mundo que você define como a matriz de mundo e, em seguida, definindo a matriz de exibição para a identidade. Mantenha cópias em cache de matrizes de mundo e visualização individuais para que você possa modificar, concatenar e redefinir a matriz mundial conforme necessário. Para maior clareza, nesta documentação os exemplos Direct3D raramente empregam essa otimização.

 

transforma