숏컷 코드
world -> view -> projection -> depth test문법과 예시
카메라 이동은 세상을 반대로 옮기는 수학이다
게임에서 "카메라를 앞으로 민다"는 것은 시각적으로 직관적이지만, 수학적으로는 월드 전체를 카메라 반대 방향으로 이동시키는 view matrix 연산입니다. view matrix는 카메라의 위치와 방향을 이용해 월드를 카메라 기준 공간(view space)으로 변환합니다. 카메라 자체는 origin에 고정되어 있고 세계가 그 앞을 지나가는 형태입니다. 이 사실을 이해하면 "카메라를 왼쪽으로 움직였는데 오브젝트가 오른쪽으로 이동해 보이는 것"이 버그가 아니라 정상임을 즉시 알 수 있습니다.
viewMatrix = lookAt(cameraPos, targetPos, worldUp)
viewSpacePos = viewMatrix * worldSpacePosperspective와 orthographic의 선택이 게임의 공간 감각을 결정한다
perspective projection은 멀수록 작아 보이는 원근감을 만들어 3D 세계가 실제처럼 느껴지게 합니다. 반대로 orthographic은 거리에 관계없이 크기를 유지하므로 격자 정렬, 등축도법(isometric), 전략 게임 UI, 2D 타일맵에 자연스럽습니다. 혼합 사용도 흔합니다. 예를 들어 3D 씬을 perspective로 그리되 HUD나 미니맵 카메라는 orthographic으로 분리합니다. 선택의 핵심은 "이 뷰에서 원근 왜곡이 감각적으로 맞는가"입니다. 원근 왜곡이 오히려 어색한 경우(ex. 전술 미니맵, 퍼즐 그리드)는 orthographic이 정답입니다.
// 3D 탐험 게임
perspectiveMatrix = projection(fov=60, aspect, near=0.1, far=1000)
// 2D UI 또는 타일맵
orthoMatrix = ortho(left, right, bottom, top, near, far)depth buffer 정밀도가 나쁘면 near/far 범위가 진짜 원인이다
depth buffer는 픽셀마다 "현재까지 그린 가장 앞에 있는 오브젝트의 깊이"를 기록해 뒤에 오는 삼각형을 자동으로 가립니다. 문제는 depth precision이 near와 far plane 사이 전체 범위를 비선형으로 나누기 때문에, near가 너무 작거나 far가 너무 크면 원거리 오브젝트의 depth 구분이 극히 부정확해집니다. 이것이 z-fighting(두 표면이 겹쳐 보이며 깜빡이는 현상)의 주원인입니다. near=0.01, far=10000처럼 범위를 무분별하게 넓히는 것은 근거리 물체에 정밀도를 몰아주고 원거리를 희생시킵니다. 씬 규모에 맞게 near와 far를 최대한 좁혀야 z-fighting 없이 깊끗한 깊이 판정을 얻을 수 있습니다.
// 나쁜 설정: 정밀도 낭비
near=0.001, far=100000
// 씬 규모에 맞는 설정
near=0.3, far=500 // 캐릭터 게임의 현실적 범위카메라 문제는 이동, projection, depth 세 영역으로 분리해 진단한다
카메라 버그는 세 종류가 섞여 보이기 쉽습니다. 오브젝트가 갑자기 잘린다면 near/far clipping 문제, 크기 비율이 이상하면 projection 설정 문제, 가려짐이 이상하면 depth buffer 설정 문제일 가능성이 높습니다. 시스템이 커질수록 shadow camera, reflection camera, minimap camera가 추가되는데, 각각 자신만의 view matrix와 projection 범위를 가져야 합니다. 주 카메라 설정과 다른 카메라가 혼선을 일으키는 경우도 흔합니다.
카메라와 depth를 읽을 때 핵심
| 상황 | 적합한 선택 |
|---|---|
| 3D 탐험, 액션 게임 뷰 | perspective projection, fov 60~90도 범위 |
| 2D 타일맵, UI 카메라 | orthographic projection |
| 원거리에서 z-fighting 발생 | near/far 범위를 씬 규모에 맞게 좁히기 |
| 오브젝트가 갑자기 잘림 | near clipping plane 값 점검 |
| 그림자 카메라 따로 설정 | shadow camera에 맞는 orthographic 범위 설정 |
| 월드는 3D인데 HUD는 왜곡 없이 보여야 할 때 | 메인 카메라는 perspective, UI 카메라는 orthographic 분리 |
특이 케이스와 주의할 점
흔한 실패는 "멀리 있는 것도 다 보여야 한다"는 이유로 near를 너무 작게, far를 너무 크게 잡는 것입니다. 그러면 z-fighting과 깊이 깜빡임이 생기고, 원인을 셰이더나 모델 문제로 오해하기 쉽습니다. 카메라 문제는 이동, projection, depth precision 세 축으로 나눠서 보세요.
참고 링크
2 sources