Udostępnij za pośrednictwem


Stosy macierzy (Direct3D 9)

Nuta

Biblioteka narzędzi D3DX jest przestarzała. Zalecamy użycie DirectXMath wraz z tym nagłówkiem GitHub.

Biblioteka narzędzi D3DX udostępnia interfejs ID3DXMATRIXStack. Dostarcza mechanizm umożliwiający wypychanie macierzy i wypychanie ich do stosu macierzy. Implementowanie stosu macierzy to wydajny sposób śledzenia macierzy podczas przechodzenia przez hierarchię transformacji.

Biblioteka narzędzi D3DX używa stosu macierzy do przechowywania przekształceń jako macierzy. Różne metody interfejsu ID3DXMATRIXStack dotyczą bieżącej macierzy lub macierzy znajdującej się na stosie. Bieżącą macierz można wyczyścić przy użyciu metody ID3DXMATRIXStack::LoadIdentity. Aby jawnie określić określoną macierz do załadowania jako bieżącą macierz przekształcania, użyj metody ID3DXMATRIXStack::LoadMatrix. Następnie można wywołać metodę ID3DXMATRIXStack::MultMatrix lub metodę ID3DXMATRIXStack::MultMatrixLocal, aby pomnożyć bieżącą macierz przez określoną macierz.

Metoda ID3DXMATRIXStack::P op umożliwia powrót do poprzedniej macierzy przekształceń oraz ID3DXMATRIXStack::P ush metoda dodaje macierz przekształceń do stosu.

Poszczególne macierze na stosie macierzy są reprezentowane jako homogeniczne macierze 4x4 zdefiniowane przez bibliotekę narzędzi D3DX D3DXMATRIX struktury.

Biblioteka narzędzi D3DX udostępnia stos macierzy za pośrednictwem obiektu modelu obiektów składników (COM).

Implementowanie hierarchii scen

Stos macierzy upraszcza konstruowanie modeli hierarchicznych, w których skomplikowane obiekty są konstruowane z serii prostszych obiektów.

Scena lub przekształcenie hierarchii jest zwykle reprezentowana przez strukturę danych drzewa. Każdy węzeł w strukturze danych drzewa zawiera macierz. Określona macierz reprezentuje zmianę w układach współrzędnych z węzła nadrzędnego do węzła. Jeśli na przykład modelujesz ludzkie ramię, możesz zaimplementować hierarchię pokazaną na poniższym diagramie.

diagram hierarchii ramienia ludzkiego

W tej hierarchii macierz Body umieszcza treść na świecie. Macierz UpperArm zawiera obrót ramienia, macierz LowerArm zawiera obrót łokcia, a macierz Ręka zawiera obrót nadgarstka. Aby określić, gdzie ręka jest względna wobec świata, mnożysz wszystkie macierze z Ciała w dół przez rękę razem.

Poprzednia hierarchia jest zbyt uproszczona, ponieważ każdy węzeł ma tylko jedno dziecko. Jeśli zaczniesz modelować rękę bardziej szczegółowo, prawdopodobnie dodasz palce i kciuk. Każdą cyfrę można dodać do hierarchii jako elementy podrzędne strony, jak pokazano na poniższym diagramie.

diagram hierarchii ludzkiej ręki

Jeśli przejdziesz przez pełny graf ramienia w pierwszej kolejności — przechodzisz tak daleko w dół o jedną ścieżkę, jak to możliwe przed przejściem do następnej ścieżki — aby narysować scenę, należy wykonać sekwencję renderowania segmentowanego. Aby na przykład renderować rękę i palce, należy zaimplementować następujący wzorzec.

  1. Wypchnij macierz Hand na stos macierzy.
  2. Rysuj rękę.
  3. Wypchnij macierz Thumb do stosu macierzy.
  4. Rysuj kciuk.
  5. Wyłącz macierz Thumb (Kciuk) z stosu.
  6. Wypchnij macierz Finger 1 do stosu macierzy.
  7. Rysuj pierwszy palec.
  8. Wyłącz macierz Finger 1 ze stosu.
  9. Wypchnij macierz Finger 2 do stosu macierzy. Możesz kontynuować w ten sposób, aż wszystkie palce i kciuk zostaną renderowane.

Po zakończeniu renderowania palców zostanie wyświetlona macierz Hand z stosu.

Ten podstawowy proces można wykonać w kodzie, wykonując poniższe przykłady. Gdy napotkasz węzeł podczas pierwszego przeszukiwania struktury danych drzewa, wypchnij macierz na górę stosu macierzy.

MatrixStack->Push();

MatrixStack->MultMatrix(pNode->matrix);

Po zakończeniu pracy z węzłem wyłącz macierz u góry stosu macierzy.

MatrixStack->Pop();

W ten sposób macierz w górnej części stosu zawsze reprezentuje światową transformację bieżącego węzła. Dlatego przed rysunkiem każdego węzła należy ustawić macierz Direct3D.

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

Aby uzyskać więcej informacji na temat określonych metod, które można wykonać na stosie macierzy D3DX, zobacz temat referencyjny ID3DXMATRIX Stack.

potoku wierzchołka