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
);
스플라인 위에서 액터를 움직일 때 어떤 값을 멤버 변수로 들지가 초반 결정 중 하나인데, 위에서 정리한 이점들을 한 번에 얻을 수 있어서 내 프로젝트에서는 누적 거리 하나로 두는 방식으로 정리했다
'etc' 카테고리의 다른 글
| 자율주행 차량 조향 가중치를 곡률에 따라 동적 조정하기 (Lerp 활용) (0) | 2026.05.13 |
|---|---|
| 언리얼 벡터로 도로 이탈 거리 구하기, Cross-Track Error 계산 과정 (0) | 2026.05.13 |
| 언리얼 스플라인 경로 추종 차량 조향, Pure Pursuit + Heading + Cross-Track 블렌딩으로 정리한 과정 (0) | 2026.05.13 |
| 언리얼 스플라인 경로 추종 차량 구조 설계 (Actor, Pawn, Component 분리) (0) | 2026.05.13 |
| Big-O 표기법이란? (0) | 2026.04.13 |
