월드 변환(Direct3D 9)

세계 변환에 대한 논의는 기본 개념을 소개하고 세계 변환을 설정하는 방법에 대한 세부 정보를 제공합니다.

월드 트랜스포메이션이란?

월드 변환은 모델의 로컬 원점을 기준으로 꼭짓점이 정의된 모델 공간에서 장면의 모든 개체에 공통된 원점을 기준으로 꼭짓점이 정의되는 World Space로 좌표를 변경합니다. 이름에서 알 수 있듯이 기본적으로 월드 변환은 모델을 월드에 배치합니다. 다음 다이어그램은 월드 좌표계와 모델의 로컬 좌표계 간의 관계를 보여 줍니다.

월드 좌표와 로컬 좌표가 어떻게 관련되는지에 대한 다이어그램

월드 변환에는 좌표 이동, 회전 및 크기 조정이 포함될 수 있습니다.

월드 매트릭스 설정

다른 변환과 마찬가지로 일련의 매트릭스를 연결하여 각 매트릭스의 모든 효과가 포함된 단일 매트릭스를 만들 수 있습니다. 가장 간단한 사례에서 모델이 월드 원점에 있고 해당 로컬 좌표축이 월드 공간과 동일한 방향이면 월드 매트릭스는 ID 매트릭스입니다. 보다 일반적으로 월드 매트릭스는 공간으로의 좌표 이동과 모델을 필요한 만큼 회전하는 하나 이상의 회전의 조합입니다.

다음 예제에서는 C++로 작성된 가상의 3D 모델 클래스에서 D3DX 유틸리티 라이브러리에 포함된 도우미 함수를 사용하여 모델을 방향을 지정하는 세 개의 회전과 세계 공간에서의 위치를 기준으로 재배치하는 변환을 포함하는 월드 매트릭스를 만듭니다.

/*
 * For the purposes of this example, the following variables
 * are assumed to be valid and initialized.
 *
 * The m_xPos, m_yPos, m_zPos variables contain the model's
 * location in world coordinates.
 *
 * The m_fPitch, m_fYaw, and m_fRoll variables are floats that 
 * contain the model's orientation in terms of pitch, yaw, and roll
 * angles, in radians.
 */
 
void C3DModel::MakeWorldMatrix( D3DXMATRIX* pMatWorld )
{
    D3DXMATRIX MatTemp;  // Temp matrix for rotations.
    D3DXMATRIX MatRot;   // Final rotation matrix, applied to 
                         // pMatWorld.
 
    // Using the left-to-right order of matrix concatenation,
    // apply the translation to the object's world position
    // before applying the rotations.
    D3DXMatrixTranslation(pMatWorld, m_xPos, m_yPos, m_zPos);
    D3DXMatrixIdentity(&MatRot);

    // Now, apply the orientation variables to the world matrix
    if(m_fPitch || m_fYaw || m_fRoll) {
        // Produce and combine the rotation matrices.
        D3DXMatrixRotationX(&MatTemp, m_fPitch);         // Pitch
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
        D3DXMatrixRotationY(&MatTemp, m_fYaw);           // Yaw
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
        D3DXMatrixRotationZ(&MatTemp, m_fRoll);          // Roll
        D3DXMatrixMultiply(&MatRot, &MatRot, &MatTemp);
 
        // Apply the rotation matrices to complete the world matrix.
        D3DXMatrixMultiply(pMatWorld, &MatRot, pMatWorld);
    }
}

world 행렬을 준비한 후 IDirect3DDevice9::SetTransform 메서드를 호출하여 첫 번째 매개 변수에 대한 D3DTS_WORLD 매크로를 지정하여 설정합니다.

참고

Direct3D는 여러 내부 데이터 구조를 구성하기 위해 설정한 월드 매트릭스와 보기 매트릭스를 사용합니다. 새로운 월드 매트릭스 또는 보기 매트릭스를 설정할 때마다 시스템에서 관련 내부 구조를 다시 계산합니다. 이러한 매트릭스를 자주 설정하면(예: 프레임당 수천 번) 계산에 많은 시간이 소요됩니다. 월드 매트릭스 및 보기 매트릭스를 월드 매트릭스로 설정한 월드 보기 매트릭스에 연결한 다음, 보기 매트릭스를 ID로 설정하면 필요한 계산의 수를 최소화할 수 있습니다. 필요에 따라 월드 매트릭스를 수정하고 연결하고 초기화할 수 있도록 개별 월드 및 보기 매트릭스의 캐시된 복사본을 보관해 두세요. 명확성을 위해 이 설명서에서 Direct3D 샘플은 이 최적화를 거의 채택하지 않습니다.

 

변형