2023. 12. 6. 21:24ㆍComputer Sciences/Game Mathemathics
*인프런 <게임 엔진을 지탱하는 게임수학, 이득우 교수님> 강의를 듣고 공부한 글입니다.
1. 원근 투영 변환(Perspective Projection Transformation)

맛있는 음식이 나왔을 때, 카페에 가서 디저트와 음료를 시켰을 때 등등 일상 생활 속에서 우리는 많은 순간 카메라로 사진을 찍곤 합니다. 하지만, 현실 세계는 3차원이고 카메라로 찍게 되는 사진은 2차원인데 어떻게 우리가 이질감을 느끼지 않고 있는 사실 그대로 받아들일 수 있는 걸까요? 바로 원근감이 형성되었기 때문입니다.
이에 따라, 가상 세계를 만들고 있는 우리 또한 이 원근감을 형성해주는 작업을 해줘야 한다는 의미가 되며, 오늘은 이러한 작업에 대한 원근투영 변환을 알아보는 시간을 가지도록 하겠습니다.
원근 투영 변환의 원리
3차원 공간은 3개의 축이 서로 직교하는 형태의 공간입니다. 하지만 우리 눈은 이런 3차원 공간을 조금 다른 형태로 보고 있죠. 우리 눈이 바라보는 세계는 카메라처럼 한 점에서 출발해, 화각으로 쫙 펼쳐지는 형태로 구성되어 있습니다.

화각으로 펼쳐진 공간 내에 있는 물체를 어떠한 평면에 담는 것이고, 우리는 그 평면을 보는 것이죠.

우리가 보는 이 평면은 우리의 눈(카메라)와의 거리에 따라 멀어질수록 커지고, 가까워질수록 작아질 겁니다. 이러한 평면들이 모인 집합이 바로 위와 같이 사각뿔 형태가 되겠지요. 여기서, 우리는 다음과 같은 개념을 적립할 수 있습니다.
- 투영 평면 : 화각으로 펼쳐진 공간 내 수많은 평면들이 모인 집합 중에서, 우리가 화면에 담을 평면
- 초점거리 : 카메라로부터 투영 평면까지의 거리
위에서 말한 내용을 옆에서 보면 다음과 같습니다.

화각(Field of View) 이
NDC(Normalized Device Coordinate)
모니터의 스펙에 따라 달라지는 해상도를 고려해, 화면 크기를 정규화하여 관리하는 방법입니다. 텍스처에서도 텍스처 이미지의 크기에 상관없이 UV 좌표계를 (
평면 절반의 길이가 1이 되면, [좌] 그림을 봤을 때 높이가 1인 직각삼각형이 2개가 만들어지게 됩니다. 정면에서 투영 평면을 보게 되면, [우] 그림과 같이 중앙 (
1) 초점거리 구하기
화각은 우리가 설정하는 것이니 주어지고, 평면의 절반 길이가 1이라는 것도 주어졌습니다. 그럼 이제 이걸 토대로 초점거리

평면은 항상 절반 길이 1을 유지해야 하므로, 화각이 작아지면 그만큼 뒤로 밀려날 것이고, 화각이 커지면 앞으로 당겨질 겁니다. 또한, 화각
2) 뷰 공간의 점을 NDC 점으로 변환 👉🏻 답은 "삼각비"
뷰 공간의 점

이러한 과정을 뷰 공간에 있는 점들에 대해 진행하고, 이렇게 구한 NDC 좌표계의 점들로 렌더링을 하면 원근감 있는 3차원 공간을 그릴 수 있게 됩니다. 우리는 이렇게
그렇다면, 뷰 공간에 있는 점을 어떻게 NDC 좌표계로 변환할 수 있을까요? 이것은 삼각비를 활용해 해결할 수 있습니다.
먼저, NDC의

뷰 공간의 임의의 점
그렇다면 우리가 알고있는 정보인 초점거리
이를 통해, 투영된 최종 좌표는 다음과 같습니다.
3) 실제 해상도 화면으로 적용하기
이제 정규화 된 이 NDC 공간에서의 각 투영 좌표를 얻었으니, 실제로 화면 해상도에 맞출 때에는 해상도만큼 가로, 세로를 늘려서 계산하면 됩니다. 가령,

하지만 문제가 하나 있는데, NDC 공간은 가로와 세로가 동일한 길이이지만 대부분의 모니터 해상도들은 그렇지 않습니다. 따라서, 있는 그대로 확대하여 적용하게 된다면 다음과 같이 찌그러진 형태로 보이게 됩니다.

이를 방지하려면, 모니터 해상도의 종횡비를 NDC 공간에 반영해 모양을 찌그러트리고, 이를 실제 모니터에 늘려서 표현할 땐 온전한 모습으로 나오게끔 할 수 있습니다.

이러한 종횡비는 보통 세로를 기준으로 많이 하며, 이를 통해 구한 종횡비
이렇게 되면, 보통 세로가 가로 길이보다 짧기 때문에
4) 투영 변환 행렬 구하기
위에서 구한 식
하지만 위 행렬은 문제가 있습니다. 행렬 요소를 보면
이러한 문제를 해결할 수 있는 해법으로 클립 공간(Clip Space) 라는 개념이 나오게 됩니다.
2. 클립 공간(Clip Space)
위에서 구한 행렬은 범용적으로 사용할 수 없기에, 범용적으로 사용할 수 있는 행렬을 만들어야 합니다. 이를 위해 사용하는 부차적인 공간이 있는데, 이것이 클립 공간(Clip Space)입니다. 뷰 공간과 NDC 공간의 중간 단계 공간이라고 보면 되고, 3차원이 모두 다 존재하는 그런 공간입니다.
클립 공간은 그럼 왜 3차원으로 구성되어 있을까요? NDC는 모니터 화면에 대응되는 공간으므로 2차원이면 되지 않나요? 그 해답을 알기 위해, 우선 기존 NDC 공간의 좌표 공식을 한 번 보겠습니다.
위 식을 보면, 모든 좌표(
이렇게 구성한 다음,
즉, 클립 공간의 값들을 점마다 각자 가지고 있는
이 행렬을 통해 만들어진 좌표에다가 수동으로 각자의
동차 좌표계(Homogenous Coordinate System)
이제 조금 어려운 이야기를 해보려고 하는데, 우선 우리가 사용하는 3차원 컴퓨터 그래픽스에는 두 가지 공간이 있습니다.
- 물체를 배치하고 사용하기 위한
축이 서로 직교하는 현실(월드) 공간 👉🏻 유클리드 공간(Euclidean space) - 눈(카메라)로 관찰하는 공간 👉🏻 사영 공간(Projective space)
사영 공간은 수학적인 용어로, 우리가 위에서 봤던 클립 공간 개념과 동일합니다. 이제 이 유클리드 공간과 사영 공간이 어떠한 차이가 존재하는지 알아볼 건데요. 우선, 유클리드 공간에서는 서로 평행한 두 직선이 만나지 않습니다.

그런데, 만약 위와 같은 2차원 공간이 실은 3차원 공간의 일부였다면 어떨까요? 현재 2차원에서 보는 좌표는 3차원 공간의 일부분이었는데, 마지막 차원의 값으로 나누었다고 생각해 보는거죠.
이 개념을 적용한 직선의 방정식은 다음과 같습니다.
양 변에
위 식을 보면,
결국, 클립 공간이라는 것은 NDC 공간에서는 알 수 없는 한 차원 더 높은 공간이라는 컨셉으로 이해할 수 있겠습니다. 그럼, 클립 공간이 동작하는 원리 중 하나인 소실점(Vanishing point)에 대해 알아보겠습니다.
소실점(Vanishing point)
유클리드 공간에서는 평행한 두 직선이 절대로 만나지 않는다고 이야기 했었습니다. 그런데, 사영 공간에서는 어떨까요? 다음과 같은 식을 봤을 때,
유클리드 공간에서는 세 축이 서로 직교하는 상태이기 때문에


위 그림에서
다시 정리하자면, 마지막 차원의 요소는 항상
그럼 결국에는 무수히 많은 같은 성질의 점들이 사영 공간에 존재할 것인데,
우리가 사용하는 것은
이러한 원리를 이용해, 사영 공간에 존재하는 무수히 많은 같은 성질의 점들 중 딱 하나만 우리가 원하는 걸 뽑아볼 수 있는 겁니다. 이러한 규칙을 적용하여 화면에 점들을 그릴 때, 만약

즉,
마지막 차원은 사실상 의미가 없고,
'Computer Sciences > Game Mathemathics' 카테고리의 다른 글
[게임 수학] #21 | 깊이 버퍼(Depth Buffer) (2) | 2023.12.07 |
---|---|
[게임 수학] #19 | 벡터의 외적(Cross Product) (2) | 2023.12.05 |
[게임 수학] #18 | 오일러 각(Euler angle) (2) | 2023.12.04 |
[게임 수학] # 17 | 3차원 공간 (4) | 2023.11.30 |
[게임 수학] #16 | 뷰 공간(View Space) (2) | 2023.11.29 |