변환(Direct3D 9)
고정 함수 기하 도형 파이프라인을 통해 기하 도형을 푸시하는 Direct3D 부분은 변환 엔진입니다. 전 세계에서 모델 및 뷰어를 찾고, 화면에 표시할 꼭짓점을 프로젝스하고, 뷰포트에 꼭짓점을 클리핑합니다. 또한 변환 엔진은 조명 계산을 수행하여 각 꼭짓점에서 확산 및 반사 구성 요소를 확인합니다.
기하 도형 파이프라인은 꼭짓점을 입력으로 사용합니다. 변환 엔진은 세계, 뷰 및 프로젝션 변환을 꼭짓점으로 적용하고, 결과를 클립하고, 모든 것을 래스터라이저에 전달합니다.
파이프라인의 헤드에서 모델의 꼭짓점은 로컬 좌표계를 기준으로 선언됩니다. 이것은 로컬 원본 및 방향입니다. 이러한 좌표 방향을 모델 공간이라고도 하며 개별 좌표를 모델 좌표라고 합니다.
기하 도형 파이프라인의 첫 번째 단계는 모델의 꼭짓점을 로컬 좌표계에서 장면의 모든 개체에서 사용하는 좌표계로 변환합니다. 꼭짓점을 다시 정렬하는 프로세스를 세계 변환이라고 합니다. 이 새로운 방향은 일반적으로 세계 공간이라고 하며, 세계 공간의 각 꼭짓점은 세계 좌표를 사용하여 선언됩니다.
다음 단계에서는 3D 세계를 설명하는 꼭짓점이 카메라를 중심으로 합니다. 즉, 애플리케이션은 장면에 대한 시점을 선택하고, 세계 공간 좌표는 카메라 보기 주위에 재배치 및 회전되어 세계 공간을 카메라 공간으로 전환합니다. 보기 변환입니다.
다음 단계는 프로젝션 변환입니다. 파이프라인의 이 부분에서 개체는 일반적으로 장면에 깊이의 환상을 제공하기 위해 뷰어와의 거리와 관련하여 크기가 조정됩니다. close 개체는 먼 개체보다 크게 표시되도록 만들어집니다. 간단히 하기 위해 이 설명서는 프로젝션 변환 후 꼭짓점이 프로젝션 공간으로 존재하는 공간을 참조합니다. 일부 그래픽 서적에서는 프로젝션 공간을 포스트 큐브 뷰 동종 공간이라고 할 수 있습니다. 모든 프로젝션 변환이 장면의 개체 크기를 조정하는 것은 아닙니다. 이와 같은 프로젝션을 아핀 또는 직교 프로젝션이라고도 합니다.
파이프라인의 마지막 부분에서는 화면에 표시되지 않는 꼭짓점이 제거되므로 래스터라이저가 표시되지 않는 항목의 색과 음영을 계산하는 데 시간이 걸리지 않습니다. 이 프로세스를 클리핑이라고 합니다. 클리핑 후 나머지 꼭짓점은 뷰포트 매개 변수에 따라 크기가 조정되고 화면 좌표로 변환됩니다. 장면이 래스터화될 때 화면에 표시되는 결과 꼭짓점은 화면 공간에 존재합니다.
변환은 개체 기하 도형을 한 좌표 공간에서 다른 좌표 공간으로 변환하는 데 사용됩니다. Direct3D는 행렬을 사용하여 3D 변환을 수행합니다. 이 섹션에서는 행렬이 3D 변환을 만드는 방법, 변환에 대한 몇 가지 일반적인 용도에 대해 설명하고 행렬을 결합하여 여러 변환을 포함하는 단일 행렬을 생성하는 방법을 자세히 설명합니다.
- World Transform(Direct3D 9) - 모델 공간에서 세계 공간으로 변환
- 뷰 변환(Direct3D 9) - 세계 공간에서 공간 보기로 변환
- 프로젝션 변환(Direct3D 9) - 보기 공간에서 프로젝션 공간으로 변환
행렬 변환
3D 그래픽을 사용하는 애플리케이션에서는 기하학적 변환을 사용하여 다음을 수행할 수 있습니다.
- 다른 개체를 기준으로 개체의 위치를 표시합니다.
- 개체를 회전하고 크기를 조정합니다.
- 보기 위치, 방향 및 큐브 뷰를 변경합니다.
다음 수식과 같이 4x4 행렬을 사용하여 임의의 점(x,y,z)을 다른 점(x', y', z')으로 변환할 수 있습니다.
(x, y, z) 및 행렬에 대해 다음 수식을 수행하여 점(x', y', z')을 생성합니다.
새 점
가장 일반적인 변환은 변환, 회전 및 크기 조정입니다. 이러한 효과를 생성하는 행렬을 단일 행렬로 결합하여 한 번에 여러 변환을 계산할 수 있습니다. 예를 들어 단일 행렬을 작성하여 일련의 점을 변환하고 회전할 수 있습니다.
행렬은 행 열 순서로 작성됩니다. 균일한 크기 조정이라고 하는 각 축을 따라 꼭짓점의 크기를 균등하게 조정하는 행렬은 수학 표기법을 사용하여 다음 행렬로 표시됩니다.
균일한 크기 조정수식
C++에서 Direct3D는 D3DMATRIX 구조를 사용하여 행렬을 2차원 배열로 선언합니다. 다음 예제에서는 균일한 크기 조정 매트릭스로 작동하도록 D3DMATRIX 구조를 초기화하는 방법을 보여줍니다.
// In this example, s is a variable of type float.
D3DMATRIX scale = {
s, 0.0f, 0.0f, 0.0f,
0.0f, s, 0.0f, 0.0f,
0.0f, 0.0f, s, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
};
번역하기
다음 수식은 점(x, y, z)을 새 점(x', y', z')으로 변환합니다.
새 점수식
C++에서 번역 행렬을 수동으로 만들 수 있습니다. 다음 예제에서는 꼭짓점을 번역하는 행렬을 만드는 함수의 소스 코드를 보여 있습니다.
D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
D3DXMATRIX ret;
D3DXMatrixIdentity(&ret);
ret(3, 0) = dx;
ret(3, 1) = dy;
ret(3, 2) = dz;
return ret;
} // End of Translate
편의를 위해 D3DX 유틸리티 라이브러리는 D3DXMatrixTranslation 함수를 제공합니다.
저울
다음 수식은 x, y, z 방향의 임의의 값으로 점(x, y, z)을 새 점(x', y', z')으로 조정합니다.
새 점수식
돌다
여기에 설명된 변환은 왼손 좌표계용이므로 다른 곳에서 본 변환 행렬과 다를 수 있습니다.
다음 수식은 x축을 중심으로 점(x, y, z)을 회전하여 새 점(x', y', z')을 생성합니다.
새 점수식
다음 수식은 y축을 중심으로 점을 회전합니다.
새 점수식
다음 수식은 z축을 중심으로 점을 회전합니다.
새 점수식
이러한 예제 매트릭스에서 그리스 문자 세타는 회전 각도(라디안)를 나타냅니다. 각도는 원점 방향으로 회전 축을 따라 볼 때 시계 방향으로 측정됩니다.
C++ 애플리케이션에서는 D3DX 유틸리티 라이브러리에서 제공하는 D3DXMatrixRotationX, D3DXMatrixRotationY및 D3DXMatrixRotationZ 함수를 사용하여 회전 행렬을 만듭니다. 다음은 D3DXMatrixRotationX 함수에 대한 코드입니다.
D3DXMATRIX* WINAPI D3DXMatrixRotationX
( D3DXMATRIX *pOut, float angle )
{
#if DBG
if(!pOut)
return NULL;
#endif
float sin, cos;
sincosf(angle, &sin, &cos); // Determine sin and cos of angle
pOut->_11 = 1.0f; pOut->_12 = 0.0f; pOut->_13 = 0.0f; pOut->_14 = 0.0f;
pOut->_21 = 0.0f; pOut->_22 = cos; pOut->_23 = sin; pOut->_24 = 0.0f;
pOut->_31 = 0.0f; pOut->_32 = -sin; pOut->_33 = cos; pOut->_34 = 0.0f;
pOut->_41 = 0.0f; pOut->_42 = 0.0f; pOut->_43 = 0.0f; pOut->_44 = 1.0f;
return pOut;
}
행렬 연결
행렬을 사용하는 한 가지 이점은 두 개 이상의 행렬의 효과를 곱하여 결합할 수 있다는 것입니다. 즉, 모델을 회전한 다음 일부 위치로 변환하려면 두 행렬을 적용할 필요가 없습니다. 대신 회전 및 변환 행렬을 곱하여 모든 효과를 포함하는 복합 행렬을 생성합니다. 행렬 연결이라고 하는 이 프로세스는 다음 수식을 사용하여 작성할 수 있습니다.
행렬 연결수식
이 수식에서 C는 생성되는 복합 행렬이고 M-Mn은 개별 행렬입니다. 대부분의 경우 2~3개의 행렬만 연결되지만 제한은 없습니다.
D3DXMatrixMultiply 함수를 사용하여 행렬 곱셈을 수행합니다.
행렬 곱하기가 수행되는 순서는 매우 중요합니다. 앞의 수식은 행렬 연결의 왼쪽에서 오른쪽 규칙을 반영합니다. 즉, 복합 행렬을 만드는 데 사용하는 행렬의 표시 효과는 왼쪽에서 오른쪽 순서로 발생합니다. 일반적인 월드 행렬은 다음 예제에 나와 있습니다. 당신이 고정 관념 비행 접시에 대한 세계 매트릭스를 만들고 있다고 상상해보십시오. 모델 공간의 y축인 중심을 중심으로 비행 접시를 회전시키고 장면의 다른 위치로 변환하려고 할 것입니다. 이 효과를 수행하려면 먼저 회전 행렬을 만든 다음, 다음 수식과 같이 변환 행렬을 곱합니다.
회전 행렬 및 변환 행렬수식
이 수식에서 Ry y축에 대한 회전 행렬이며,T 세계 좌표의 일부 위치로 변환됩니다.
행렬을 곱하는 순서는 두 스칼라 값을 곱하는 것과 달리 행렬 곱하기가 커밋되지 않기 때문에 중요합니다. 행렬을 반대 순서로 곱하면 비행 접시를 세계 공간 위치로 변환한 다음 세계 기원을 중심으로 회전하는 시각적 효과가 있습니다.
만드는 행렬 유형에 관계없이 왼쪽에서 오른쪽 규칙을 기억하여 예상 효과를 얻을 수 있습니다.
관련 항목