Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Nota
A biblioteca do utilitário D3DX foi preterida. Recomendamos que você use DirectXMath, juntamente com esse cabeçalho de do GitHub.
A biblioteca de utilitários D3DX fornece a interface deID3DXMATRIXStack. Ele fornece um mecanismo para permitir que as matrizes sejam enviadas e exibidas de uma pilha de matriz. Implementar uma pilha de matriz é uma maneira eficiente de acompanhar matrizes ao atravessar 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 a matriz localizada na parte superior da pilha. Você pode limpar a matriz atual com o métodoID3DXMATRIXStack::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 matrizes são representadas como matrizes homogêneas 4x4, definidas pela biblioteca de utilitários D3DX D3DXMATRIX estrutura.
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 hierarquia de cena ou transformação geralmente é representada por uma estrutura de dados de árvore. Cada nó na estrutura de dados da á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 Body 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 de mão contém a rotação do pulso. Para determinar onde a mão é relativa ao mundo, você multiplica todas as matrizes de Corpo para baixo até a 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 da Mão, 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 matrizes.
- Desenhe a mão.
- Efetue push da matriz thumb para a pilha de matrizes.
- 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.
- Pop the Finger 1 matrix off the stack.
- Efetue push da matriz finger 2 para a pilha de matriz. Você continuará dessa maneira até que todos os dedos e polegares 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ê encontra um nó durante a pesquisa detalhada da estrutura de dados da árvore, efetue push da matriz 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 mundial 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ênciaID3DXMATRIXStack.
Tópicos relacionados