Compartir a través de


Pilas de matriz (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 extraan de una pila de matriz. La implementación de una pila de matriz 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 del ID3DXMATRIXStack interfaz 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 al 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 biblioteca de utilidades D3DX D3DXMATRIX estructura.

La biblioteca de utilidades D3DX proporciona una pila de matrices a través de un objeto de modelo de objetos de componentes (COM).

Implementación de una jerarquía de escena

Una pila de matriz 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 está modelando un brazo humano, puede implementar la jerarquía que se muestra en el diagrama siguiente.

diagrama de la jerarquía de un brazo humano

En esta jerarquía, la matriz Body coloca el cuerpo en el mundo. La matriz UpperArm contiene el giro del hombro, la matriz LowerArm contiene el giro del codo y la matriz Hand contiene la rotación 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 solo tiene un elemento secundario. Si comienza a modelar la mano con más detalle, probablemente agregará 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.

diagrama de la jerarquía de una mano humana

Si recorre el gráfico completo del brazo en orden de primer nivel en profundidad, pasando por una ruta de acceso lo más posible 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.

  1. Inserte la matriz Hand en la pila de matrices.
  2. Dibuje la mano.
  3. Inserte la matriz Thumb en la pila de matriz.
  4. Dibuje el pulgar.
  5. Desactive la matriz Thumb de la pila.
  6. Inserte la matriz Dedo 1 en la pila de matrices.
  7. Dibuje el primer dedo.
  8. Despeja la matriz del dedo 1 de la pila.
  9. Inserte la matriz Dedo 2 en la pila de matriz. 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 abrirá la matriz Hand fuera de la pila.

Puede seguir este proceso básico en el código con los ejemplos siguientes. Cuando se encuentra un nodo durante la búsqueda en primer lugar de 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 mundial 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 matriz D3DX, consulte el tema de referencia ID3DXMATRIXStack.

de canalización de vértices de