치춘짱베리굿나이스
[Rank 4] Cub3D - Raycasting 기초 본문
Raycasting 기초
계산에 필요한 벡터들
- 현재 플레이어의 위치를 나타내는 위치벡터
pos
- 플레이어의 시점 방향을 나타내는 방향벡터
dir
- 카메라 평면을 나타내는 방향벡터
plane
해당 벡터들 계산법
pos
는 (0, 0
)을 기준으로 현재 플레이어의 위치 좌표를 나타낸다dir
은 방향벡터이며 단위벡터이므로, 길이는 1로 초기화된다dir
의 시작점은 어디이던지 상관없음 ⇒ (0, 0
)으로 가정
plane
은dir
과 항상 수직이며, 길이는 구현하고자 하는 시야각에 따라 다름- 후술하겠지만 시야각은
dir
과plane
의 길이 비율에 따라 결정되며,dir
의 길이는 1로 고정시키고 plane의 길이를 조절하게 된다
- 후술하겠지만 시야각은
광선의 방향 계산
- 광선은
pos
의 끝점부터 시작하여plane
벡터 위의 어느 한 점을 끝점으로 갖는다 - 이때 시작점은 고정이므로 끝점이 어디인지에 따라 광선의 방향이 달라지며, 광선의 끝점은
plane
벡터에 가중치를 곱해 구한다 - 간단한 벡터의 합으로
dir
벡터와plane * 가중치
벡터의 합이 광선벡터를 나타낸다는 것을 알 수 있다
플레이어의 시야각 계산
- 앞서 설명했듯 시야각은
plane
벡터와dir
벡터의 길이에 영향을 받으며,dir
벡터의 길이는 1로 고정되므로plane
벡터의 길이에 따라 시야각이 달라진다plane
벡터와dir
벡터의 길이가 같을 경우, 시야각은 90도이다plane
벡터보다dir
벡터가 더 길 경우, 시야각은 예각이다plane
벡터가dir
벡터보다 길 경우, 시야각은 둔각이다
- 어떤 게임을 구현하는지에 따라 시야각을 조절하며, Cub3D의 기초가 되는 Wolfenstein과 같은 1인칭 FPS는 주로
dir
:plane
= 1 : 0.66 정도로 맞추어 구현한다
시야각의 회전
- 레이캐스팅에서 플레이어의 시선 회전을 구현하기 위해선, 플레이어의 시선 방향을 나타내는
dir
벡터와 카메라 평면 = 화면에 비춰질 물체들을 결정하는plane
벡터를 동시에 회전시켜야 한다
- 북쪽을 바라보던 플레이어의 시선을 θ만큼 시계방향으로 회전시킨다고 생각해 보자 (시계 방향으로 회전할 때 각도가 양수라고 가정)
- 벡터의 회전은 벡터에 삼각함수로 이루어진 행렬을 곱하는 것으로 구현할 수 있다
dir
,plane
모두 같은 방향으로 같은 각도만큼 회전되므로, 동일한 행렬을 곱하여 회전한다
'42 > 42s Cursus' 카테고리의 다른 글
[Rank 4] Cub3D - Raycasting 구현 ② 반복문의 동작 (0) | 2022.04.01 |
---|---|
[Rank 4] Cub3D - Raycasting 구현 ① 변수 설명 (0) | 2022.03.31 |
[Rank 4] Cub3D (0) | 2022.03.31 |
[Rank 3] Minishell - 사용가능 함수 정리 (0) | 2022.02.03 |
[Rank 3] Minishell - 시그널 정리 (0) | 2022.02.03 |
Comments