변환(Direct3D 9)

고정 함수 geometry 파이프라인을 통해 기하 도형을 푸시하는 Direct3D 부분은 변환 엔진입니다. 전 세계에서 모델 및 뷰어를 찾고, 화면에 표시할 꼭짓점을 투영하고, 꼭짓점을 뷰포트에 클립합니다. 또한 변환 엔진은 조명 계산을 수행하여 각 꼭짓점에서 확산 및 반사 구성 요소를 확인합니다.

geometry 파이프라인은 꼭짓점을 입력으로 사용합니다. 변환 엔진은 세계, 뷰 및 프로젝션 변환을 꼭짓점으로 적용하고, 결과를 잘라내고, 모든 것을 래스터라이저에 전달합니다.

파이프라인의 헤드에서 모델의 꼭짓점은 로컬 좌표계를 기준으로 선언됩니다. 이는 로컬 원점 및 방향입니다. 이러한 좌표 방향을 모델 공간이라고도 하며, 개별 좌표를 모델 좌표라고 합니다.

기하 도형 파이프라인의 첫 번째 단계는 모델의 꼭짓점을 로컬 좌표계에서 장면의 모든 개체가 사용하는 좌표계로 변환합니다. 꼭짓점을 다시 지정하는 프로세스를 세계 변환이라고 합니다. 이 새로운 방향을 일반적으로 세계 공간이라고 하며, 세계 공간의 각 꼭짓점은 세계 좌표를 사용하여 선언됩니다.

다음 단계에서는 3D 세계를 설명하는 꼭짓점이 카메라를 중심으로 합니다. 즉, 애플리케이션은 장면에 대한 시점을 선택하고, 세계 공간 좌표는 카메라 뷰를 중심으로 재배치 및 회전되어 세계 공간을 카메라 공간으로 전환합니다. 보기 변환입니다.

다음 단계는 프로젝션 변환입니다. 파이프라인의 이 부분에서 개체는 일반적으로 장면에 깊이의 느낌을 주기 위해 뷰어와의 거리와 관련하여 크기가 조정됩니다. close 개체는 멀리 떨어진 개체보다 크게 표시되도록 만들어집니다. 간단히 하기 위해 이 설명서에서는 프로젝션 변환 후에 꼭짓점이 프로젝션 공간으로 존재하는 공간을 참조합니다. 일부 그래픽 서적에서는 프로젝션 공간을 사후 큐브 뷰 동종 공간이라고 할 수 있습니다. 모든 프로젝션 변환이 장면의 개체 크기를 조정하는 것은 아닙니다. 이와 같은 프로젝션을 아파인 또는 직교 프로젝션이라고도 합니다.

파이프라인의 마지막 부분에서는 화면에 표시되지 않는 모든 꼭짓점이 제거되므로 래스터라이저가 표시되지 않는 색과 음영을 계산하는 데 시간이 걸리지 않습니다. 이 프로세스를 클리핑이라고 합니다. 클리핑 후 나머지 꼭짓점은 뷰포트 매개 변수에 따라 크기가 조정되고 화면 좌표로 변환됩니다. 장면을 래스터화할 때 화면에 보이는 결과 꼭짓점은 화면 공간에 존재합니다.

변환은 개체 기하 도형을 한 좌표 공간에서 다른 좌표 공간으로 변환하는 데 사용됩니다. Direct3D는 행렬을 사용하여 3D 변환을 수행합니다. 이 섹션에서는 행렬이 3D 변환을 만드는 방법을 설명하고, 변환에 대한 몇 가지 일반적인 용도를 설명하고, 행렬을 결합하여 여러 변환을 포함하는 단일 행렬을 생성하는 방법을 자세히 설명합니다.

매트릭스 변환

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
};

Translate

다음 수식은 점(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')을 생성합니다.

새 지점에 대한 x 회전 행렬의 수식

다음 수식은 y축을 중심으로 점을 회전합니다.

새 지점에 대한 y 회전 행렬의 수식

다음 수식은 z축을 중심으로 점을 회전합니다.

새 지점에 대한 z 회전 매트릭스의 수식

이 예제 행렬에서 그리스어 문자 세타 는 회전 각도(라디안)를 의미합니다. 원점 방향으로 회전 축을 따라 보면 시계 방향으로 각도가 측정됩니다.

C++ 애플리케이션에서 D3DXMatrixRotationX, D3DXMatrixRotationY및 D3DX 유틸리티 라이브러리에서 제공하는 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는 생성되는 복합 행렬이고 Mn을 통한 M₁ 개별 행렬입니다. 대부분의 경우 두 개 또는 세 개의 행렬만 결합되지만 제한은 없습니다.

D3DXMatrixMultiply 함수를 사용하여 행렬 곱셈을 수행합니다.

행렬 곱하기가 수행되는 순서가 중요합니다. 앞의 수식은 행렬의 왼쪽에서 오른쪽 규칙을 반영합니다. 즉, 복합 행렬을 만드는 데 사용하는 행렬의 표시 효과는 왼쪽에서 오른쪽 순서로 발생합니다. 일반적인 세계 행렬은 다음 예제에 표시됩니다. Imagine 스테레오티컬 가비지 소스에 대한 세계 행렬을 만들고 있음을 알 수 있습니다. 아마도 모델 공간의 y축인 중심을 중심으로 출발한 후 장면의 다른 위치로 변환하려고 할 것입니다. 이 효과를 수행하려면 먼저 회전 행렬을 만든 다음, 다음 수식과 같이 변환 행렬을 곱합니다.

회전 행렬 및 변환 행렬을 기반으로 하는 스핀 수식

이 수식에서 Ry는 y축에 대한 회전을 위한 행렬이고 Tw는 세계 좌표의 일부 위치로 변환됩니다.

행렬을 곱하는 순서는 두 스칼라 값을 곱하는 것과 달리 행렬 곱하기는 가환성이 아니기 때문에 중요합니다. 행렬을 반대 순서로 곱하면 비행 소스가 세계 공간 위치로 변환된 다음 세계 원점 주위로 회전하는 시각적 효과가 있습니다.

만드는 행렬 유형에 관계없이 왼쪽에서 오른쪽 규칙을 기억하여 예상 효과를 얻을 수 있습니다.

시작