라떼군 이야기


5 / 10강

멀리 있는 물체를 작게 그리기

사진에서는 멀리 있는 물체가 작아 보입니다. 원근 투영은 깊이에 따라 화면에 보이는 크기를 바꿉니다. 직교 투영은 깊이가 달라도 같은 크기를 유지하므로 도면 같은 표현에 쓰기 좋습니다.

간단한 원근 계산

이 수업에서는 카메라가 +z 방향을 바라보고, 앞쪽 점의 z가 양수라고 정합니다. 초점 거리를 f라 하면 x_screen = f*x/z, y_screen = f*y/z로 생각할 수 있습니다. 실제 그래픽 API의 축과 깊이 범위는 다를 수 있습니다.

f, x = 1, 2
print(f * x / 2)
print(f * x / 4)

출력은 1.0, 0.5입니다. 같은 x라도 깊이가 2배이면 화면에서 원점과의 거리는 절반입니다. 이것은 투영 평면의 좌표이며 실제 픽셀 번호는 화면 크기에 맞춰 다시 변환합니다.

보이는 범위 밖은 잘라냅니다

카메라에는 시야각과 가까운 면, 먼 면이 있습니다. 그 안의 시야 부피를 뷰 프러스텀이라고 합니다. 범위 밖의 부분을 자르는 클리핑이 필요합니다. z=0에서 바로 나누거나 카메라 뒤의 점을 같은 식에 무작정 넣으면 잘못된 결과가 나옵니다.

실제 파이프라인은 투영 행렬로 클립 좌표를 만들고, 클리핑한 뒤 w로 나눕니다. 원근 나눗셈 이후 좌표를 화면의 픽셀 범위에 대응시키는 과정이 뷰포트 변환입니다.

확인 문제

정면에서 본 두 물체의 실제 크기가 같고 하나가 두 배 멀리 있습니다. 원근 투영과 직교 투영에서는 각각 어떻게 보일까요?

해설 보기

다른 조건이 같다면 원근 투영에서는 먼 물체의 가로와 세로가 각각 절반입니다. 직교 투영에서는 깊이만으로 크기가 줄지 않습니다. 어떤 표현이 필요한지에 따라 투영을 고릅니다.

제품 기획, 개발 파트너 찾으시나요? 개인, 팀, 기업 모두 환영. 문제 정의부터 출시까지 함께합니다.