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)나 변환에서는, 계층은 보통 트리 데이터 구조로서 표현된다. 트리 데이터 구조내의 각 노드에는 행렬이 포함된다. 특정의 행렬은, 노드의 부모로부터 노드에의 좌표계의 변화를 나타낸다. 예를 들어, 인간의 팔을 모델링 하고 있는 경우, 다음과 같은 계층을 처리 하는 경우가 있다.
이 계층에서는, Body 행렬이 동체를 월드내에 배치한다. UpperArm 행렬에는 어깨의 회전, LowerArm 행렬에는 팔꿈치의 회전, Hand 행렬에는 손목의 회전이 각각 포함된다. 손이 어디서 월드와 관련할까를 결정하려면 , Body 로부터 Hand 까지의 행렬을 모두 곱셈한다.
전의 계층은, 각 노드에 자식이 1 개씩 밖에 없었기 때문에, 매우 단순했다. 보다 상세하게 손을 모델링 하는 경우는, 손가락을 추가하게 된다. 5 개의 손가락은 모두, Hand 의 자식으로 계층에 추가할 수 있다.
팔의 완전한 그래프내를 깊이 우선의 순서 (단일의 패스를 가능한 한 깊게 이동하고 나서 다음의 패스로 옮긴다)로 이동하는 경우는, 분단 된 일련의 렌더링을 실행하게 된다. 예를 들어, 손과 손가락을 렌더링 하는 경우는, 다음의 순서를 실행한다.
손가락의 렌더링이 끝나면 Hand 행렬을 스택으로부터 팝 오프 한다.
다음의 예를 사용해, 이 기본적인 프로세스를 코드내에서 실행할 수 있다. 트리 데이터 구조의 깊이 우선 검색중에 노드가 발견되면, 행렬을 행렬 스택의 최상부에 푸쉬 한다.
MatrixStack->Push(); MatrixStack->MultMatrix(pNode->matrix);
노드의 조작이 종료하면 행렬을 행렬 스택의 최상부로부터 팝 오프 한다.
MatrixStack->Pop();
즉, 스택의 최상부에 있는 행렬은, 항상 현재의 노드의 월드 변환을 나타낸다. 이 때문에, 각 노드의 드로잉(Drawing)전에, Microsoft® Direct3D® 행렬을 설정할 필요가 있다.
pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), *MatrixStack->GetTop());
D3DX 행렬 스택으로 실행할 수 있는 다양한 메서드에 대한 자세한 것은, 「ID3DXMatrixStack」를 참조할것.