map을 구성할 때 요소값이 ‘1’이면 벽, ‘0’이면 길로 정의했습니다. hasWallAt는 현재위치가 벽인지 길인지를 판별해주는 함수입니다.
벽이 아닐때만 플레이어의 위치가 업데이트되도록 하면서 벽을 통과하지 못하게만들어줄 수 있습니다.
4️⃣ 가상 3D 구현
(1) 3D 구현의 원리
플레이어의 위치로부터 60도 이내의 범위내에서 일정한 각도로 광선을 쏩니다. 이것을 통해 object(물체)와 플레이어의 거리를 유추할 수 있습니다.
일정한 각도마다 발사된는 광선의 각도를 지정해줄 수 있습니다.
< 각도를 크게했을 때 >
< 각도를 촘촘하게 했을 때 >
플레이어를 중심으로 좌우 30도씩 60도의 범위로 광선을 쏘게 됩니다.
각도가 0으로 지정된 가장 왼쪽의 광선으로 부터 사용자가 지정해준 각도만큼 순차적으로 광선을 쏘게되면 이 광선으로 부터 object(물체)의 거리를 측정하게 됩니다. 위의 그림과 같이 맵요소 '1'(벽)을 만난 광선은 더이상 진행하지 않도록 설정해줄 것이며 이 곳에 가상의 3D벽이 나타나게 할 것입니다.
< 새로줄 기준 >
< 가로줄 기준 >
각 광선마다 새로줄과 가로줄따로따로 맵의 요소가 ‘1’(벽)인 곳의 길이를 구합니다.
새로줄 기준(a)일 때와 가로줄 기준(b)의 길이중 짧은 값이 벽의 위치값이 되며 드디어 가상의 벽이 출력됩니다.
(2) 각광선의 각도에 의존적인 각벽의 셀
< 각도를 크게했을 때 >
< 각도를 촘촘하게 했을 때 >
가상3D의 벽은 충돌지점에 직사각형모양(사용자 시점)으로 생기기 때문에 각 광선의 사이 각도가 크면 부자연스러워 보입니다.
광선의 각도가 촘촘할 수록 좀 더 자연스럽게 보입니다.
(3) 벽의 굴곡현상
플레이어의 시야는 좌우 30도씩 총 60도입니다. 이론적으로 중심으로부터 양옆의 30도(끝)인 부분의 광선의 길이가 깁니다.
그렇기 때문에 위와같이 같은 벽일지라도 굴곡이 생기게 됩니다. 벽과의 거리가 가까워질 수록 굴곡이 점점 심해지게 됩니다.
이러한 굴곡은 이론적으로 정확한 출력입니다 하지만 현실세계에서 두개의 눈으로 실제로 보이는 물체의 거리를 보정(?)해주기 때문에 이러한 굴곡은 불편합니다.