3D 모델의 좌표 변환 정보
물질
우선
TV 화면이나 게임 디스플레이에서 3D 이미지를 자주 볼 수 있지만, 화면에서 움직이는 캐릭터나 건물 등 3D 공간에 존재하는 물체를 2D 화면에 어떻게 표시합니까?
2D 게임에서는 좌표값으로 "X와 Y"의 2차원 요소만 있고, 표시도 2D이기 때문에 X와 Y의 좌표 위치를 지정하여 개체를 그리면 어느 위치에 어떻게 그려지는지 직관적으로 알 수 있습니다.
그러나 3D에서는 그렇게 쉽지 않습니다. 이름에서 알 수 있듯이 3D는 "3차원"이며 "X, Y, Z"의 세 가지 좌표 정보가 있습니다. 2D인 디스플레이와 좌표가 다르기 때문에 개체를 그대로 그릴 수 없습니다.
그런 다음 할 일은 "3 차원 정보를 2 차원 정보로 변환"하는 것입니다. 이를 일반적으로 "좌표 변환"이라고 합니다. 이 좌표 변환은 3D 프로그래밍에 필수적입니다.
3D를 2D로 변환하기 위한 좌표 변환에는 여러 유형이 있지만 프로그래머가 처리하는 좌표 변환에는 "세계 변환", "보기 변환" 및 "투영 변환"의 세 가지 주요 유형이 있습니다. 여기에서는 좌표 변환과 관련된 모든 것을 설명합니다.
왼손 및 오른손 좌표계
3D에는 "왼손 좌표계"와 "오른쪽 좌표계"의 두 가지 좌표계가 있으며, 아래 그림과 같이 각 좌표의 방향이 다릅니다.
Direct3D는 주로 왼손 좌표계를 사용했지만 오른손 좌표계를 계산하는 함수도 있습니다. 그러나 XNA는 오른손 좌표계에 대한 계산 방법만 제공합니다. 이것은 다른 응용 프로그램이 종종 오른쪽 좌표계를 사용한다는 사실과 일치하는 것 같습니다.
이 사이트의 모든 XNA 팁은 오른손 좌표계를 사용합니다.
로컬 좌표계(모델 좌표계)
각 모델에는 원점을 중심으로 하는 좌표계가 있습니다. 모델링 소프트에서 모델을 작성할 때는, 원점을 중심으로 작성한다고 상상하면 이해하기 쉽다고 생각합니다.
세계 좌표계
표준 좌표계를 사용하면 모델을 어디에나 배치할 수 있습니다. 이 전역 변환에서 아무 작업도 수행하지 않으면 모델은 로컬 좌표와 동일한 방식으로 원점에 배치됩니다. 배치는 원점에서 이동하는 것뿐만 아니라 회전하고 크기를 조정하는 것입니다.
뷰 좌표계
표준 좌표에 모델을 배치한 후에는 3D 공간에서 보고 있는 위치와 보고 있는 위치에 대한 정보가 필요합니다. 이것을 "뷰 변환"이라고 합니다. 뷰 변환은 일반적으로 카메라로 표시되는 경우가 많습니다.
이 변환에 필요한 매개변수는 "카메라 위치", "카메라 관심 지점" 및 "카메라 위쪽 방향"입니다. 카메라의 방향은 이 세 가지 매개변수에 의해 결정됩니다. 아래 그림은 제3자 관점에서 본 카메라입니다.
아래 그림은 실제로 위 그림과 같은 배열로 카메라의 시점에서 본 것입니다(이 시점에서는 아직 좌표를 화면으로 변환하지 않았으므로 이미지일 뿐입니다).
지금까지의 설명에서는 카메라의 위치가 바뀌어 좌표가 변형되는 것 같습니다만, 실제의 계산에서는 카메라의 위치와 방향에 따라 세계 좌표를 변환하고 있습니다. 따라서 원점은 아래 그림과 같이 카메라의 위치입니다.
투영 좌표계
3D 공간을 어느 위치에서 보낼지 결정했다면, 다음 단계는 「멀리 있는 작은 물체」와 「근처에 있는 큰 사물」의 표시를 처리하는 것입니다. 이를 투영 변환이라고 합니다. 투영 변환에는 "투시 투영"과 "직교 투영"의 2 가지가 있습니다 만, 일반적으로 사용되는 "투시 투영"이미지는 다음과 같습니다.
투시 투영은 Viewing Angle, Aspect Ratio, Forward Clip Position 및 Rear Clip Position 매개변수를 사용합니다. 위 그림에서 "frustum"이라고 표시된 영역이 마침내 화면에 나타납니다.
"시야각"은 카메라에서 볼 수 있는 시야 범위를 지정합니다. 각도를 줄이면 확대되고 각도를 늘리면 축소됩니다. 시야각은 절두체의 세로 값이 됩니다.
Aspect Ratio는 수평 화각을 결정하는 데 사용되는 반면 시야각은 수직 각도입니다. 수평 각도는 일반적으로 "시야 각도 × 종횡비"에 의해 결정되며, 종횡비는 기본적으로 표시하려는 화면의 "너비 ÷ 높이"의 값입니다. 이 값을 변경하면 표시된 3D 개체가 가로 또는 세로로 늘어나는 것처럼 보입니다.
전방 클립 위치(Forward Clip Position) 및 후면 클립 위치(Rear Clip Position)는 객체가 전면 또는 후방 범위에 표시되는지 여부를 결정하기 위해 지정됩니다. 컴퓨터의 특성상 무한대까지 표시 할 수 없으므로 제한을 설정합니다. 이 값은 Z-버퍼의 정확도에도 영향을 미치므로 표시할 필요가 없는 범위를 벗어나는 도면 영역에는 포함하지 않는 것이 좋습니다.
투시로 변환된 객체는 아래와 같은 공간으로 변환됩니다. 카메라에 가까이 있던 개체는 확대되고 멀리 있던 개체는 축소됩니다.
이것은 아래의 이해하기 쉬운 다이어그램에 설명되어 있습니다.
실제로 카메라의 시점에서 보면 아래와 같은 느낌입니다.
투영 변환의 또 다른 방법은 아래와 같은 가시 영역을 투영하는 직교 투영입니다. 너비와 높이는 깊이에 관계없이 일정하기 때문에 개체의 크기는 깊이에 따라 변경되지 않습니다.
화면 좌표계
프로젝션 변환 후 실제 화면의 좌표로 변환됩니다. 화면이라도 장치에서 설정한 뷰포트 설정에 따라 디스플레이의 위치와 범위가 변경됩니다. 다만, 게임의 경우, 창의 클라이언트 좌표가 그대로 뷰포트가 되는 경우가 많기 때문에, 그다지 걱정할 필요는 없다고 생각합니다.
화면의 좌표(0, 0)는 투영 좌표(-1, 1, z)에서 변환됩니다. 마찬가지로 화면 좌표(너비, 높이)는 프로젝션 좌표(1, -1, z)에서 변환됩니다.