Matrixstapel (Direct3D 9)
Anmerkung
Die D3DX-Hilfsprogrammbibliothek ist veraltet. Es wird empfohlen, stattdessen DirectXMath- zusammen mit diesem Header aus GitHub-zu verwenden.
Die D3DX-Hilfsbibliothek stellt die ID3DXMATRIXStack Schnittstelle bereit. Es stellt einen Mechanismus bereit, mit dem Matrizen auf einen Matrixstapel verschoben und abgehängt werden können. Das Implementieren eines Matrixstapels ist eine effiziente Möglichkeit zum Nachverfolgen von Matrizen beim Durchlaufen einer Transformationshierarchie.
Die D3DX-Hilfsbibliothek verwendet einen Matrixstapel, um Transformationen als Matrizen zu speichern. Die verschiedenen Methoden des ID3DXMATRIXStack Schnittstelle behandeln die aktuelle Matrix oder die Matrix, die sich über dem Stapel befindet. Sie können die aktuelle Matrix mit der ID3DXMATRIXStack::LoadIdentity-Methode löschen. Um explizit eine bestimmte Matrix anzugeben, die als aktuelle Transformationsmatrix geladen werden soll, verwenden Sie die ID3DXMATRIXStack::LoadMatrix-Methode. Anschließend können Sie entweder die ID3DXMATRIXStack::MultMatrix Methode oder die ID3DXMATRIXStack::MultMatrixLocal Methode aufrufen, um die aktuelle Matrix mit der angegebenen Matrix zu multiplizieren.
Mit der ID3DXMATRIXStack::P op--Methode können Sie zur vorherigen Transformationsmatrix zurückkehren und die ID3DXMATRIXStack::P ush-Methode dem Stapel eine Transformationsmatrix hinzufügen.
Die einzelnen Matrizen auf dem Matrixstapel werden als 4x4 homogene Matrizen dargestellt, die durch die D3DX-Hilfsbibliothek D3DXMATRIX Struktur definiert werden.
Die D3DX-Hilfsbibliothek stellt einen Matrixstapel über ein COM-Objekt (Component Object Model) bereit.
Implementieren einer Szenenhierarchie
Ein Matrixstapel vereinfacht die Konstruktion hierarchischer Modelle, bei denen komplizierte Objekte aus einer Reihe einfacherer Objekte erstellt werden.
Eine Szene oder Transformationshierarchie wird in der Regel durch eine Strukturdatenstruktur dargestellt. Jeder Knoten in der Strukturdatenstruktur enthält eine Matrix. Eine bestimmte Matrix stellt die Änderung von Koordinatensystemen vom übergeordneten Knoten zum Knoten dar. Wenn Sie beispielsweise einen menschlichen Arm modellieren, können Sie die Hierarchie implementieren, die im folgenden Diagramm dargestellt wird.
In dieser Hierarchie platziert die Body-Matrix den Textkörper in der Welt. Die UpperArm-Matrix enthält die Drehung der Schulter, die LowerArm-Matrix enthält die Drehung des Ellenbogens, und die Handmatrix enthält die Drehung des Handgelenks. Um zu bestimmen, wo die Hand relativ zur Welt ist, multiplizieren Sie alle Matrizen von Body down durch Hand zusammen.
Die vorherige Hierarchie ist übermäßig einfach, da jeder Knoten nur ein untergeordnetes Element aufweist. Wenn Sie beginnen, die Hand ausführlicher zu modellieren, fügen Sie wahrscheinlich Finger und einen Daumen hinzu. Jede Ziffer kann der Hierarchie als untergeordnete Elemente der Hand hinzugefügt werden, wie im folgenden Diagramm dargestellt.
Wenn Sie das vollständige Diagramm des Armes in der tiefen ersten Reihenfolge durchlaufen – sie durchlaufen so weit nach unten wie möglich, bevor Sie zum nächsten Pfad wechseln - um die Szene zu zeichnen, führen Sie eine Sequenz des segmentierten Renderings durch. Um beispielsweise die Hand und die Finger zu rendern, implementieren Sie das folgende Muster.
- Drücken Sie die Handmatrix auf den Matrixstapel.
- Zeichnen Sie die Hand.
- Drücken Sie die Minimatrix auf den Matrixstapel.
- Zeichnen Sie den Daumen.
- Füllen Sie die Minimatrix aus dem Stapel.
- Drücken Sie die Finger 1-Matrix auf den Matrixstapel.
- Zeichnen Sie den ersten Finger.
- Pop the Finger 1 matrix off the stack.
- Drücken Sie die Finger 2-Matrix auf den Matrixstapel. Sie fahren auf diese Weise fort, bis alle Finger und Daumen gerendert werden.
Nachdem Sie das Rendern der Finger abgeschlossen haben, würden Sie die Handmatrix aus dem Stapel ausfüllen.
Sie können diesen grundlegenden Prozess im Code mit den folgenden Beispielen befolgen. Wenn Sie während der tiefen ersten Suche der Struktur der Struktur auf einen Knoten stoßen, verschieben Sie die Matrix an den Anfang des Matrixstapels.
MatrixStack->Push();
MatrixStack->MultMatrix(pNode->matrix);
Wenn Sie mit einem Knoten fertig sind, füllen Sie die Matrix am oberen Rand des Matrixstapels aus.
MatrixStack->Pop();
Auf diese Weise stellt die Matrix oben im Stapel immer die Welttransformation des aktuellen Knotens dar. Daher sollten Sie vor dem Zeichnen jedes Knotens die Direct3D-Matrix festlegen.
pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), *MatrixStack->GetTop());
Weitere Informationen zu den spezifischen Methoden, die Sie auf einem D3DX-Matrixstapel ausführen können, finden Sie im Referenzthema ID3DXMATRIXStack.
Verwandte Themen