유니티/이동

[유니티(Unity)] 좌표이동 - Vector3.Slerp 이동

RꞮbble 2026. 5. 4. 22:25


정의

  • 구면 선형 보간을 이용하여 시작점과 도착점 사이를 T(0~1 사이 비율값)값으로 위치를 계산해 원형 곡선으로 오브젝트를 이동 
  • 고정된 좌표 이동이 아닌 현재 시점과 도착 시점의 보간된 좌표로 이동하는 방법 
  • 시작점과 도착점 사이를 비율(T)을 기반으로 위치를 계산하여 이동하는 것 

 

cf) Slerp = Spherical Linear Interpolation = 구면 선형 보간 = 시작점과 끝점 사이의 수치를 T값에 따라 원형 곡선으로 계산하는 것 

cf) 왜 Vector3.Lerp 이동은 부드럽게 이동이 되는가? 
     -> 시작지점과 도착지점 사이를 비율(t)로 이동한다. 그렇기 때문에 시작점과 도착점 사이 무수히 많은 지점들을 프레임 단위로 이동한다. 이 지점들을 따라서 이동하니 부드럽게 이동하는 것처럼 보인다. 


 

사용 이유

  • 오브젝트를 곡선 모양으로 부드럽게 이동하기 위해서 
  • 중심점으로부터 거리를 유지하면서 이동하기 위해서
    ex) 공전, 회전 운동 

 

언제 사용해야 하는가

  • 어떤 대상을 향해 곡선 모양으로 이동하기 위해서 
    ex) 해가 동쪽에서 서쪽으로 질 수 있도록 이동시킬 때, 마사일이 포물선 모양으로 목표물을 향해 이동시킬 때

 

사용 방법

 
함수 정의

 

public static Vector3 Slerp(Vector3 a, Vector3 b, float t);
  • a = 시작 지점 위치 (Vector3)
  • b = 도착 지점 위치 (Vector3)
  • t = 비율 = 시작점(a)과 도착점(b) 사이 중 현재 어느 정도 진행되었는지에 대한 비율 (0~1 사이 값)

 
ex) 

 

⚠️ Slerp는 (0, 0, 0)을 중심으로 좌표가 계산된다. 

사실 Slerp는 시작점에서 도착점까지 곡선 모양으로 이동시켜주진 않는다. 왜냐하면 Slerp는 기본적으로 원점(0, 0, 0)을 중심으로 좌표가 계산되기 때문이다. 

 

using UnityEngine;

public class Test : MonoBehaviour
{
    public Transform startPos;
    public Transform midPos;
    public Transform endPos;

    private float _duration = 1.5f;
    private float _timer = 0.0f;

    private void Update()
    {
        Vector3 sPos = startPos.position - midPos.position;
        Vector3 ePos = endPos.position - midPos.position;

        if(_timer < _duration)
        {
            _timer += Time.deltaTime;

            float t = _timer / _duration;

            Vector3 slerpPoint = Vector3.Slerp(sPos, ePos, t);

            transform.position = slerpPoint;
        }
    }
}

원점(0, 0, 0)을 중심으로 Slerp

 

 

💡 시작점에서 도착점까지 곡선 모양으로 이동시키려면 Slerp로 계산된 좌표에 중간점을 더해주면 된다. 

중간점은 시작점과 도착점 사이 좌표이므로, Slerp로 계산된 좌표에 중간점을 더해주면 시작점에서 도착점까지 곡선으로 이동시킬 수 있다. 

 

보라색 선 = 원점 중심 이동, 빨강색 선 = 원점 + Slerp 좌표 중심 이동

 

using UnityEngine;

public class Example : MonoBehaviour
{
    public Transform startPos;
    public Transform midPos;
    public Transform endPos;

    private float _duration = 1.5f;
    private float _timer = 0.0f;

    private void Update()
    {
        Vector3 sPos = startPos.position - midPos.position;
        Vector3 ePos = endPos.position - midPos.position;

        if(_timer < _duration)
        {
            _timer += Time.deltaTime;

            float t = _timer / _duration;

            Vector3 slerpPoint = Vector3.Slerp(sPos, ePos, t);

            transform.position = slerpPoint + midPos.position;
        }
    }
}

 

 

Vector3.Slerp 이동 장점

  • 부드러운 곡선 이동 연출이 가능하다. 
  • 시작점과 끝점이 중심점으로서부터 같은 거리에 있다면, 이동하는 동안 그 거리를 유지한다. 

 

 

Vector3.Slerp 이동 단점

  • Lerp보다 연산 비용이 비싸다. (Lerp는 단순 덧셈, 곱셈 연산, Slerp는 삼각함수 연산 수행)
  • 기본적으로 원점(0, 0, 0)을 기준으로 좌표가 계산되기 때문에 필요하다면 프로그래머가 좌표를 보정하는 과정이 필요하다. 
    이 과정에서 계산 실수할 수도 있고 코드가 복잡해질 수도 있다. 
    ex) 시작점(0, 0, 0)에서 끝점(0, 2.5, 4)까지 포물선으로 이동하고자 할때 Slerp로 계산된 좌표에 중간점 좌표를 더해야 함. 
  • 기계적으로 이동하는 것처럼 보인다.