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.
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.
Tópicos relacionados