변형 개요

매트릭스 변환은 수많은 하위 수준의 3D 그래픽 연산을 처리합니다.

기하 도형 파이프라인에서는 꼭짓점을 입력으로 사용합니다. 변환 엔진은 월드, 보기 및 프로젝션 변환을 꼭짓점에 적용하고, 결과를 잘라내고, 모든 항목을 래스터라이저로 전달합니다.

변환 및 공간 설명
모델 공간의 모델 좌표 파이프라인의 맨 위에서 모델의 꼭짓점은 로컬 좌표계를 기준으로 선언됩니다. 이는 로컬 원점 및 방향입니다. 이 좌표의 방향을 보통 모델 공간이라고 합니다. 개별 좌표는 모델 좌표라고 합니다.
월드 공간으로 월드 변환 기하 도형 파이프라인의 첫 번째 단계에서는 모델의 꼭짓점을 해당 로컬 좌표계에서 장면의 모든 개체가 사용하는 좌표계로 변환합니다. 꼭짓점의 원점을 새로 설정하는 과정을 월드 변환이라고 하며 모델 공간에서 월드 공간이라는 새 방향으로 변환합니다. 월드 공간의 각 꼭짓점은 월드 좌표를 사용하여 선언합니다.
보기 공간(카메라 공간)으로 보기 변환 다음 단계에서 3D 월드를 설명하는 꼭짓점의 원점은 카메라를 기준으로 설정됩니다. 즉, 애플리케이션이 장면에 대한 관점을 결정하면 월드 공간 좌표가 카메라 보기 주변에 다시 배치되고 회전하여 월드 공간을 보기 공간(카메라 공간이라고도 함)으로 변환합니다. 이것이 월드 공간에서 보기 공간으로 변환하는 보기 변환입니다.
프로젝션 공간으로 프로젝션 변환 다음 단계는 보기 공간에서 프로젝션 공간으로 변환하는 프로젝션 변환입니다. 파이프라인의 이 부분에서는 장면에 거리감을 주기 위해 일반적으로 뷰어와의 거리에 따라 개체의 크기가 조정됩니다. 다시 말해서 가까이에 있는 개체는 멀리 있는 개체보다 크게 보이게 만듭니다. 편의를 위해 이 문서에서는 프로젝션 변환 이후에 꼭짓점이 존재하는 공간을 프로젝션 공간이라고 부르겠습니다. 일부 그래픽 서적에서는 프로젝션 공간을 관점후 동종 공간이라고 부르기도 합니다. 모든 프로젝션 변환에서 장면의 개체 크기가 조정되는 것은 아닙니다. 이와 같은 프로젝션을 아핀 또는 직교 프로젝션이라고 합니다.
화면 공간에서 클리핑 파이프라인의 마지막 부분에서는 장면에 보이지 않는 꼭짓점이 제거됩니다. 따라서 래스터라이저는 표시되지 않는 항목의 색 및 음영을 계산하는 데 시간을 사용하지 않습니다. 이 프로세스를 클리핑이라고 합니다. 클리핑 후에 나머지 꼭짓점은 뷰포트 매개 변수에 따라 크기가 조정되며 화면 좌표로 변환됩니다. 장면이 래스터화되면 장면에 표시된 결과인 꼭짓점은 장면 공간에 존재하게 됩니다.

 

변환은 개체 기하 도형을 하나의 좌표에서 다른 좌표로 변환하는 데 사용됩니다. Direct3D는 매트릭스를 사용하여 3D 변환을 수행합니다. 매트릭스는 3D 변환을 만듭니다. 매트릭스를 결합하여 여러 변환이 포함된 단일 매트릭스를 만들 수 있습니다.

모델 공간, 월드 공간, 보기 공간 간에 좌표를 변환할 수 있습니다.

  • 월드 변환 - 모델 공간에서 월드 공간으로 변환합니다.
  • 보기 변환 - 월드 공간에서 보기 공간으로 변환합니다.
  • 프로젝션 변환 - 보기 공간에서 프로젝션 공간으로 변환합니다.

매트릭스 변환

3D 그래픽을 사용하는 애플리케이션에서 기하 도형 변환을 사용하여 다음 작업을 수행할 수 있습니다.

  • 다른 개체를 기준으로 개체의 위치를 표현합니다.
  • 개체를 회전하고 크기를 조정합니다.
  • 보는 위치, 방향 및 관점을 변경합니다.

다음 수식과 같이 4x4 매트릭스를 사용하여 한 지점(x, y, z)을 다른 지점(x', y', z')으로 변환할 수 있습니다.

equation of transforming any point into another point

(x, y, z)에 대한 다음 수식과 매트릭스를 수행하여 지점(x', y', z')을 생성합니다.

equations for the new point

가장 일반적인 변환은 좌표 이동, 회전 및 크기 조정입니다. 이러한 효과를 생성하는 매트릭스를 단일 매트릭스로 결합하여 한 번에 여러 변환을 계산할 수 있습니다. 예를 들어 일련의 지점을 좌표 이동하고 회전하는 단일 매트릭스를 만들 수 있습니다.

매트릭스는 행-열 순서로 기록됩니다. 각 축을 따라 꼭짓점의 크기를 동일하게 조정(균등 크기 조정)하는 매트릭스는 수학 표기법을 사용하는 다음 매트릭스로 표시됩니다.

equation of a matrix for uniform scaling

C++에서 Direct3D는 매트릭스 구조를 사용하여 매트릭스를 2차원 배열로 선언합니다. 다음은 균등 크기 조정 매트릭스(배율 인수 "s")의 역할을 수행하도록 D3DMATRIX 구조를 초기화하는 방법을 보여주는 예제입니다.

D3DMATRIX scale = {
    5.0f,            0.0f,            0.0f,            0.0f,
    0.0f,            5.0f,            0.0f,            0.0f,
    0.0f,            0.0f,            5.0f,            0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

변환

다음 수식은 지점(x, y, z)을 새 지점(x', y', z')으로 변환합니다.

equation of a translation matrix for a new point

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

스케일링

다음은 x, y 및 z축 방향으로 임의의 값을 사용하여 지점(x, y, z)을 새 지점(x', y', z')으로 크기 조정하는 수식입니다.

equation of a scale matrix for a new point

회전

여기서 설명하는 변환은 왼손 좌표계를 기준으로 하기 때문에 다른 곳에서 살펴본 변환 매트릭스와 다를 수 있습니다.

다음 수식은 x축을 기준으로 지점(x, y, z)을 회전하여 새로운 지점(x', y', z')을 생성합니다.

equation of an x rotation matrix for a new point

다음 수식은 y축을 기준으로 지점을 회전합니다.

equation of a y rotation matrix for a new point

다음 수식은 z축을 기준으로 지점을 회전합니다.

equation of a z rotation matrix for a new point

이러한 예제 매트릭스에서 그리스 문자 세타는 회전 각도(라디안 단위)를 의미합니다. 원점을 향해 회전 축을 바라보는 경우 각도는 시계 방향으로 측정됩니다.

다음 코드는 X축에 대한 회전을 처리하는 함수를 보여 줍니다.

    // Inputs are a pointer to a matrix (pOut) and an angle in radians.
    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;
}

매트릭스 연결

매트릭스를 사용할 때 얻을 수 있는 장점 중 하나는 두 개 이상의 매트릭스를 곱하여 여러 효과를 결합할 수 있다는 점입니다. 즉, 모델을 회전하고 다른 위치로 좌표 이동하기 위해 두 개의 매트릭스를 적용할 필요가 없습니다. 대신 회전 매트릭스와 좌표 이동 매트릭스를 곱하여 해당 효과를 모두 포함하는 합성 매트릭스를 만들면 됩니다. 매트릭스 연결이라고 하는 이 과정은 다음 수식을 사용하여 작성할 수 있습니다.

equation of matrix concatenation

이 수식에서 C는 새로 생성되는 합성 매트릭스이고, M₁~Mₙ은 개별 매트릭스입니다. 대부분은 매트릭스를 두 개 또는 세 개 정도 연결하지만, 제한이 있는 것은 아닙니다.

매트릭스 곱하기를 수행하는 순서가 매우 중요합니다. 위의 수식은 매트릭스 연결의 왼쪽에서 오른쪽 규칙을 반영하고 있습니다. 즉, 합성 매트릭스를 만드는 데 사용하는 매트릭스의 시각 효과는 왼쪽에서 오른쪽 순서로 발생합니다. 다음은 일반적인 월드 매트릭스를 보여주는 예제입니다. 일반적인 비행접시에 대한 월드 매트릭스를 만든다고 가정해 보겠습니다. 아마도 여러분은 비행접시의 중심인 모델 공간의 y축을 기준으로 비행접시를 회전하고, 장면의 다른 위치로 비행접시를 좌표 이동하려 할 것입니다. 이 효과를 만들려면 다음 수식과 같이 회전 매트릭스를 만든 다음, 좌표 이동 매트릭스를 곱해야 합니다.

equation of spin based on a rotation matrix and a translation matrix

이 수식에서 Ry는 y축 기준 회전에 대한 매트릭스이고 Tw는 월드 좌표의 어떤 위치에 대한 좌표 이동입니다.

두 개의 스칼라 값을 곱할 때와는 달리, 매트릭스 곱하기는 가환성이 없기 때문에 매트릭스를 곱하는 순서가 중요합니다. 매트릭스를 반대 순서로 곱하면 비행접시를 해당 월드 공간 위치로 좌표 이동한 다음, 월드 원점을 기준으로 회전하는 시각 효과가 발생합니다.

어떤 유형의 매트릭스를 만들든, 기대하는 효과를 얻을 수 있도록 왼쪽에서 오른쪽 규칙을 기억하시기 바랍니다.

변환