수학/이득우의 게임 수학

원근 투영 (1) - 원근 투영 변환의 원리

monstro 2026. 5. 20. 19:23
728x90
반응형

- 개요

3차원으로 가상의 게임 공간을 구성하더라도 모니터 화면에 보이는 최종 결과물은 2차원 평면이다

따라서 2차원의 평면에서 3차원의 공간감을 느낄 수 있게 해야 한다

해답은 인간의 눈세상을 보는 방식으로 공간을 변환하는 것이다

인간의 눈이 세상을 보는 방식으로 변환하는 작업을 원근 투영 변환이라고 한다

 

- 원근 투영 변환의 절차

1) 투시 원근법이란?

이미지 출처 : https://www.metmuseum.org/art/collection/search/387741

 

르네상스 시대의 화가들은 눈에 비치는 상을 화폭에 그대로 담기 위해

시선을 한 점에 고정시키고, 고정된 점으로부터 화폭까지 곧게 뻗은 실을 활용하여 그림을 그렸다

이러한 기법을 투시 원근법이라고 표현한다

 

 

카메라 화각에 따라 변화된 공간의 모습

 

3차원 공간에 투시 원근법의 원리를 적용하기 위해서는

3차원 공간의 모든 점한 점을 향해 모이는 형태로 변환해야 하는데 이를 원근 투영 변환이라고 표현한다

가상 공간에서 눈에 대응하는 물체는 카메라로, 원근 투영 변환을 위해 카메라에도 눈에 보이는 범위를 설정해야 한다

이때 카메라에 적용된 눈에 보이는 범위화각이라고 표현한다

카메라에 화각을 설정하면 위의 그림과 같이 좌우와 상하가 균등한 사각뿔 영역이 생성된다

 

투영 평면과 초점 거리

 

3차원 공간에서의 원근 투영 변환은 X / Y / Z 축이 모두 직교하는 정육면체 형태를 가진 뷰 공간

카메라의 한 점으로 모이는 사각뿔 형태를 가진 공간으로 변환하는 작업이다

3차원 공간을 변환한 후에는 공간의 물체를 투영하여 2차원의 모니터 평면에 담아야 한다

이를 위해 모든 물체의 상이 맺히는 가상의 평면인 투영 평면을 생성한다

투영 평면은 카메라로부터 멀어질수록 커지며,

투영 평면카메라까지의 거리를 초점 거리(Focal Length)라고 표현한다

 

2) 3차원 공간에서의 투시 원근법 구현

2 - 1) 가정

우측에서 바라본 투영 공간과 투영 평면

 

투영 공간을 오른쪽에서 바라본 2차원 단면도로 정리하고 화각θ로, 초점 거리d로 표시하였다

 

2 - 2) NDC(Normalized Device Coordinate)

투영 평면으로 생성되는 NDC 영역

 

원근 투영을 구현하기 위해서는 우선 투영 평면의 위치를 지정해야 한다

투영 평면의 위치는 계산의 편의를 위해 위-아래의 크기가 각각 1이 되는 지점으로 결정한다

좌우와 상하의 화각이 동일하므로 투영 평면은 상하좌우의 범위가 [-1, 1]인 정사각형의 모습을 띈다

투영 평면에 대응하는 정사각형 영역은 2차원 평면의 좌표시스템을 가지는데, 이를 NDC라고 표현한다

NDC는 가운데 중점을 원점으로 설정한다

 

화각과 초점거리의 관계표현

 

화각과 초점거리의 관계식

 

화각 θ에 따른 초점 거리 d의 관계식

 

 

투영 평면에 대응하는 NDC가 언제나 일정한 값을 갖고 있다면,

카메라에 설정된 화각이 변할 때마다 초점 거리는 달라지게 된다

화각증가할수록 초점 거리감소하고, 화각감소할수록 초점 거리증가한다

따라서 화각 초점 거리 사이의 관계식은 위와 같이 정리할 수 있다

 

2 - 3) 원근 투영 행렬의 설계 (1)

이전까지 다룬 공간은 X / Y / Z 축이 모두 직교하는 유클리드 공간이었다

그러나 원근 투영 변환에 의해 사각뿔 형태와 같은 사영 공간으로 변환되었다

사영 공간의 X축과 Y축은 여전이 직교하지만, Z축은 독립적이지 않고 X축과 Y축 모두에게 영향을 준다

이는 초점 거리에 따라 투영 평면의 면적이 달라지는 이유이기도 하다

따라서 이를 감안하여 뷰 공간의 점투영 평면 위의 점으로 변환하는 행렬을 설계해야 한다

 

2 - 4) 원근 투영 행렬의 설계 (2)

투영의 진행 과정

 

문제를 단순화하기 위해 X축을 배제한 Y축과 Z축으로만 공간을 설정하고 투영 평면에 상이 맺힌다고 가정한다

이때 뷰 공간의 점을 P(view)로 표현하고 투영 평면의 투영된 점을 P(ndc)라고 표현한다

 

뷰 공간과 투영 평면의 각 점의 좌표

 

X값을 고정한 상태이므로, P(view)P(ndc)의 좌표값은 위와 같다

 

두 점의 관계 파악을 위한 닮은꼴 삼각형

 

두 점의 관계를 파악하기 위해 위와 같이 닮은꼴 삼각형 2개를 생성한다

이때 뷰 공간에서 카메라 앞에 위치한 점Z 값은 항상 음수이므로 큰 삼각형의 밑변의 길이는 -V(z)가 된다

 

투영 평면의 Y 값과 X 값

 

닮은꼴 삼각형의 비를 이용하여 투영 평면의 Y을 위와 같이 계산할 수 있다

또, Y 값을 0으로 고정한 후에 X축과 Z축의 평면을 사용하는 방식으로 투영 평면의 X을 계산할 수 있다

 

투영 평면에 투영된 점 P(ndc)의 값

 

최종적으로 초점거리뷰 좌표로부터 투영 평면의 투영된 점은 위와 같이 계산할 수 있다

 

2 - 5) 원근 투영 행렬의 설계 (3)

종횡비를 고려하지 않고 확대하는 경우 발생하는 문제

 

2 - 4)처럼 NDC 좌표값을 계산했다면 모니터의 최종 화면을 구성하는 작업이 남았다

NDC 좌표화면 해상도만큼 늘려주면 최종 스크린 좌표가 완성되지만,

화면의 가로-세로 비 종횡비를 고려하지 않고 확대하면 위와 같이 물체가 찌그러지는 문제가 발생한다

 

종횡비를 고려하여 확대를 처리

 

위의 문제를 해결하는 방법은 화면의 종횡비를 파악하여 NDC 영역에서 미리 찌그러뜨린 후에 확대하는 것이다

종횡비는 보통 하나의 축을 1의 크기로 지정하고 다른 축의 크기상대적으로 측정해 계산한다

 

수정된 투영 평면의 투영된 점을 계산하는 공식

 

프로젝트에서는 800 X 600의 해상도를 사용하므로 세로 기준으로 종횡비는 1.333이 된다

종횡비 기호는 a로 표시한다고 가정한다

NDC를 좌우로 찌그러뜨리면 X축의 값을 변경해야 하는데,

이는 종횡비의 역수 1/a를 곱하여 계산할 수 있다

따라서 최종적으로 NDC의 좌표 P(ndc)를 계산하는 공식은 위와 같이 수정된다

 

원근 투영 행렬 P

 

최종 NDC 값을 계산하는 원근 투영 행렬 P는 위와 같이 설계할 수 있다

뷰 공간의 점 P(view)X 값과 Y 값으로 만든 벡터를 v로 지정하여 위와 같이 계산하였다

 

2 - 6) 원근 투영 행렬의 설계 (4)

2 - 5)에서 최종적으로 생성한 원근 투영 행렬은 치명적인 문제가 남아있다

해당 P 행렬을 사용하게 되면, 변환할 점마다 항상 행렬을 새롭게 생성해야 한다

이는 미리 곱해둔 행렬을 사용한다는 이점을 살리지 못하고 연산량을 증가시키게 된다

따라서 원근 투영 행렬을 구성할 때 점의 값이 아닌 카메라의 설정만으로 행렬을 설계해야 한다

 

1차 수정

 

2 - 5)에서 생성한 행렬을 위와 같이 변경하고 행렬에 곱하는 벡터의 값을 v = (v(x), v(y), v(z))로 지정한다

v 벡터는 뷰 좌표계의 점과 동일한 값을 가진다

 

2차 수정 - 클립 좌표의 점

 

위 행렬 곱에서 생성한 벡터NDC 좌표와는 다르지만 원근 투영 행렬 P는 점과 무관한 카메라 설정 값으로 구성된다

따라서 모든 점에 대해 보편적으로 설계된 원근 투영 행렬 P를 사용할 수 있다

위와 같이 원근 투영 행렬 P로 변환되는 좌표계를 클립 좌표라고 부르며 클립 좌표의 점 P(clip)은 위와 같다

 

최종 완성된 NDC의 좌표

 

2차 수정에서 계산한 클립 좌표의 점 P(clip)의 각 요소를 세 번째 값인 -V(z)로 나눈다

최종적으로 위와 같이 구성된 NDC의 좌표를 계산할 수 있다

728x90
반응형

'수학 > 이득우의 게임 수학' 카테고리의 다른 글

원근 투영 (2) - 동차 좌표계  (0) 2026.05.27
삼중곱  (0) 2026.05.13
로드리게스 회전  (0) 2026.05.06
외적의 활용 (5) - 백페이스 컬링  (0) 2026.05.06
외적의 활용 (4) - 회전행렬의 생성  (0) 2026.04.29