Introducción a las transformaciones
Las transformaciones de matriz controlan muchas de las matemáticas de bajo nivel de gráficos 3D.
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.
Transformación y espacio | Descripción |
---|---|
Coordenadas del modelo en el espacio del modelo | 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 coordenadas se conoce a menudo como espacio de modelos. Las coordenadas individuales se denominan coordenadas del modelo. |
Transformación del mundo en el espacio mundial | 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 Mundo, que convierte del espacio del modelo a una nueva orientación denominada espacio mundial. Cada vértice del espacio mundial se declara mediante coordenadas del mundo. |
Transformación de la vista en el espacio de vista (espacio de cámara) | 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, lo que convierte el espacio del mundo en un espacio de vista (también conocido como espacio de cámara). Esta es la transformación Vista, que convierte del espacio del mundo al espacio de vista. |
Transformación de proyección en espacio de proyección | La siguiente fase es la transformación Proyección, que convierte del espacio de vista al espacio 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. 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. |
Recorte en el espacio de pantalla | 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. Las matrices crean transformaciones 3D. Puede combinar matrices para generar una sola matriz que abarque varias transformaciones.
Puede transformar las coordenadas entre el espacio del modelo, el espacio mundial y el espacio de vista.
- Transformación del mundo: convierte el espacio del modelo en el espacio mundial.
- Transformación de vista: convierte del espacio del mundo al espacio de vista.
- Transformación de proyección : convierte del espacio de vista al espacio de proyección.
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.
Realice las ecuaciones siguientes en (x, y, z) y la matriz para generar el punto (x', y', z').
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.
En C++, Direct3D declara matrices como una matriz bidimensional, usando una estructura de matriz. En el ejemplo siguiente se muestra cómo inicializar una estructura de D3DMATRIX para que actúe como una matriz de escalado uniforme (factor de escala "s").
D3DMATRIX scale = {
5.0f, 0.0f, 0.0f, 0.0f,
0.0f, 5.0f, 0.0f, 0.0f,
0.0f, 0.0f, 5.0f, 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').
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
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').
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').
La siguiente ecuación gira el punto alrededor del eje Y.
La siguiente ecuación gira el punto alrededor del eje Z.
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 el código siguiente se muestra una función para controlar el giro del eje X.
// Inputs are a pointer to a matrix (pOut) and an angle in radians.
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.
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.
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.
En esta fórmula, Ry es una matriz para el giro 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.
Temas relacionados