DirectX Graphics 프로그래밍 가이드 고도의 주제 정점 파이프라인 행렬 스택   [목차열람] [주소복사] [슬롯비우기]
행렬 스택
 
Microsoft DirectX 9.0

행렬 스택


Direct3D extension (D3DX) 유틸리티 라이브러리는,ID3DXMatrixStack 인터페이스를 갖추고 있다. 이 인터페이스는, 행렬을 행렬 스택에 푸쉬 하거나 행렬 스택으로부터 팝 오프 하거나하기 위한 메카니즘을 제공한다. 행렬 스택을 처리 하면, 변환 계층내를 이동할 때에, 행렬을 효율적으로 관리할 수 있다.

D3DX 유틸리티 라이브러리는, 행렬 스택을 사용해 변환을 행렬로서 저장 한다. ID3DXMatrixStack 인터페이스의 다양한 메서드를 사용해, 현재의 행렬 (행렬의 최상부에 있는 행렬)을 조작할 수 있다. 현재의 행렬을 클리어 하려면 ,ID3DXMatrixStack::LoadIdentity 메서드를 사용한다. 특정의 행렬을 현재의 변환 행렬로서 로드하도록(듯이) 명시적으로 지정하려면 ,ID3DXMatrixStack::LoadMatrix 메서드를 사용한다. 그 후 ID3DXMatrixStack::MultMatrix 메서드 또는 ID3DXMatrixStack::MultMatrixLocal 메서드를 호출해, 현재의 행렬을 지정한 행렬로 곱셈할 수가 있다.

ID3DXMatrixStack::Pop 메서드를 사용하면 전의 변환 행렬에 돌아와,ID3DXMatrixStack::Push 메서드를 사용하면 스택에 변환 행렬이 추가된다.

행렬 스택 위에의 각각의 행렬은, D3DX 유틸리티 라이브러리의 D3DXMATRIX 구조체에 의해 정의된 4 × 4 의 동차 행렬로서 표현된다.

D3DX 유틸리티 라이브러리는, 구성 요소 개체 모델 (COM) 개체를 사용한 행렬 스택을 제공하고 있다.

장면(scene)의 계층의 처리

일련의 단순한 개체로부터 복잡한 개체가 구축되는 계층 모델은, 행렬 스택을 사용하는 것으로 간단하게 구축할 수 있게 된다.

장면(scene)나 변환에서는, 계층은 보통 트리 데이터 구조로서 표현된다. 트리 데이터 구조내의 각 노드에는 행렬이 포함된다. 특정의 행렬은, 노드의 부모로부터 노드에의 좌표계의 변화를 나타낸다. 예를 들어, 인간의 팔을 모델링 하고 있는 경우, 다음과 같은 계층을 처리 하는 경우가 있다.

인간의 팔의 모델의 계층

이 계층에서는, Body 행렬이 동체를 월드내에 배치한다. UpperArm 행렬에는 어깨의 회전, LowerArm 행렬에는 팔꿈치의 회전, Hand 행렬에는 손목의 회전이 각각 포함된다. 손이 어디서 월드와 관련할까를 결정하려면 , Body 로부터 Hand 까지의 행렬을 모두 곱셈한다.

전의 계층은, 각 노드에 자식이 1 개씩 밖에 없었기 때문에, 매우 단순했다. 보다 상세하게 손을 모델링 하는 경우는, 손가락을 추가하게 된다. 5 개의 손가락은 모두, Hand 의 자식으로 계층에 추가할 수 있다.

인간의 손의 모델의 계층

팔의 완전한 그래프내를 깊이 우선의 순서 (단일의 패스를 가능한 한 깊게 이동하고 나서 다음의 패스로 옮긴다)로 이동하는 경우는, 분단 된 일련의 렌더링을 실행하게 된다. 예를 들어, 손과 손가락을 렌더링 하는 경우는, 다음의 순서를 실행한다.

  1. Hand 행렬을 행렬 스택에 푸쉬 한다.
  2. 손을 드로잉(Drawing) 한다.
  3. Thumb 행렬을 행렬 스택에 푸쉬 한다.
  4. 엄지를 드로잉(Drawing) 한다.
  5. Thumb 행렬을 스택으로부터 팝 오프 한다.
  6. Finger 1 행렬을 행렬 스택에 푸쉬 한다.
  7. 최초의 손가락을 드로잉(Drawing) 한다.
  8. Finger 1 행렬을 스택으로부터 팝 오프 한다.
  9. Finger 2 행렬을 행렬 스택에 푸쉬 한다. 모든 손가락이 렌더링 될 때까지, 이 순서를 반복한다.

손가락의 렌더링이 끝나면 Hand 행렬을 스택으로부터 팝 오프 한다.

다음의 예를 사용해, 이 기본적인 프로세스를 코드내에서 실행할 수 있다. 트리 데이터 구조의 깊이 우선 검색중에 노드가 발견되면, 행렬을 행렬 스택의 최상부에 푸쉬 한다.

MatrixStack->Push();

MatrixStack->MultMatrix(pNode->matrix);

노드의 조작이 종료하면 행렬을 행렬 스택의 최상부로부터 팝 오프 한다.

MatrixStack->Pop();

즉, 스택의 최상부에 있는 행렬은, 항상 현재의 노드의 월드 변환을 나타낸다. 이 때문에, 각 노드의 드로잉(Drawing)전에, Microsoft® Direct3D® 행렬을 설정할 필요가 있다.

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

D3DX 행렬 스택으로 실행할 수 있는 다양한 메서드에 대한 자세한 것은, 「ID3DXMatrixStack」를 참조할것.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP