Transformación del mundo (Direct3D 9)
La explicación de la transformación mundial presenta conceptos básicos y proporciona detalles sobre cómo configurar una transformación mundial.
¿Qué es una transformación mundial?
Una transformación del mundo cambia las coordenadas del espacio del modelo, donde los vértices se definen en relación con el origen local de un modelo, al espacio mundial, donde los vértices se definen en relación con un origen común a todos los objetos de una escena. En esencia, el mundo transforma un modelo en el mundo; por lo tanto, su nombre. En el diagrama siguiente se muestra la relación entre el sistema de coordenadas del mundo y el sistema de coordenadas local de un modelo.
La transformación mundial puede incluir cualquier combinación de traducciones, rotaciones y escalas.
Configuración de una matriz mundial
Al igual que con cualquier otra transformación, cree la transformación del mundo mediante la concatenación de una serie de matrices en una sola matriz que contenga la suma total de sus efectos. En el caso más sencillo, cuando un modelo está en el origen mundial y sus ejes de coordenadas locales están orientados al mismo que el espacio mundial, la matriz mundial es la matriz de identidad. Normalmente, la matriz mundial es una combinación de una traducción al espacio mundial y, posiblemente, una o varias rotaciones para convertir el modelo según sea necesario.
En el ejemplo siguiente, de una clase de modelo 3D ficticia escrita en C++, se usan las funciones auxiliares incluidas en la biblioteca de utilidades D3DX para crear una matriz mundial que incluya tres rotaciones para orientar un modelo y una traducción para reubicarla en relación con su posición en el espacio 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);
}
}
Después de preparar la matriz del mundo, llame al método IDirect3DDevice9::SetTransform para establecerlo, especificando la macro D3DTS_WORLD para el primer parámetro.
Nota
Direct3D usa las matrices de mundo y vista que se establecen para configurar varias estructuras de datos internas. Cada vez que se establece una nueva matriz de mundo o vista, el sistema vuelve a calcular las estructuras internas asociadas. Establecer estas matrices con frecuencia, por ejemplo, miles de veces por fotograma consume mucho tiempo. Puede minimizar el número de cálculos necesarios mediante la concatenación de las matrices de mundo y vista en una matriz de vista global establecida como matriz de mundo y, a continuación, estableciendo la matriz de vista en la identidad. Mantenga copias almacenadas en caché de matrices individuales de mundo y vista para que pueda modificar, concatenar y restablecer la matriz mundial según sea necesario. Para mayor claridad, en esta documentación, los ejemplos de Direct3D rara vez emplean esta optimización.
Temas relacionados