Pilas de matrices (Direct3D 9)
Nota
La biblioteca de utilidades D3DX está en desuso. Se recomienda usar DirectXMath en su lugar junto con este encabezado de GitHub.
La biblioteca de utilidades D3DX proporciona la interfaz ID3DXMATRIXStack . Proporciona un mecanismo para permitir que las matrices se inserte y se desactiven de una pila de matrices. La implementación de una pila de matrices es una manera eficaz de realizar un seguimiento de las matrices mientras recorre una jerarquía de transformación.
La biblioteca de utilidades D3DX usa una pila de matrices para almacenar transformaciones como matrices. Los distintos métodos de la interfaz ID3DXMATRIXStack tratan con la matriz actual o la matriz ubicada en la parte superior de la pila. Puede borrar la matriz actual con el método ID3DXMATRIXStack::LoadIdentity . Para especificar explícitamente una matriz determinada que se va a cargar como matriz de transformación actual, use el método ID3DXMATRIXStack::LoadMatrix . A continuación, puede llamar al método ID3DXMATRIXStack::MultMatrix o al método ID3DXMATRIXStack::MultMatrixLocal para multiplicar la matriz actual por la matriz especificada.
El método ID3DXMATRIXStack::P op permite volver a la matriz de transformación anterior y el método ID3DXMATRIXStack::P ush agrega una matriz de transformación a la pila.
Las matrices individuales de la pila de matrices se representan como matrices homogéneas 4x4, definidas por la estructura D3DXMATRIX de la biblioteca de utilidades D3DXMATRIX .
La biblioteca de utilidades D3DX proporciona una pila de matrices a través de un objeto de modelo de objetos componentes (COM).
Implementación de una jerarquía de escena
Una pila de matrices simplifica la construcción de modelos jerárquicos, en los que los objetos complicados se construyen a partir de una serie de objetos más sencillos.
Una escena, o transformación, la jerarquía normalmente se representa mediante una estructura de datos de árbol. Cada nodo de la estructura de datos de árbol contiene una matriz. Una matriz determinada representa el cambio en los sistemas de coordenadas del elemento primario del nodo al nodo. Por ejemplo, si va a modelar un brazo humano, puede implementar la jerarquía que se muestra en el diagrama siguiente.
En esta jerarquía, la matriz Cuerpo coloca el cuerpo en el mundo. La matriz UpperArm contiene la rotación del hombro, la matriz LowerArm contiene la rotación del codo y la matriz Hand contiene el giro de la muñeca. Para determinar dónde está la mano en relación con el mundo, se multiplican todas las matrices del cuerpo a través de la mano juntos.
La jerarquía anterior es demasiado simplista, ya que cada nodo tiene solo un elemento secundario. Si comienza a modelar la mano con más detalle, probablemente agregará los dedos y un pulgar. Cada dígito se puede agregar a la jerarquía como elementos secundarios de Hand, como se muestra en el diagrama siguiente.
Si recorre el gráfico completo del brazo en primer orden en profundidad, cruzando lo más lejos posible una ruta antes de pasar a la siguiente ruta de acceso, para dibujar la escena, realice una secuencia de representación segmentada. Por ejemplo, para representar la mano y los dedos, implemente el siguiente patrón.
- Inserte la matriz Hand en la pila de matrices.
- Dibuje la mano.
- Inserte la matriz Thumb en la pila de matrices.
- Dibuje el pulgar.
- Desactive la matriz Thumb de la pila.
- Inserte la matriz Dedo 1 en la pila de matrices.
- Dibuje el primer dedo.
- Desactive la matriz Dedo 1 de la pila.
- Inserte la matriz Dedo 2 en la pila de matrices. Continúa de esta manera hasta que se representan todos los dedos y el pulgar.
Después de completar la representación de los dedos, se quitaría la matriz Hand de la pila.
Puede seguir este proceso básico en el código con los ejemplos siguientes. Cuando encuentre un nodo durante la búsqueda de la primera profundidad de la estructura de datos de árbol, inserte la matriz en la parte superior de la pila de matrices.
MatrixStack->Push();
MatrixStack->MultMatrix(pNode->matrix);
Cuando haya terminado con un nodo, desactive la matriz de la parte superior de la pila de matrices.
MatrixStack->Pop();
De este modo, la matriz de la parte superior de la pila siempre representa la transformación global del nodo actual. Por lo tanto, antes de dibujar cada nodo, debe establecer la matriz de Direct3D.
pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), *MatrixStack->GetTop());
Para obtener más información sobre los métodos específicos que puede realizar en una pila de matrices D3DX, vea el tema de referencia ID3DXMATRIXStack .
Temas relacionados