Compartir a través de


Transformaciones (Direct3D 9)

La parte de Direct3D que inserta la geometría a través de la canalización de geometría de función fija es el motor de transformación. Localiza el modelo y el visor en el mundo, proyecta vértices para su visualización en la pantalla y clips vértices a la ventanilla. El motor de transformación también realiza cálculos de iluminación para determinar los componentes difusos y especulares en cada vértice.

La canalización de geometría toma vértices como entrada. El motor de transformación aplica las transformaciones de mundo, vista y proyección a los vértices, recorta el resultado y pasa todo al rasterizador.

En el encabezado de la canalización, los vértices de un modelo se declaran en relación con un sistema de coordenadas local. Se trata de un origen local y una orientación. Esta orientación de las coordenadas se conoce a menudo como espacio del modelo y las coordenadas individuales se denominan coordenadas del modelo.

La primera fase de la canalización de geometría transforma los vértices de un modelo desde su sistema de coordenadas local a un sistema de coordenadas que usan todos los objetos de una escena. El proceso de reorientar los vértices se denomina transformación del mundo. Esta nueva orientación se conoce normalmente como espacio mundial y cada vértice del espacio mundial se declara mediante coordenadas del mundo.

En la siguiente fase, los vértices que describen el mundo 3D están orientados con respecto a una cámara. Es decir, la aplicación elige un punto de vista para la escena y las coordenadas del espacio mundial se reubican y giran alrededor de la vista de la cámara, convirtiendo el espacio del mundo en el espacio de la cámara. Esta es la transformación de vista.

La siguiente fase es la transformación de proyección. En esta parte de la canalización, los objetos normalmente se escalan con respecto a su distancia desde el visor para dar la ilusión de profundidad a una escena; los objetos close se hacen para que aparezcan más grandes que los objetos distantes, etc. Para simplificar, esta documentación hace referencia al espacio en el que existen vértices después de la transformación de proyección como espacio de proyección. Algunos libros de gráficos pueden referirse al espacio de proyección como espacio homogéneo posterior a la perspectiva. No todas las transformaciones de proyección escalan el tamaño de los objetos de una escena. Una proyección como esta se denomina afín o proyección ortogonal.

En la parte final de la canalización, se quitan los vértices que no serán visibles en la pantalla, de modo que el rasterizador no tarde el tiempo en calcular los colores y sombreado de algo que nunca se verá. Este proceso se denomina recorte. Después del recorte, los vértices restantes se escalan según los parámetros de la ventanilla y se convierten en coordenadas de pantalla. Los vértices resultantes, vistos en la pantalla cuando la escena está rasterizada, existen en el espacio de pantalla.

Las transformaciones se usan para convertir la geometría de objeto de un espacio de coordenadas a otro. Direct3D usa matrices para realizar transformaciones 3D. En esta sección se explica cómo crean matrices transformaciones 3D, se describen algunos usos comunes de las transformaciones y se detalla cómo se pueden combinar matrices para generar una sola matriz que abarque varias transformaciones.

Transformaciones de matriz

En las aplicaciones que funcionan con gráficos 3D, puede usar transformaciones geométricas para hacer lo siguiente:

  • Expresar la ubicación de un objeto en relación con otro objeto.
  • Girar y cambiar el tamaño de los objetos.
  • Cambiar las posiciones de visualización, las direcciones y las perspectivas.

Puede transformar cualquier punto (x,y,z) en otro punto (x', y', z') mediante una matriz 4x4, como se muestra en la siguiente ecuación.

ecuación de transformación de cualquier punto en otro punto

Realice las ecuaciones siguientes en (x, y, z) y la matriz para generar el punto (x', y', z').

ecuaciones para el nuevo punto

Las transformaciones más comunes son la traducción, la rotación y el escalado. Puede combinar las matrices que producen estos efectos en una sola matriz para calcular varias transformaciones a la vez. Por ejemplo, puede crear una única matriz para traducir y girar una serie de puntos.

Las matrices se escriben en orden de columna de fila. Una matriz que escala uniformemente los vértices a lo largo de cada eje, conocido como escalado uniforme, se representa mediante la siguiente matriz mediante notación matemática.

ecuación de una matriz para el escalado uniforme

En C++, Direct3D declara matrices como una matriz bidimensional, usando la estructura D3DMATRIX . En el ejemplo siguiente se muestra cómo inicializar una estructura D3DMATRIX para que actúe como una matriz de escalado 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
};

Translate

La siguiente ecuación traduce el punto (x, y, z) a un nuevo punto (x', y', z').

ecuación de una matriz de traducción para un nuevo punto

Puede crear manualmente una matriz de traducción en C++. En el ejemplo siguiente se muestra el código fuente de una función que crea una matriz para traducir 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

Para mayor comodidad, la biblioteca de utilidades D3DX proporciona la función D3DXMatrixTranslation .

Escala

La siguiente ecuación escala el punto (x, y, z) por valores arbitrarios en las direcciones x, y-, y z a un nuevo punto (x', y', z').

ecuación de una matriz de escala para un nuevo punto

Girar

Las transformaciones que se describen aquí son para los sistemas de coordenadas a la izquierda, por lo que pueden ser diferentes de las matrices de transformación que ha visto en otro lugar.

La siguiente ecuación gira el punto (x, y, z) alrededor del eje x, lo que genera un nuevo punto (x', y', z').

ecuación de una matriz de rotación x para un nuevo punto

La siguiente ecuación gira el punto alrededor del eje Y.

ecuación de una matriz de rotación y para un nuevo punto

La siguiente ecuación gira el punto alrededor del eje Z.

ecuación de una matriz de rotación z para un nuevo punto

En estas matrices de ejemplo, la letra griega theta representa el ángulo de rotación, en radianes. Los ángulos se miden en el sentido de las agujas del reloj al mirar a lo largo del eje de rotación hacia el origen.

En una aplicación de C++, use las funciones D3DXMatrixRotationX, D3DXMatrixRotationY y D3DXMatrixRotationZ proporcionadas por la biblioteca de utilidades D3DX para crear matrices de rotación. A continuación se muestra el código de la función 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;
}

Concatenación de matrices

Una ventaja de usar matrices es que puede combinar los efectos de dos o más matrices multiplicandolas. Esto significa que, para girar un modelo y, a continuación, traducirlo a alguna ubicación, no es necesario aplicar dos matrices. En su lugar, se multiplican las matrices de rotación y traducción para generar una matriz compuesta que contiene todos sus efectos. Este proceso, denominado concatenación de matrices, se puede escribir con la ecuación siguiente.

ecuación de concatenación de matrices

En esta ecuación, C es la matriz compuesta que se va a crear y M₁ a Mn son las matrices individuales. En la mayoría de los casos, solo se concatenan dos o tres matrices, pero no hay ningún límite.

Use la función D3DXMatrixMultiply para realizar la multiplicación de matriz.

El orden en que se realiza la multiplicación de la matriz es fundamental. La fórmula anterior refleja la regla de izquierda a derecha de la concatenación de matriz. Es decir, los efectos visibles de las matrices que se usan para crear una matriz compuesta se producen en orden de izquierda a derecha. En el ejemplo siguiente se muestra una matriz de mundo típica. Imagine que está creando la matriz mundial para un saucer volador estéreo. Probablemente querrá girar la salsa voladora alrededor de su centro ( el eje Y del espacio del modelo) y traducirla a alguna otra ubicación de la escena. Para lograr este efecto, primero se crea una matriz de rotación y, a continuación, se multiplica por una matriz de traducción, como se muestra en la siguiente ecuación.

ecuación de giro en función de una matriz de rotación y una matriz de traducción

En esta fórmula, Ry es una matriz para la rotación sobre el eje Y, y Tw es una traducción a alguna posición en las coordenadas del mundo.

El orden en que se multiplican las matrices es importante porque, a diferencia de multiplicar dos valores escalares, la multiplicación de matriz no es conmutativa. Multiplicar las matrices en el orden opuesto tiene el efecto visual de traducir el saucer volador a su posición espacial mundial y, a continuación, girarlo alrededor del origen mundial.

Independientemente del tipo de matriz que cree, recuerde la regla de izquierda a derecha para asegurarse de lograr los efectos esperados.

Introducción