2014. 9. 10.

유니티 Vector3.Lerp() 란 무엇인가?

유니티의 Vector3에 있는 Lerp() 함수는 API를 찾아보면
static Vector3 Lerp(Vector3 from, Vector3 to, float t);
구조로 이루어져 있으며, 두 벡터(from, to) 사이의 시간에 따른 위치를 구할 때 사용됩니다.
위 그림에 나온 것처럼 Lerp() 함수안에 시작벡터와 목표벡터를 넣고, 마지막 인자에는 0.0~1.0 사이의 값을 넣는데 이 값이 0.0 = 0%, 1.0 = 100% 라고 생각하시면됩니다. 위 그림처럼 0.5를 넣으면 50%니 시작벡터와 목표벡터의 중간에 있는 벡터값이 나오게 되고, 0.0은 0%니 시작벡터가 1.0은 100%니 목표벡터가 나오게 됩니다. 이를 이용해서 한 템포 늦게 플레이어를 따라가는 카메라를 구현한 예제입니다.
using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour
{
 
  public GameObject playerObject = null;
  public float cameraTrackingSpeed = 0.2f;
  private Vector3 lastTargetPosition = Vector3.zero;
  private Vector3 currentTargetPosition = Vector3.zero;
  private float currentLerpDistance = 0.0f;
 
  void Start ()
  {
    // Set the initial camera positioning to prevent any weird jerking
  
    // around
    Vector3 playerPos = playerObject.transform.position;
    Vector3 cameraPos = transform.position;
    Vector3 startTargetPos = playerPos;
  
    lastTargetPosition = startTargetPos;
    currentTargetPosition = startTargetPos;
    currentLerpDistance = 1.0f;
  }
 
  void LateUpdate ()
  {  
    trackPlayer ();
  
    // Continue moving to the current target position
    currentLerpDistance += cameraTrackingSpeed;
    transform.position = Vector3.Lerp (lastTargetPosition, currentTargetPosition, currentLerpDistance);
  }
 
  void trackPlayer ()
  {
    // Get and store the current camera position, and the current player position, in world coordinates.
    Vector3 currentCamPos = transform.position;
    Vector3 currentPlayerPos = playerObject.transform.position;
  
    if (currentCamPos.x == currentPlayerPos.x && currentCamPos.y == currentPlayerPos.y) {
      // Positions are the same - tell the camera not to move, then abort.
      currentLerpDistance = 1f;
      lastTargetPosition = currentCamPos;
      currentTargetPosition = currentCamPos;
      return;
    }
  
    // Reset the travel distance for the lerp
    currentLerpDistance = 0f;
  
    // Store the current target position so we can lerp from it
    lastTargetPosition = currentCamPos;
  
    // Store the new target position
    currentTargetPosition = currentPlayerPos;
  }
}
Lerp() 함수의 시작벡터에 현재 카메라 위치를 목표벡터에 현재 플레이어 위치를 넣고, 마지막 인자(currentLerpDistance)에는 프레임마다 카메라 추적 속도(0.2)를 누적해서 더해준 값을 넣어, 프레임마다 20%씩 카메라가 플레이어를 따라잡게 됩니다. 5프레임이 지나면 currentLerpDistance는 1.0이 되어 유저와 카메라의 위치가 같아지게 되고, currentLerpDistance의 값이 0f로 초기화 됩니다.

0 개의 댓글:

댓글 쓰기