10.2 3D 장면 바라보기 (Viewing a 3D Scene)
장면을 렌더링하기 전에 카메라와 출력 창을 선택해야 합니다. 어디에서 렌더링할지, 즉 관찰 위치·방향·줌을 결정하고, 어디에 렌더링할지, 즉 화면상의 직사각형 영역을 결정해야 합니다. 둘 중 출력 창이 더 단순하므로 먼저 설명하겠습니다.
10.2.1절에서는 출력 창 지정 방법을, 10.2.2절에서는 픽셀 종횡비를, 10.2.3절에서는 뷰 프러스텀을, 10.2.4절에서는 시야각과 줌을 다룹니다.
10.2.1 출력 창 지정하기
영상을 반드시 화면 전체에 렌더링할 필요는 없습니다. 화면 분할 멀티플레이 게임에서는 각 플레이어에게 화면의 일부를 할당합니다. 출력 창(output window)은 출력 장치에서 영상이 렌더링되는 부분을 뜻합니다. 그림 10.2를 보세요.
그림 10.2 — 출력 창 지정하기
창의 위치는 왼쪽 위 픽셀의 좌표 로 지정합니다. 정수 와 는 창의 가로·세로 픽셀 수입니다. 오른쪽 아래 모서리의 좌표 대신 창의 크기를 사용하면 정수 픽셀 좌표에서 생기는 몇 가지 까다로운 문제를 피할 수 있습니다. 창의 픽셀 단위 크기와 실제 물리적인 크기도 구별해야 합니다. 이 구분은 10.2.2절에서 중요해집니다.
렌더링의 목적지가 화면이 아닐 수도 있다는 점도 알아두세요. TGA 파일로 저장할 버퍼나 AVI 영상의 한 프레임으로 렌더링할 수 있습니다. 또는 주 렌더링의 일부 과정으로 텍스처에 렌더링하여 그림자 맵, 반사 영상, 가상 세계 속 모니터의 화면 등을 만들 수도 있습니다. 이런 이유로 현재 렌더링 출력이 기록되는 목적지를 렌더 타깃(render target)이라고 부릅니다.
10.2.2 픽셀 종횡비
화면에 렌더링하든 화면 밖의 버퍼에 렌더링하든, 픽셀의 종횡비(aspect ratio)를 알아야 합니다. 원문의 첫 문장은 이를 픽셀의 ‘높이와 너비의 비’라고 설명합니다. 이 비가 1:1이면 정사각형 픽셀이지만, 항상 그런 것은 아닙니다. 아래에서 몇 가지 예를 들겠습니다. 이 가정을 아무 의심 없이 받아들였다가 영상이 가로로 늘어나거나 눌리면, 엉뚱한 단계에 복잡한 임시 처방을 넣게 되기 쉽습니다.
픽셀 종횡비를 구하는 식은 다음과 같습니다. 이 식과 이후의 수식은 너비/높이 순서를 사용합니다.
는 픽셀의 물리적 크기이고, 는 영상을 표시하는 장치의 물리적 가로·세로 크기입니다. 각 실제 길이를 모를 수도 있지만 상관없습니다. 필요한 것은 비율뿐이고, 그 비율은 보통 알고 있습니다. 예를 들어 데스크톱 모니터는 크기가 다양하지만, 구형 모니터 상당수의 표시 영역은 4:3 비율입니다.
너비가 높이보다 약 33% 더 크다는 뜻입니다. 고해상도 텔레비전에서는 16:9 또는 그보다 더 넓은 비율도 흔합니다.(원주 10-7) 정수 와 는 각각 가로·세로 픽셀 수입니다. 해상도 1280×720이라면 값은 각각 1280과 720입니다.
앞서 말했듯 실제로는 1:1인 정사각형 픽셀을 다루는 경우가 많습니다. 물리적인 너비:높이가 4:3인 데스크톱 모니터에서 정사각형 픽셀이 되는 흔한 해상도는 640×480, 800×600, 1024×768, 1600×1200입니다. 16:9 모니터에서는 1280×720, 1600×900, 1920×1080이 흔합니다. 8:5, 더 익숙한 표현으로 16:10도 데스크톱 모니터나 텔레비전에 흔한 비율입니다.
원문은 이 비율의 해상도로 1153×720, 1280×800, 1440×900, 1680×1050, 1920×1200을 듭니다. PC에서는 표시 장치의 물리 크기를 알아내기 어려울 수 있어 픽셀 비율을 그냥 1:1로 가정하는 일이 흔합니다. 이런 점에서는 콘솔 게임 쪽이 더 수월합니다.
이 계산 어디에도 출력 창의 위치나 크기는 등장하지 않는다는 점을 보세요. 렌더링 창의 위치와 크기는 픽셀 자체의 물리적 비율에 영향을 주지 않습니다. 다만 창의 크기는 10.2.4절의 시야각에서 중요해지고, 위치는 10.3.5절에서 카메라 공간을 화면 공간으로 변환할 때 중요해집니다.
비트맵에 렌더링하는 경우에는 ‘물리적 크기’라는 말이 어울리지 않는데 어떻게 적용하느냐고 생각할 수도 있습니다. 대부분의 경우 픽셀 종횡비가 1:1인 것처럼 처리하면 적절합니다. 다만 특별한 상황에서는 아나모픽(anamorphic) 방식으로 렌더링하고 싶을 수 있습니다. 비트맵에는 눌린 영상을 만든 뒤, 나중에 사용할 때 늘려서 정상 비율로 보이게 하는 방식입니다.
원주 10-7: 모니터 제조사는 사람들이 ‘와이드스크린’에서 고급스러운 이미지를 느낀다는 사실을 발견하고 매우 기뻤을 것입니다. 모니터 크기는 보통 대각선으로 표시하지만, 비용은 면적에 비례하는 픽셀 수와 더 직접적으로 관련됩니다. 따라서 픽셀 수가 같은 16:9 모니터는 4:3 모니터보다 대각선 길이가 길어, ‘더 큰’ 모니터로 받아들여집니다. 더 넓은 비율의 모니터가 늘어나는 것이 시장의 힘 때문인지 마케팅의 힘 때문인지는 잘 모르겠습니다.
10.2.3 뷰 프러스텀
뷰 프러스텀(view frustum, 시야 절두체)은 카메라에서 잠재적으로 볼 수 있는 공간의 부피입니다. 꼭짓점을 잘라낸 피라미드 모양입니다. 그림 10.3을 보세요.
그림 10.3 — 3차원 뷰 프러스텀
뷰 프러스텀은 클립 평면(clip plane)이라고 하는 여섯 평면으로 둘러싸입니다. 네 평면은 피라미드의 옆면을 이루며 위쪽·왼쪽·아래쪽·오른쪽 평면이라고 부릅니다. 출력 창의 네 변에 대응합니다. 나머지 근거리(near)·원거리(far) 클립 평면은 카메라 공간의 특정 z값에 대응하며, 조금 더 설명이 필요합니다.
원거리 클립 평면은 이해하기 쉽습니다. 일정 거리보다 먼 물체가 렌더링되는 것을 막습니다. 실용적인 이유는 두 가지입니다. 첫째, 야외 장면에서 렌더링할 물체의 수를 제한할 수 있습니다. 둘째는 깊이 버퍼 값을 배정하는 방식과 관련됩니다. 예를 들어 깊이 버퍼가 16비트 고정소수점 값이라면 저장 가능한 최댓값은 65,535입니다.
원거리 클립 평면은 카메라 공간의 어느 부동소수점 z값을 이 최댓값에 대응시킬지 정합니다. 근거리 클립 평면이 필요한 이유는 10.3.2절에서 클립 공간을 다룰 때까지 기다려 주세요.
각 클립 평면은 무한히 뻗은 평면이라는 점을 기억하세요. 시야 부피는 여섯 클립 평면이 정의하는 여섯 반공간의 교집합입니다.
10.2.4 시야각과 줌
카메라도 세계의 다른 물체처럼 위치와 방향을 가집니다. 여기에 시야각(field of view)이라는 속성이 하나 더 있습니다. 줌(zoom)이라는 말도 익숙할 것입니다. 줌인하면 보고 있는 물체가 화면에서 커 보이고, 줌아웃하면 작게 보인다는 것을 직관적으로 알고 있습니다. 이 직관을 더 정확한 정의로 발전시켜 봅시다.
시야각, 줄여서 FOV는 뷰 프러스텀이 벌어지는 각도입니다. 실제로는 수평 시야각과 수직 시야각 두 개가 필요합니다. 잠시 2차원으로 돌아가 하나의 각도만 생각해 봅시다. 그림 10.4는 뷰 프러스텀을 위에서 본 그림으로, 수평 시야각이 무엇을 재는지 정확히 보여줍니다. 축 표시는 10.3절에서 설명할 카메라 공간을 나타냅니다.
그림 10.4 — 수평 시야각
줌은 시야각 90°를 기준으로 물체가 화면에 얼마나 크게 보이는지 그 비율을 나타냅니다. 줌이 2.0이면 시야각이 90°일 때보다 화면의 물체가 두 배 크게 보입니다. 따라서 줌이 클수록 화면의 영상이 커지는 줌인이 되고, 줌이 작을수록 영상이 작아지는 줌아웃이 됩니다.
그림 10.5 — 줌의 기하학적 해석
그림 10.5처럼 기하학적으로 해석하고 기본 삼각함수를 적용하면, 줌과 시야각의 변환식을 얻습니다.
줌과 시야각이 반대 방향으로 변한다는 점에 주목하세요. 줌이 커지면 시야각은 작아지고 프러스텀이 좁아집니다. 처음에는 직관적이지 않을 수 있지만, 시야가 좁아질수록 보이는 물체는 더 크게 느껴집니다. 사람이 지정하기에는 시야각이 편리하지만, 10.3.4절에서 보겠듯 그래픽스 파이프라인에 넣을 때는 줌 값이 필요합니다.
수평과 수직에 각각 하나씩, 두 개의 시야각 또는 줌이 필요합니다. 원하는 두 값을 임의로 골라도 되지만, 두 값의 관계가 적절하지 않으면 영상이 늘어나거나 눌립니다. 와이드스크린용 영화를 보통 텔레비전에 맞추려고 눌러 표시하거나, 4:3 콘텐츠를 16:9 텔레비전에서 화면 가득 채우는 모드로 봤다면 이런 현상을 보았을 것입니다.(원주 10-8)
올바른 비율을 유지하려면 줌 값이 출력 창의 물리적인 크기에 반비례해야 합니다.
는 출력 창의 물리적인 크기입니다. 실제 크기는 몰라도 비율은 구할 수 있습니다. 하지만 보통 아는 것은 창의 픽셀 해상도뿐인데 어떻게 할까요? 바로 여기서 10.2.2절의 픽셀 종횡비 계산이 필요합니다.
이 식에서 각 변수는 다음을 뜻합니다.
•
zoom: 카메라의 줌 값.
•
winPhys: 창의 물리적 크기.
•
winRes: 창의 픽셀 해상도.
•
pixPhys: 픽셀의 물리적 크기.
•
devPhys: 출력 장치의 물리적 크기. 개별 길이는 몰라도 비율은 보통 알고 있습니다.
•
devRes: 출력 장치의 해상도.
많은 렌더링 패키지는 시야각 또는 줌을 하나만 지정하게 합니다. 그러면 표시 비율을 유지하려 한다고 가정하고 다른 값을 자동으로 계산합니다. 예를 들어 수평 시야각을 지정하면 수직 시야각을 계산해 줍니다.
이제 컴퓨터가 사용할 수 있는 줌 값을 구하는 방법을 알았습니다. 이 값은 어디에 쓸까요? 10.3.4절의 클립 행렬에 들어갑니다.
원주 10-8: 영상을 이렇게 늘이는 모습을 보면 영상 애호가는 몹시 괴로워하지만, 어떤 텔레비전 소유자는 검은 여백보다 늘어난 영상을 선호하는 듯합니다. 비싼 새 텔레비전에서 검은 여백이 보이면 돈값을 충분히 못 한다고 느끼기 때문입니다.
10.2.5 직교 투영
지금까지는 원근 투영(perspective projection)을 중심으로 설명했습니다. 눈이 세상을 지각하는 방식과 닮아 가장 널리 쓰입니다. 그러나 직교 투영(orthographic projection)도 여러 상황에서 유용합니다. 5.3절의 내용을 짧게 복습하면, 직교 투영에서는 같은 화면 좌표로 투영되는 공간상의 점들을 연결한 투영선이 한 점에서 만나지 않고 서로 평행합니다.
직교 투영에는 원근에 따른 크기 축소가 없습니다. 물체가 얼마나 멀리 있든 화면에서 크기가 같습니다. 물체가 근거리 클립 평면 앞쪽에 남아 있는 한, 카메라를 시선 방향으로 앞뒤로 움직여도 화면에서 달라지는 것이 없습니다.
그림 10.6은 같은 위치와 방향에서 원근 투영과 직교 투영으로 렌더링한 장면을 비교합니다. 왼쪽 원근 투영에서는 평행선이 화면에서 평행하게 유지되지 않고, 가까운 격자 칸이 먼 격자 칸보다 큽니다. 직교 투영에서는 격자 칸이 모두 같은 크기로 보이고 격자선도 평행하게 유지됩니다.
그림 10.6 왼쪽 — 원근 투영
그림 10.6 오른쪽 — 직교 투영
직교 시점은 도면 같은 화면이나 거리와 각도를 정확히 측정해야 하는 상황에 유용합니다. 모델링 도구에서는 이런 보기를 지원합니다. 게임에서는 지도나 다른 HUD 요소를 렌더링하는 데 사용할 수 있습니다.
직교 투영의 시야 부피는 피라미드가 아니라 상자 모양이므로, 시야를 각도로 말하는 것은 의미가 없습니다. 두 각도 대신 상자의 물리적인 너비와 높이 두 크기로 x·y 방향 범위를 지정합니다.
직교 투영에서 줌의 의미도 원근 투영 때와 다릅니다. 프러스텀 상자의 물리적인 크기와 다음 관계를 가집니다.
원근 투영과 마찬가지로 x·y 두 줌 값이 있고, 영상이 눌리지 않도록 렌더링 창의 종횡비와 두 값의 비율을 맞춰야 합니다. 식 10.5는 원근 투영을 염두에 두고 만들었지만 직교 투영의 올바른 비율에도 적용됩니다.
정사각형 픽셀과 화면의 종횡비는 다릅니다
1920×1080 화면에서 픽셀이 정사각형이면 픽셀 비율은 1:1, 화면 비율은 16:9입니다. 이를 혼동하여 두 축에 같은 줌을 넣으면 원이 타원처럼 보일 수 있습니다. 정사각형 픽셀의 16:9 출력 창에서는 식 10.4에 따라 가 되어야 합니다.
원문 오타 안내: 10.2.2절 첫 문장은 비율을 높이/너비라고 설명하지만 식 10.2 이후는 너비/높이를 사용합니다. 또한 원문의 1153×720은 정확한 16:10이 아닙니다. 정확히 16:10인 값은 1152×720입니다. 혼동을 막기 위해 원문에 나온 숫자는 본문에 남기고 여기서 정정합니다.
확인 문제: 같은 위치에서 수평 시야각을 90°에서 약 53.13°로 줄이면 줌은 1에서 약 2로 증가합니다. 물체가 화면에서 두 배 커지지만 카메라는 움직이지 않았습니다. 카메라를 앞으로 움직이는 동작과 혼동하지 마세요.










