42/42s Cursus

[Rank 4] Cub3D - Raycasting 구현 ③ 광선 이동거리 계산 및 보정

치춘 2022. 4. 1. 16:51

광선 이동거리 계산 및 보정

어안렌즈 효과 방지하기

  • 화면에 벽을 출력할 땐 카메라 평면 (plane ⇒ 선) 기준으로 출력됨에도 불구하고 플레이어 기준 (pos ⇒ 점) 으로 거리를 계산하기 때문에 카메라 평면으로부터 벽까지의 거리가 제각각이 된다
  • 카메라 평면의 끄트머리에 가까울 수록 벽까지의 거리가 과도하게 길어져 실제 카메라 평면까지의 거리보다 훨씬 멀게 연산되며 이는 화면의 왜곡을 초래한다

  • 어안렌즈 효과를 방지하기 위해 광선이 벽에 도달했다 하더라도 광선의 이동거리를 바로 구하지 않는다
  • 어안렌즈 효과를 방지한다면 플레이어 시점 (점) 이 아니라 카메라 평면 (선) 까지의 거리를 계산하므로 광선이 정확히 어느 지점에 부딪혔는지도 구할 필요가 없다

perpWallDist

  • 광선의 적중 지점과 카메라 평면 사이의 수직거리
  • 점과 선사이 계산 공식을 사용해도 괜찮지만, 제곱이나 루트 등의 복잡한 연산이 필요하므로 여기서는 직각삼각형의 닮음공식을 사용하여 구하도록 한다

perpWallDist 공식유도

  • 예시에서는 y축과 수직인 벽 (y면) 에 충돌했다고 가정한다 (side = 1)

실제 perpWallDist 구하기

위의 두 수식에서 rayDirX, rayDirY의 값은 이미 알고 있으므로 xDist, yDist만 구하면 된다