치춘짱베리굿나이스

[Rank 4] Cub3D - Raycasting 기초 본문

42/42s Cursus

[Rank 4] Cub3D - Raycasting 기초

치춘 2022. 3. 31. 15:13

Raycasting 기초

계산에 필요한 벡터들

  • 현재 플레이어의 위치를 나타내는 위치벡터 pos
  • 플레이어의 시점 방향을 나타내는 방향벡터 dir
  • 카메라 평면을 나타내는 방향벡터 plane

해당 벡터들 계산법

  • pos는 (0, 0)을 기준으로 현재 플레이어의 위치 좌표를 나타낸다
  • dir은 방향벡터이며 단위벡터이므로, 길이는 1로 초기화된다
    • dir의 시작점은 어디이던지 상관없음 ⇒ (0, 0)으로 가정
  • planedir과 항상 수직이며, 길이는 구현하고자 하는 시야각에 따라 다름
    • 후술하겠지만 시야각은 dirplane의 길이 비율에 따라 결정되며, 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 모두 같은 방향으로 같은 각도만큼 회전되므로, 동일한 행렬을 곱하여 회전한다
Comments