Compartilhar via


Pilhas de matriz (Direct3D 9)

Observação

A biblioteca do utilitário D3DX foi preterida. Recomendamos que você use o DirectXMath junto com esse cabeçalho do GitHub.

A biblioteca de utilitários D3DX fornece a interface ID3DXMATRIXStack . Ele fornece um mecanismo para permitir que matrizes sejam empurradas e exibidas de uma pilha de matriz. Implementar uma pilha de matriz é uma maneira eficiente de acompanhar matrizes ao percorrer uma hierarquia de transformação.

A biblioteca de utilitários D3DX usa uma pilha de matriz para armazenar transformações como matrizes. Os vários métodos da interface ID3DXMATRIXStack lidam com a matriz atual ou com a matriz localizada sobre a pilha. Você pode limpar a matriz atual com o método ID3DXMATRIXStack::LoadIdentity . Para especificar explicitamente uma determinada matriz a ser carregada como a matriz de transformação atual, use o método ID3DXMATRIXStack::LoadMatrix . Em seguida, você pode chamar o método ID3DXMATRIXStack::MultMatrix ou o método ID3DXMATRIXStack::MultMatrixLocal para multiplicar a matriz atual pela matriz especificada.

O método ID3DXMATRIXStack::P op permite que você retorne à matriz de transformação anterior e o método ID3DXMATRIXStack::P ush adiciona uma matriz de transformação à pilha.

As matrizes individuais na pilha de matriz são representadas como matrizes homogêneas 4x4, definidas pela estrutura D3DXMATRIX da biblioteca de utilitários D3DX.

A biblioteca de utilitários D3DX fornece uma pilha de matriz por meio de um objeto COM (modelo de objeto de componente).

Implementando uma hierarquia de cena

Uma pilha de matriz simplifica a construção de modelos hierárquicos, nos quais objetos complicados são construídos a partir de uma série de objetos mais simples.

Uma cena, ou transformação, a hierarquia geralmente é representada por uma estrutura de dados de árvore. Cada nó na estrutura de dados de árvore contém uma matriz. Uma matriz específica representa a alteração nos sistemas de coordenadas do pai do nó para o nó. Por exemplo, se você estiver modelando um braço humano, poderá implementar a hierarquia mostrada no diagrama a seguir.

diagrama da hierarquia de um braço humano

Nessa hierarquia, a matriz Corpo coloca o corpo no mundo. A matriz UpperArm contém a rotação do ombro, a matriz LowerArm contém a rotação do cotovelo e a matriz hand contém a rotação do pulso. Para determinar onde a mão é relativa ao mundo, multiplique todas as matrizes de Corpo para baixo até Mão juntas.

A hierarquia anterior é excessivamente simplista, porque cada nó tem apenas um filho. Se você começar a modelar a mão com mais detalhes, provavelmente adicionará dedos e um polegar. Cada dígito pode ser adicionado à hierarquia como filhos de Hand, conforme mostrado no diagrama a seguir.

diagrama da hierarquia de uma mão humana

Se você percorrer o grafo completo do braço em ordem de profundidade- percorrendo o mais longe possível um caminho antes de passar para o próximo caminho - para desenhar a cena, você executará uma sequência de renderização segmentada. Por exemplo, para renderizar a mão e os dedos, implemente o padrão a seguir.

  1. Efetue push da matriz hand para a pilha de matriz.
  2. Desenhe a mão.
  3. Efetue push da matriz thumb para a pilha de matriz.
  4. Desenhe o polegar.
  5. Coloque a matriz thumb fora da pilha.
  6. Efetue push da matriz finger 1 para a pilha de matriz.
  7. Desenhe o primeiro dedo.
  8. Coloque a matriz finger 1 fora da pilha.
  9. Efetue push da matriz Finger 2 para a pilha de matriz. Você continuará dessa maneira até que todos os dedos e polegar sejam renderizados.

Depois de concluir a renderização dos dedos, você tirará a matriz hand da pilha.

Você pode seguir esse processo básico no código com os exemplos a seguir. Quando você encontrar um nó durante a pesquisa em profundidade da estrutura de dados da árvore, envie a matriz por push para a parte superior da pilha de matriz.

MatrixStack->Push();

MatrixStack->MultMatrix(pNode->matrix);

Quando terminar de usar um nó, coloque a matriz na parte superior da pilha de matriz.

MatrixStack->Pop();

Dessa forma, a matriz na parte superior da pilha sempre representa a transformação de mundo do nó atual. Portanto, antes de desenhar cada nó, você deve definir a matriz Direct3D.

pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), *MatrixStack->GetTop());

Para obter mais informações sobre os métodos específicos que você pode executar em uma pilha de matriz D3DX, consulte o tópico de referência ID3DXMATRIXStack .

Pipeline de vértice