Matrixstapel (Direct3D 9)

Hinweis

Die D3DX-Hilfsprogrammbibliothek ist veraltet. Es wird empfohlen, stattdessen DirectXMath zusammen mit diesem Header von GitHub zu verwenden.

Die D3DX-Hilfsprogrammbibliothek stellt die ID3DXMATRIXStack-Schnittstelle bereit. Es stellt einen Mechanismus bereit, mit dem Matrizen auf einen Matrixstapel geschoben und geknallt werden können. Die Implementierung eines Matrixstapels ist eine effiziente Möglichkeit, Matrizen beim Durchlaufen einer Transformationshierarchie nachzuverfolgen.

Die D3DX-Hilfsbibliothek verwendet einen Matrixstapel, um Transformationen als Matrizen zu speichern. Die verschiedenen Methoden der ID3DXMATRIXStack-Schnittstelle befassen sich mit der aktuellen Matrix oder der Matrix, die sich auf dem Stapel befindet. Sie können die aktuelle Matrix mit der ID3DXMATRIXStack::LoadIdentity-Methode löschen. Verwenden Sie die ID3DXMATRIXStack::LoadMatrix-Methode , um explizit eine bestimmte Matrix anzugeben, die als aktuelle Transformationsmatrix geladen werden soll. 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 fügt dem Stapel eine Transformationsmatrix hinzu.

Die einzelnen Matrizen auf dem Matrixstapel werden als homogene 4x4-Matrizen dargestellt, die von der D3DX-Hilfsbibliothek D3DXMATRIX-Struktur definiert werden.

Die D3DX-Hilfsprogrammbibliothek 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 der Koordinatensysteme vom übergeordneten Knoten zum Knoten dar. Wenn Sie beispielsweise einen menschlichen Arm modellieren, können Sie die Hierarchie implementieren, die im folgenden Diagramm dargestellt ist.

Diagramm der Hierarchie eines menschlichen Arms

In dieser Hierarchie platziert die Body-Matrix den Körper in der Welt. Die UpperArm-Matrix enthält die Drehung der Schulter, die LowerArm-Matrix die Drehung des Ellenbogens und die Handmatrix die Drehung des Handgelenks. Um zu bestimmen, wo die Hand relativ zur Welt ist, multiplizieren Sie alle Matrizen von Körper bis Hand zusammen.

Die vorherige Hierarchie ist zu einfach, da jeder Knoten nur über ein untergeordnetes Element verfügt. 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 von Hand hinzugefügt werden, wie im folgenden Diagramm dargestellt.

Diagramm der Hierarchie einer menschlichen Hand

Wenn Sie das gesamte Diagramm des Arms in der ersten Reihenfolge durchqueren - so weit wie möglich einen Pfad hinunterfahren, bevor Sie zum nächsten Pfad wechseln -, um die Szene zu zeichnen, führen Sie eine Sequenz segmentiertes Rendering durch. Um z. B. die Hand und die Finger zu rendern, implementieren Sie das folgende Muster.

  1. Drücken Sie die Handmatrix auf den Matrixstapel.
  2. Zeichnen Sie die Hand.
  3. Drücken Sie die Daumenmatrix auf den Matrixstapel.
  4. Zeichnen Sie den Daumen.
  5. Fügen Sie die Thumb-Matrix aus dem Stapel auf.
  6. Drücken Sie die Finger 1-Matrix auf den Matrixstapel.
  7. Zeichnen Sie den ersten Finger.
  8. Fügen Sie die Matrix Finger 1 aus dem Stapel.
  9. Drücken Sie die Matrix Finger 2 auf den Matrixstapel. Sie fahren auf diese Weise fort, bis alle Finger und Daumen gerendert sind.

Nachdem Sie das Rendern der Finger abgeschlossen haben, würden Sie die Handmatrix aus dem Stapel klappen.

Sie können diesen grundlegenden Prozess im Code mit den folgenden Beispielen ausführen. Wenn Sie bei der tiefen ersten Suche der Strukturdatenstruktur auf einen Knoten stoßen, pushen Sie die Matrix an den oberen Rand des Matrixstapels.

MatrixStack->Push();

MatrixStack->MultMatrix(pNode->matrix);

Wenn Sie mit einem Knoten fertig sind, füllen Sie die Matrix ganz oben im Matrixstapel auf.

MatrixStack->Pop();

Auf diese Weise stellt die Matrix am oberen Rand des Stapels immer die Welttransformation des aktuellen Knotens dar. Daher sollten Sie vor dem Zeichnen der einzelnen Knoten 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 .

Vertexpipeline