오늘은 lerp와 slerp에 대해 알아보고자 합니다.
lerp와 slerp 모두 부드러운 움직임을 표현하기 위해 사용한다 정도만 알고 있었는데,
실습하면서 이와 관련한 문제가 나와 이참에 한번 정리해 봤습니다.
선형 보간(lerp) :
두 지점을 선형으로 연결해 두 지점 사이에 위칫값을 구하는 방법
(직선거리에 따라 선형적(비례적) 계산)
유니티에서 제공하는 선형 보간 함수는
Vector3.Lerp, Mathf.Lerp, Color.Lerp, Quaternion.Lerp 등 다양한 형태로 제공됩니다.
// Unity에서의 Lerp 사용 예시
transform.position = Vector3.Lerp(startPos, endPos, time);
https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html
종종 값이 도달하지 못하고, 매우 가깝지만 정확하지 않은 값으로 끝나는 경우가 있는데,
이는 Lerp가 완료되었는지 측정하는 데 사용되는 값이
실제 Lerping되는 값이 아니라 시간이기 때문입니다.
따라서
근사값(Mathf.Approximately)를 사용하여 이를 처리하는 게 일반적인 듯 합니다.
구면 선형보간(Slerp) :
두 지점 사이를 곡선으로 연결해 파악하여 값을 구하는 방법입니다.
// Unity에서의 Slerp 사용 예시
transform.rotation = Quaternion.Slerp(startRotation, endRotation, time);
주로 Slerp는 회전에 많이 사용되는데
그 이유는 lerp가 가장 짧은 회전 경로를 선택하려고 하기 때문입니다.
아래 참고한 유튜브 채널에서
lerp를 사용하여 회전하면 180도이상 회전 시
목표 회전에 도달하기 위해 부자연스러운 회전을 하는 걸 확인 할 수 있었습니다.
https://docs.unity3d.com/ScriptReference/Vector3.Slerp.html
등속 운동 말고 속도를 점점 늦추는 저하 효과를 주고 싶다면
이에 특화된 SmoothDamp가 있습니다.
SmoothDamp
transform.position = Vector3.SmoothDamp(
transform.position, // 현재 위치
targetPosition, // 목표 위치
ref velocity, // 현재 속도
smoothTime, // 목표 도달 시간
maxSpeed, // 최대 속도 (선택적)
Time.deltaTime);
https://docs.unity3d.com/ScriptReference/Vector3.SmoothDamp.html
마무리
오늘은 간단하게 선형보간과 구면선형보간에 대해 정리해 보았습니다.
색 변환부터 카메라 움직임, 패이드 인아웃, 애니메이션 등
정리하다보니 lerp가 생각보다 많이 쓰이더군요.
이래서 기초가 중요한가 봅니다. ;;
참고한 자료
https://www.youtube.com/watch?v=IymDGkzwJts&t=367s
https://gamedevbeginner.com/the-right-way-to-lerp-in-unity-with-examples/
The right way to Lerp in Unity (with examples)
Learn to animate buttons, move objects and fade anything - the right way - in my in-depth guide to using LERP in Unity (including copy / paste examples).
gamedevbeginner.com
선형 보간(lerp)과 구면 선형 보간(slerp)
선형 보간 법 사원수의 선형 보간:
nobilitycat.tistory.com
https://youtu.be/gnO1GVRuKxk?si=TmUyBvYoh3Qsv2eg