좌클릭을 하면 해당 위치로 카메라가
부드럽게 이동하도록 하였습니다.
그러나 카메라의 이동이 완료되면
미세하게 떨리는 현상이 발생했죠.
카메라가 프레임당 특정 거리를 이동하도록
설정하고 기존 위치에서 특정 거리를 더해가며
기존 위치와 목표 위치의 좌푯값의 차이가
0 이하이면 도착한 것으로 보고 멈추는 방식으로
진행하였죠. 근데 특정 거리를 더하다 보면
목표 좌푯값을 넘어갈 수 있는 것이죠.
넘어가게 되면 카메라가 다시 반대로 이동하고,
반대로 이동하다가 또 목표 좌푯값을 넘어가면
다시 반대로 이동하게 되면서 떨리는 것처럼
보이는 겁니다.
이를 해결하기 위해 카메라가 목표 위치로
이동하는 방식을 수정해야 합니다.
먼저 카메라 클래스에
카메라가 클릭한 위치로 이동하는데
얼마만큼의 시간이 걸리도록 할 것이냐를 나타내는
멤버 m_fTime와 매 프레임마다 흐른 시간을
누적하여 저장하는 멤버 m_fAccTime,
카메라의 이동 속도를 저장하는 멤버 m_fSpeed를
선언합니다.
카메라의 위칫값을 설정하는
SetLookAt 함수도 변화를 주었습니다.
목표 위칫값을 저장하는 m_vLookAt에서
이전 카메라의 위칫값을 저장하는 m_vPrevLookAt을
빼고 Length 함수를 통해 얻은 값을 fMoveDist에
저장합니다.
fMoveDist에는 두 벡터 사이의 거리가 저장되죠.
fMoveDist을 m_fTime로 나누고 그 결과를 m_fSpeed에 저장합니다.
( m_fTime의 값은 카메라 생성자에서 초기화해 줍니다. )
그럼 m_fSpeed에는 m_vPrevLookAt 벡터에서
m_vLookAt 벡터로 가는데 m_fTime만큼 걸린다고 하였을 때
프레임당 어느정도의 속도로 카메라가 이동해야 하는지,
그에 대한 속도값이 저장될 겁니다.
SetLookAt 함수가 호출되는 시점은
카메라 이동이 시작되기 전이나, 이미 완료된 후이므로
m_fAccTime을 0으로 설정해 줍니다.
카메라 클래스의 CalDiff 함수도 수정을 해야 합니다.
m_fAccTime과 fDT( Delta Time )을
더하여 m_fAccTime에 대입합니다.
CalDiff 함수는 update마다 호출됩니다.
즉 매 프레임 호출되므로 m_fAccTime에는
프레임이 진행될 때마다 걸린 시간이
누적되어 저장되겠죠.
m_fAccTime에 저장된 누적 시간이
설정한 m_fTime에 저장된 시간과
같거나 이를 넘어가면 m_vCurLookAt에
m_vLookAt을 대입합니다.
m_fAccTime의 값이 미리 설정한 m_fTime 값과
같거나 넘었다는 것은 카메라가 목표 위칫값으로
이동하는 시간이 지났다는 것이죠.
현재 카메라 위칫값을 나타내는 m_vCurLookAt에
목표 위칫값을 나타내는 m_vLookAt을 대입함으로써
카메라가 목표 위칫값에 도착했다고 보는 것이죠.
근데 그게 아니고 아직 카메라가 더 이동해야 하는
시간이 남았다고 하면 카메라의 목표 위칫값에서
카메라의 이전 위칫값을 빼고 vLookDir에 저장합니다.
vLookDir를 Normalize 함수를 통해 정규화하여
vLookDir이 갖고 있는 방향을 얻은 뒤,
m_fSpeed와 fDT를 곱하고 m_vPrevLookAt를 더하여
카메라 이전 위칫값에서 특정 방향을 향해,
프레임당 특정 속도로 이동할 수 있도록 합니다.
이를 m_vCurLookAt에 저장하여
현재 카메라의 위칫값을 나타내 줍니다.
이제 카메라가 목표 위치에 도착하면
값을 딱 세팅해 주므로 떨림 현상이 사라질 겁니다.
또한 카메라가 좌클릭한 위치로 이동하는데
걸리는 시간을 정해주었으므로 기존 카메라 위치에서
가까운 곳을 클릭하면 설정한 시간에 걸쳐 느리게 이동하며,
먼 곳을 클릭하면 설정한 시간에 걸쳐 빠르게 이동하게 됩니다.
카메라가 초기 위칫값으로부터 얼마만큼
이동했는지 나타내는 m_vDiff의 값을 구할 때,
m_vCurLookAt을 이용하여 값을 구해야 하고
프레임이 끝날 때마다 카메라의 이전 위칫값을 나타내는
m_vPrevLookAt에 카메라의 현재 위칫값을 나타내는
m_vCurLookAt을 대입하여 이전 위칫값을 프레임마다
갱신해 줘야 합니다.
강의 출처 : https://www.youtube.com/watch?v=7eb73rL6uOU
'Win32 API > 기초' 카테고리의 다른 글
Win32 API 기초 : Tool (1) (1) | 2024.11.24 |
---|---|
Win32 API 기초 : Unity Build (0) | 2024.11.23 |
Win32 API 기초 : Camera (2) (4) | 2024.10.05 |
Win32 API 기초 : Camera (1) (2) | 2024.10.04 |
Win32 API 기초 : Animation (4) (0) | 2024.09.01 |