Compartir a través de


Transformaciones (Direct3D 9)

La parte de Direct3D que inserta 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 en 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 de modelos 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 su 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 espaciales del mundo se reubican y giran alrededor de la vista de la cámara, convirtiendo el espacio mundial en espacio de 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 realizan para que aparezcan más grandes que los objetos lejanos, 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 a veces se denomina proyección afín o ortogonal.

En la parte final de la canalización, se quitan los vértices que no estarán visibles en la pantalla, de modo que el rasterizador no tarde el tiempo para 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 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 relativo a otro objeto.
  • Girar y ajustar 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 ecuación siguiente.

ecuación de transformar 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 sola 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 de 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
};

Traducir

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

Escama

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

Rotar

Las transformaciones que se describen aquí son para los sistemas de coordenadas izquierdos, 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, produciendo 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 la D3DXMatrixRotationX, D3DXMatrixRotationYy funciones 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 rotar 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 matriz, se puede escribir con la siguiente ecuación.

ecuación de concatenación de matriz

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

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

El orden en el que se realiza la multiplicación de 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 una salsa de vuelo estereotipada. Probablemente quiera girar la salsa volando alrededor de su centro ( el eje y del espacio del modelo) y traducirlo a 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 basada en 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 coordenadas del mundo.

El orden en el 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 platillo volador a su posición espacial del mundo 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 que logra los efectos esperados.

introducción