Share via


행렬 스택(Direct3D 9)

참고

D3DX 유틸리티 라이브러리는 더 이상 사용되지 않습니다. 대신 GitHub의 이 헤더와 함께 DirectXMath를 사용하는 것이 좋습니다.

D3DX 유틸리티 라이브러리는 ID3DXMATRIXStack 인터페이스를 제공합니다. 행렬 스택에서 매트릭스를 푸시하고 튀어나온 것을 가능하게 하는 메커니즘을 제공합니다. 행렬 스택을 구현하는 것은 변환 계층 구조를 트래버스하는 동안 행렬을 추적하는 효율적인 방법입니다.

D3DX 유틸리티 라이브러리는 행렬 스택을 사용하여 변환을 행렬로 저장합니다. ID3DXMATRIXStack 인터페이스의 다양한 메서드는 현재 행렬 또는 스택 위에 있는 행렬을 처리합니다. ID3DXMATRIXStack::LoadIdentity 메서드를 사용하여 현재 행렬을 지울 수 있습니다. 현재 변환 행렬로 로드할 특정 행렬을 명시적으로 지정하려면 ID3DXMATRIXStack::LoadMatrix 메서드를 사용합니다. 그런 다음 ID3DXMATRIXStack::MultMatrix 메서드 또는 ID3DXMATRIXStack::MultMatrixLocal 메서드를 호출하여 현재 행렬을 지정된 행렬에 곱할 수 있습니다.

ID3DXMATRIXStack::P op 메서드를 사용하면 이전 변환 행렬로 돌아갈 수 있으며 ID3DXMATRIXStack::P ush 메서드는 스택에 변환 행렬을 추가합니다.

행렬 스택의 개별 행렬은 D3DX 유틸리티 라이브러리 D3DXMATRIX 구조체로 정의된 4x4 동종 행렬로 표시됩니다.

D3DX 유틸리티 라이브러리는 COM(구성 요소 개체 모델) 개체를 통해 행렬 스택을 제공합니다.

장면 계층 구조 구현

행렬 스택은 복잡한 개체가 일련의 간단한 개체에서 생성되는 계층적 모델의 생성을 간소화합니다.

장면 또는 변환 계층 구조는 일반적으로 트리 데이터 구조로 표시됩니다. 트리 데이터 구조의 각 노드에는 행렬이 포함됩니다. 특정 행렬은 노드의 부모에서 노드로의 좌표계 변경을 나타냅니다. 예를 들어 휴먼 암을 모델링하는 경우 다음 다이어그램에 표시된 계층 구조를 구현할 수 있습니다.

휴먼 암의 계층 구조 다이어그램

이 계층 구조에서 본문 행렬은 본문을 세계에 배치합니다. UpperArm 행렬은 어깨 회전을 포함하고, LowerArm 행렬은 팔꿈치의 회전을 포함하고, 손 매트릭스는 손목의 회전을 포함합니다. 손이 세상을 기준으로 하는 위치를 결정하기 위해 몸의 모든 행렬을 손을 통해 함께 곱합니다.

각 노드에는 자식이 하나뿐이므로 이전 계층 구조는 지나치게 단순합니다. 손 모델링을 더 자세히 시작하면 손가락과 엄지손가락을 추가할 수 있습니다. 다음 다이어그램과 같이 각 숫자를 Hand의 자식으로 계층에 추가할 수 있습니다.

인간 손의 계층 구조 다이어그램

다음 경로로 이동하기 전에 가능한 한 경로를 트래버스하는 깊이 우선 순서로 암의 전체 그래프를 트래버스하여 장면을 그리는 경우 분할된 렌더링 시퀀스를 수행합니다. 예를 들어 손과 손가락을 렌더링하려면 다음 패턴을 구현합니다.

  1. 행렬 스택에 손 매트릭스를 푸시합니다.
  2. 손을 그립니다.
  3. Thumb 행렬을 행렬 스택으로 푸시합니다.
  4. 엄지 손가락을 그립니다.
  5. 스택에서 Thumb 행렬을 팝합니다.
  6. 손가락 1 행렬을 행렬 스택으로 푸시합니다.
  7. 첫 번째 손가락을 그립니다.
  8. 스택에서 손가락 1 행렬을 팝합니다.
  9. 손가락 2 행렬을 행렬 스택으로 푸시합니다. 모든 손가락과 엄지 손가락이 렌더링될 때까지 이러한 방식으로 계속됩니다.

손가락 렌더링을 완료한 후에는 손 매트릭스를 스택에서 팝합니다.

다음 예제와 함께 코드에서 이 기본 프로세스를 따를 수 있습니다. 트리 데이터 구조를 깊이 우선 검색하는 동안 노드가 발견되면 행렬을 행렬 스택의 맨 위로 푸시합니다.

MatrixStack->Push();

MatrixStack->MultMatrix(pNode->matrix);

노드를 완료하면 행렬 스택의 맨 위에서 행렬을 팝합니다.

MatrixStack->Pop();

이러한 방식으로 스택 맨 위에 있는 행렬은 항상 현재 노드의 월드 변환을 나타냅니다. 따라서 각 노드를 그리기 전에 Direct3D 행렬을 설정해야 합니다.

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

D3DX 행렬 스택에서 수행할 수 있는 특정 메서드에 대한 자세한 내용은 ID3DXMATRIXStack 참조 항목을 참조하세요.

꼭짓점 파이프라인