- 개요

이전에 알아본 수식을 사용하여 원근 투영 행렬을 생성한다
이때 모델링 행렬과 뷰 행렬에서 사용하는 행렬은 4 X 4 크기의 행렬이므로
행렬 곱을 위해 네 번째 행과 열을 단위 벡터로 채워 원근 투영 행렬을 생성한다
위 원근 투영 행렬에서 a는 종횡비를 의미하고, d는 초점거리를 의미한다
- 예제 코드
1) 카메라 설정으로부터 투영 행렬을 생성하는 코드

프로젝트에서 카메라의 역할을 수행하는 CameraObject를 위와 같이 구성하였다
초점거리 d를 구하기 위한 시야각을 의미하는 멤버변수 _FOV를 구현하고
GetPerspectiveMatrix 함수를 호출하여 원근 투영 행렬을 생성한다

GetPerspectiveMatrix 함수의 로직은 위와 같다
화면의 크기 정보를 바탕으로 종횡비를 계산하고 종횡비의 역수를 계산한다
시야각의 절반 값을 사용하여 초점거리 d를 계산한다
위에서 계산한 값을 사용하여 원근 투영 행렬을 생성하고 반환한다
2) 원근 투영 행렬을 적용한 렌더링 로직

게임 로직을 담당하는 Update3D 함수를 위와 같이 구현한다
fovSpeed 로컬 변수를 사용하여 시야각 FOV를 조절하는 속도를 지정하고
minFOV 로컬 변수와 maxFOV 로컬 변수를 사용하여 시야각의 최솟값 + 최댓값을 지정한다
W축 입력을 받아 현재 프레임에서 발생한 카메라 시야각의 변화량을 계산하고 카메라 시야각의 값의 범위를 제한한다

렌더링 로직을 담당하는 Render3D 함수를 위와 같이 구현한다
pMatrix 로컬 변수를 사용하여 카메라에서 얻어온 원근 투영 행렬을 저장한다
이후 원근 투영 행렬을 정점 변환에 사용하는 최종 행렬에 반영한다
최종적으로 카메라의 위치와 시야각의 값을 화면에 출력한다
3) 변경된 삼각형을 그리는 로직

원근 투영 행렬을 적용하여 최종 계산된 벡터는 클립 좌표의 값을 가지므로
이 값만으로는 화면을 구성할 수 없으므로 마지막 Z 차원의 값을 나눠 NDC로 변환해야 한다
이때 변환된 NDC 값의 범위는 [-1, 1]이므로 화면의 해상도 크기로 확장해주어야 한다
이를 반영하여 삼각형을 그리는 DrawTriangle3D 함수의 로직은 위와 같이 구성하였다
- for문을 사용하여 클립 좌표를 NDC 좌표로 변경
- Z값이 무한 원점인 경우 보정
- Z값의 역수를 계산한 후에 그 값을 클립 공간의 세 요소에 곱하여 NDC로 변환
- 왼손 좌표계로 변경되었으므로 다음과 같이 처리
- 오른손 법칙으로 생성된 외적은 클립 공간에서는 음의 방향이므로 부호 반전을 통해 방향 전환
- 시선 방향도 양의 방향으로 변경
- 화면 크기의 절반을 곱해 NDC 좌표를 화면의 해상도 크기로 확장
- 최종 실행 결과

'수학 > 이득우의 게임 수학 - 실습 예제' 카테고리의 다른 글
| 캐릭터 얼굴에서 발생한 왜곡 보정 (0) | 2026.06.10 |
|---|---|
| 깊이 값을 적용하여 화면에 원근감 부여하기 (0) | 2026.06.03 |
| 3차원 공간에서의 자유로운 회전 (0) | 2026.05.06 |
| 백페이스 컬링의 구현 (0) | 2026.05.06 |
| 벡터의 외적을 활용한 카메라 구현 (0) | 2026.04.29 |