치춘짱베리굿나이스

[Rank 4] Cub3D - Raycasting 구현 ⑤ 키 이벤트 본문

42/42s Cursus

[Rank 4] Cub3D - Raycasting 구현 ⑤ 키 이벤트

치춘 2022. 4. 1. 17:43

키 이벤트

시야 회전 (←, →)

  • 플레이어의 시야를 좌우로 회전하기 위해선 시선 (dir벡터 : dirX, dirY) 과 카메라평면 (plane벡터: planeX, planeY) 이 같이 회전되어야 한다

시선 (dir) 회전하기

dirX = dirX * cos(theta) - dirY * sin(theta);
dirY = dirX * sin(theta) + dirY * cos(theta);

카메라평면 (plane) 회전하기

planeX = planeX * cos(theta) - planeY * sin(theta);
planeY = planeX * sin(theta) + planeY * cos(theta);

캐릭터 이동 (w, a, s, d)

  • 카메라평면 (plane) 과 시선벡터 (dir) 는 방향벡터이며, 시작점이 중요하지 않으므로 길이나 방향이 바뀌지 않는 이상 건드릴 필요가 없다
  • 이미지에서도 확인할 수 있듯, 플레이어가 움직여도 plane은 변화가 없다
  • planedir이 영향을 받는 것은 방향이 바뀌는 플레이어 시야 회전 뿐이다

앞뒤로 이동 (w, s)

  • pos 기준으로 정면 (카메라 평면과 수직) 방향을 가리키는 벡터가 dir이다
  • 따라서 앞뒤로 이동할 땐
    • posdir (* 가중치) 을 더하거나 (앞으로 이동)
    • posdir (* 가중치) 을 빼면 된다 (뒤로 이동)
    • 가중치는 플레이어의 이동 속도를 조절하고자 할 때 사용한다
  • 단, 벽 충돌 판정 보너스를 구현하고자 한다면 벽이 아닌 곳으로만 이동할 수 있으므로 조건문을 추가하여 이동을 구현한다

if (!충돌판정)
{
    posX += dirX * WEIGHT;
    posY += dirY * WEIGHT;
}
  • 이때 가중치는 한번에 얼마만큼 이동할 것인지 결정하는 상수이다
  • 가중치가 작을 수록 한 번에 조금씩 이동하므로 플레이어의 속도가 느려진다
  • 가중치가 클 수록 한 번에 많이 이동하므로 플레이어의 속도가 빨라진다

양 옆으로 이동 (a, d)

  • dir을 그대로 곱해주면 되는 앞뒤 이동과는 다르게 양 옆 이동은 dir에 수직인 벡터를 이용해야 한다
  • 이때 dir에 수직인 벡터는 카메라 벡터 (plane) 가 있으며, 길이가 1이 아닌 다른 값을 사용하긴 하지만 가중치를 곱해 속도를 조절할 것이기 때문에 상관없다
 if (!충돌판정)
{
    posX += cameraX * WEIGHT;
    posY += cameraY * WEIGHT;
}
  • 위아래 이동과 같은 방식으로 구현하되, 사용하는 벡터만 카메라 벡터이면 된다
Comments