치춘짱베리굿나이스
[Rank 4] Cub3D - Raycasting 구현 ⑤ 키 이벤트 본문
키 이벤트
시야 회전 (←, →)
- 플레이어의 시야를 좌우로 회전하기 위해선 시선 (
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
은 변화가 없다 plane
과dir
이 영향을 받는 것은 방향이 바뀌는 플레이어 시야 회전 뿐이다
앞뒤로 이동 (w, s)
pos
기준으로 정면 (카메라 평면과 수직) 방향을 가리키는 벡터가dir
이다- 따라서 앞뒤로 이동할 땐
pos
에dir
(* 가중치) 을 더하거나 (앞으로 이동)pos
에dir
(* 가중치) 을 빼면 된다 (뒤로 이동)- 가중치는 플레이어의 이동 속도를 조절하고자 할 때 사용한다
- 단, 벽 충돌 판정 보너스를 구현하고자 한다면 벽이 아닌 곳으로만 이동할 수 있으므로 조건문을 추가하여 이동을 구현한다
if (!충돌판정)
{
posX += dirX * WEIGHT;
posY += dirY * WEIGHT;
}
- 이때 가중치는 한번에 얼마만큼 이동할 것인지 결정하는 상수이다
- 가중치가 작을 수록 한 번에 조금씩 이동하므로 플레이어의 속도가 느려진다
- 가중치가 클 수록 한 번에 많이 이동하므로 플레이어의 속도가 빨라진다
양 옆으로 이동 (a, d)
dir
을 그대로 곱해주면 되는 앞뒤 이동과는 다르게 양 옆 이동은dir
에 수직인 벡터를 이용해야 한다- 이때
dir
에 수직인 벡터는 카메라 벡터 (plane
) 가 있으며, 길이가 1이 아닌 다른 값을 사용하긴 하지만 가중치를 곱해 속도를 조절할 것이기 때문에 상관없다
if (!충돌판정)
{
posX += cameraX * WEIGHT;
posY += cameraY * WEIGHT;
}
- 위아래 이동과 같은 방식으로 구현하되, 사용하는 벡터만 카메라 벡터이면 된다
'42 > 42s Cursus' 카테고리의 다른 글
[Rank 2 / 3] Minitalk / Minishell - 시그널이란 (1) | 2022.04.28 |
---|---|
[Rank 4] Cub3D - Raycasting 심화 - 텍스쳐 입히기 (2) | 2022.04.01 |
[Rank 4] Cub3D - Raycasting 구현 ④ 화면에 벽 그리기 (0) | 2022.04.01 |
[Rank 4] Cub3D - Raycasting 구현 ③ 광선 이동거리 계산 및 보정 (0) | 2022.04.01 |
[Rank 4] Cub3D - Raycasting 구현 ② 반복문의 동작 (0) | 2022.04.01 |
Comments