선형보간 (Lerp)
선형 보간(Linear Interpolation)이란 두 점 a, b 사이의 값(c)를 구하기 위해 a-b 두 점을 연결한 직선을 만들어 사이 값을 계산하는 방법이다.
유니티에서 Lerp는 선형 보간을 사용하여 부드러운 움직임을 표현하기 위해 Update()에서 넣어 사용하거나, 두 image를 blend 해서 하나의 material로 만들 때 주로 사용한다.
Mathf.Lerp(float a, float b, float t)
Lerp는 a, b 사이의 t(0 ~ 1) 만큼 위치한 값 c를 위와 같은 선형 보간 공식을 통해 구해준다.
여기서 t는 percet의 개념(0 ~ 1)이기 때문에 t = 0이면 a, t = 1이면 b와 같다.
void Update()
a = Mathf.Lerp(a, b, 0.5f);
Lerp를 사용하여 부드러운 움직임을 만드는 방법은 t의 값을 0.5로 설정해 a-b 이동 구간의 절반만큼을 지속적으로 이동해주는 것이다. Update() 함수가 호출되는 동안 매 프레임마다 c의 위치는 위 그림과 같이 움직일 것이고, 목표 지점에 근접할 수록 더욱 부드러운 움직임을 나타내게 된다.
float speed = 2f;
void Update()
a = Mathf.Lerp(a, b, Time.deltaTime * speed);
Lerp() 함수에서 t의 값은 특정한 인자가 아니라, Time.deltaTime을 이용해서 선언해주기도 한다. Time.deltaTime은 단위 프레임 당 시간 변화량을 의미하는데 보통 0.016초 ~ 0.18초 사이의 값을 가진다. Update() 함수 호출 시, PC 사양과 성능 또는 인터넷 환경에 따라 일정하지 않는 프레임 간 시간 간격이 발생할 수 있다. 그런 경우 고정 인자값을 넘겼을 때 불규칙한 움직임으로 인해 간격의 오차가 발생하게 된다. 그러한 문제를 해결하기 위해 Time.deltaTime으로 각 프레임의 정확한 시간 변화량을 구해 정확한 이동 변화량을 계산하게 된다. 더욱이 speed 변수 값을 곱해주어 좀더 빠르거나 느리게 움직임을 조정할 수 있다.
※ t 값을 Time.deltaTime으로 받아올 경우 b 목표값(1)에 영원히 도달하지 못하고 0.9999999....에서 값이 멈추게 된다. 따라서 목표값에 도달했는지 여부를 파악하려면 " c == 1 "이 아닌, " c >= 0.99999f " 와 같이 최소한의 오차를 포함하여 판단해야 한다.
Lerp의 활용도
시간에 따라 초기 위치에서 목적지까지 일정한 시간에 도달하기 위해서도 Lerp()함수를 사용하긴 한다.
currentTime += Time.deltaTime;
Vector3.Lerp(transform.position, target.position, currentTime / 2);
t 값이 100%이면 완벽하게 도달한 것을 의미한다. 즉, currentTime을 0, 1, 2처럼 계속 늘려주고 / 2 해주면 1, 결국 100%가 된다. 이런 경우 반드시 해당 시간까지 도착해야하는 경우 사용하는데 리듬게임에서 노트를 찍을 때 사용된다.
알파블렌딩에서 Lerp 공식의 사용
// 알파블렌딩
(1 - a) * s + a * T
RBGA 채널에서 두가지 색을 섞을 때도 다음과 같은 Lerp 함수 공식을 사용한다. 1-a 가 0이면 기본 색이지만 점점 숫자가 커짐에 따라 두가지 색상이 섞이는 것을 표현한다. 색상을 섞을 때 몇 퍼센트 비율로 섞을 지에 대해 고민할 때 사용한다. 이를 응용하면 씬 전환 시 Fade In / Fade Out 기능으로 구현할 수 있다.
EASING IN / EASING OUT, ITWEEN을 이용한 물체의 이동
애니메이션에서 동작 움직임에서도 Lerp 함수를 응용해 다양한 이동을 표현한다.
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
[Unity] 함수 생명주기 LifeCycle, 터널링 현상과 카메라 떨림 버그 해결 방법(FixedUpdate / LateUpdate) (0) | 2022.10.01 |
---|---|
[Unity] 유니티 3D 렌더링 파이프라인과 카메라 뷰 설정 (0) | 2022.09.29 |
[Unity] 이미지와 UV좌표, Light와 그림자 설정을 통한 게임 환경 디자인 (0) | 2022.09.29 |
[Unity] 유니티 라이팅(Lighting) 컴포넌트, 빛 표현과 노멀맵(Normal map) (0) | 2022.09.28 |
[Unity] 유니티 게임 개발 프로젝트 협업 방식과 MVC 패턴 이해 (0) | 2022.09.28 |