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.
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.
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.
- Efetue push da matriz hand para a pilha de matriz.
- Desenhe a mão.
- Efetue push da matriz thumb para a pilha de matriz.
- Desenhe o polegar.
- Coloque a matriz thumb fora da pilha.
- Efetue push da matriz finger 1 para a pilha de matriz.
- Desenhe o primeiro dedo.
- Coloque a matriz finger 1 fora da pilha.
- 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 .
Tópicos relacionados