USplineComponent 위 위치를 누적 거리 float 하나로 표현한 이유

언리얼의 USplineComponent를 따라 액터를 움직일 때, 스플라인 포인트 인덱스를 늘려가는 방식은 작동은 하지만 부자연스럽다. 점 사이를 표현할 수 없고, 점 간격이 균일하지 않으면 속도도 들쭉날쭉해진다.

내 프로젝트에서는 위치를 "시작점부터의 누적 거리" float 하나로 표현하는 방식으로 정리했다

핵심 함수

FVector GetLocationAtDistanceAlongSpline(
    float Distance,
    ESplineCoordinateSpace::Type CoordinateSpace
) const;

 

Distance(cm) 하나로 스플라인 위 어떤 위치든 얻을 수 있어서, 점 사이 보간을 직접 짜지 않아도 됐다

 

 

적용

컴포넌트에 멤버 변수 하나 두기

private:
    float CurrentDistance = 0.f;
void TickComponent(float DeltaTime, ...)
{
    CurrentDistance += Speed * DeltaTime;

    FVector NewLocation = Spline->GetLocationAtDistanceAlongSpline(
        CurrentDistance,
        ESplineCoordinateSpace::World
    );

    OwnerPawn->SetActorLocation(NewLocation);
}


Speed를 외부에서 조절하면 그대로 가속/감속이 된다. DeltaTime의 단위가 초이므로 Speed는 그대로 cm/s가 된다.

 

왜 인덱스 기반이 아니라 거리 기반인가

  • 점과 점 사이를 표현할 수 있다 (인덱스는 정수라 불가능)
  • 진행률을 CurrentDistance / GetSplineLength()로 바로 얻는다
  • 두 액터의 차간 거리를 스플라인 위 기준으로 정확히 잴 수 있다
  • "현재 위치에서 N cm 앞" 같은 전방 미리보기를 같은 함수로 처리한다
// 전방 미리보기 예시
FVector LookAheadPos = Spline->GetLocationAtDistanceAlongSpline(
    CurrentDistance + LookAheadDistance,
    ESplineCoordinateSpace::World
);

 

 

스플라인 위에서 액터를 움직일 때 어떤 값을 멤버 변수로 들지가 초반 결정 중 하나인데, 위에서 정리한 이점들을 한 번에 얻을 수 있어서 내 프로젝트에서는 누적 거리 하나로 두는 방식으로 정리했다

+ Recent posts