-
Lerp(선형보간) 이해하기언리얼 2022. 11. 12. 23:30
언리얼에서는 액터에 spline을 할당한 뒤, spline 경로에 따라 애니메이션 되는 기능을 구현하고 싶었다.
타임라인 노드와 Lerp 노드를 활용하여 움직임의 속도를 조절하고 싶어서 유튜브를 찾아보다가
https://www.youtube.com/watch?v=-V6D5WtemMI
이 영상을 참고하게 되었는데..
막상 쓰려고 하니 이해가 잘 되지 않아 Lerp에 대한 개념 정리가 필요했다.
타임라인 기능이 유니티의 코루틴과 유사한 기능을 수행하는 것 같아서 유니티와 함께 이해해보려 했다.
밑의 영상을 참고했다.
https://www.youtube.com/watch?v=_QOvSLCXm7A
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LerpMove : MonoBehaviour { public Transform startPosition; public Transform endPosition; public float lerpTime = .5f; float currentTime = 0; // Start is called before the first frame update void Start() { this.transform.position = startPosition.position; StartCoroutine("Move"); } public IEnumerator Move() { while(true) { currentTime += Time.deltaTime; if (currentTime > lerpTime) { yield break; } float t = currentTime / lerpTime; t = Mathf.Sin(t * Mathf.PI * .5f); Debug.Log("t : " + t); this.transform.position = Vector3.Lerp(startPosition.position, endPosition.position, t); yield return null; } } }
여기서 currentTime / lerpTime 식을 통해 지정한 시간만큼 일정한 간격으로 t의 값이 변화하게 되는데,
lerpTime이 10이고 1초마다 currentTime이 갱신된다고 가정하면,
1초에는 10분의 1만큼의 t의 값을 가지고 2초에는 2분의 10의 t값을... 이런식으로 t의 값이 변화한다.
t = Mathf.Sin(t*Mathf.PI*0.5f)의 식을 통해 t의 값이 sin 그래프 형태의 값을 갖는다.
따라서 Lerp(startPosition.position, endPosition.position, t)를 통해 this.transform.position의 값은
시작점 위치에서 끝 점까지의 위치까지 sin 그래프 모양의 값의 변화를 반영하게 되는 것이라 볼 수 있다.
즉, sin 그래프의 기울기가 처음에는 급하다가 나중에는 완만하게 변화하는데,
이를 transform.position(해당 오브젝트의 위치)이 반영하여 처음에는 빠르게 위치값이 변하다가
끝점에 갈 수록 속도가 느려지는 것을 확인할 수 있다.
해당 코드를 실행시킨 결과물이다.
https://www.youtube.com/watch?v=N2thkTiyjLE
타임라인에 생성해 준 그래프 모양 그래프와 선형 보간을 이용한 블루프린트 타임라인에 지정해준 그래프는 유니티에서 t의 값에 sin 그래프를 적용해 준 것과 같은 의미를 같는 것 같다.
타임라인 그래프를 lerp 노드에 연결해주어 0부터 spline의 끝 지점까지의 값의 변화를
타임라인의 그래프 모양의 속도에 맞춰 값을 변화시켜 주는 듯 하다.
따라서 Target Char가 spline의 모양대로 Location 값을 갖되,
타임라인이 갖는 그래프의 기울기 변화와 같은 속도를 갖게 되는 것이라 생각하면 될 것 같다.
spline 모양에 따라 player를 움직이게 하는 전체 블루프린트 '언리얼' 카테고리의 다른 글
액터 구하기 (0) 2022.11.17 벡터 혹은 로테이터 값을 갖는 항목 분할하기 (0) 2022.11.17 이벤트 디스패처 (0) 2022.11.07 언리얼 블루프린트 인터페이스 (0) 2022.11.07 나이아가라 파티클 시스템과 캐스케이드 파티클 시스템 블루프린트에서 생성하는 노드 (0) 2022.11.04