Skip to content

Commit 963b364

Browse files
committed
Implement better position calculations
1 parent a9b05ba commit 963b364

1 file changed

Lines changed: 7 additions & 3 deletions

File tree

Source/TrickyAnimationComponents/Private/SplineAnimationComponent.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -428,9 +428,11 @@ void USplineAnimationComponent::AnimateAlongSpline(const float Progress) const
428428

429429
void USplineAnimationComponent::MoveAlongSpline(const float Progress) const
430430
{
431+
// TODO: To use distance offset properly, it's better to calculate distance using CurrentDistance % Length
431432
const float Position = GetPositionAtSpline(CurrentPointIndex, NextPointIndex, Progress);
433+
const float Distance = FMath::Fmod(Position + SplineOffset, SplineComponent->GetSplineLength());
432434
const FVector NewLocation{
433-
SplineComponent->GetLocationAtDistanceAlongSpline(Position + SplineOffset, ESplineCoordinateSpace::World)
435+
SplineComponent->GetLocationAtDistanceAlongSpline(Distance, ESplineCoordinateSpace::World)
434436
};
435437

436438
GetOwner()->SetActorLocation(NewLocation + LocationOffset);
@@ -442,8 +444,9 @@ void USplineAnimationComponent::RotateAlongSpline(const float Progress) const
442444
{
443445
const FRotator CurrentRotation{GetOwner()->GetActorRotation()};
444446
const float Position = GetPositionAtSpline(CurrentPointIndex, NextPointIndex, Progress);
447+
const float Distance = FMath::Fmod(Position + SplineOffset, SplineComponent->GetSplineLength());
445448
const FRotator RotationAlongSpline{
446-
SplineComponent->GetRotationAtDistanceAlongSpline(Position, ESplineCoordinateSpace::World)
449+
SplineComponent->GetRotationAtDistanceAlongSpline(Distance, ESplineCoordinateSpace::World)
447450
};
448451

449452
const float NewRoll = InheritRotation.bX ? RotationAlongSpline.Roll : CurrentRotation.Roll;
@@ -460,7 +463,8 @@ void USplineAnimationComponent::ScaleAlongSpline(const float Progress) const
460463
{
461464
const FVector CurrentScale{GetOwner()->GetActorScale3D()};
462465
const float Position = GetPositionAtSpline(CurrentPointIndex, NextPointIndex, Progress);
463-
const FVector ScaleAlongSpline{SplineComponent->GetScaleAtDistanceAlongSpline(Position)};
466+
const float Distance = FMath::Fmod(Position + SplineOffset, SplineComponent->GetSplineLength());
467+
const FVector ScaleAlongSpline{SplineComponent->GetScaleAtDistanceAlongSpline(Distance)};
464468

465469
const float NewScaleX = InheritScale.bX ? ScaleAlongSpline.X : CurrentScale.X;
466470
const float NewScaleY = InheritScale.bY ? ScaleAlongSpline.Y : CurrentScale.Y;

0 commit comments

Comments
 (0)