已有的点击POI相机飞过去,是跟飞向物体正方向相同的逻辑,如果相机和物体的朝向不对,相机需要旋转一定角度转过去,如果要直接飞向物体,需要修改代码
有相机的位置,也可以取到POI的位置(POI为手动放置在场景中)
可以计算出相机到POI的方向,UE有定义好的函数FindLookatRotation,可以拿到旋转变量,根据方向可以让相机在离POI一定距离时停下
void FocusToTarget(const FVector& InMoveTarget, const FRotator& InRotateTarget, float Duration /*= 1.0f*/)
{
MoveToTarget(InMoveTarget, Duration);
RotateToTarget(InRotateTarget, Duration);
}
void MoveToTarget(const FVector& Target, float Duration)
{
PreActorLocation = GetPawn()->GetActorLocation();
MoveTarget = Target;
MoveDuration = Duration;
MoveToTargetAlpha = 0.f;
bMovingToTarget = true;
}
void RotateToTarget(const FRotator& Target, float Duration)
{
PreControlRotation = GetControlRotation();
RotateTarget = Target;
RotateDuration = Duration;
RotateToTargetAlpha = 0.f;
bRotatingToTarget = true;
}
void Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
if (bMovingToTarget)
{
if (GetPawn())
{
MoveToTargetAlpha += DeltaSeconds / MoveDuration;
if (MoveToTargetAlpha > 1.f)
{
GetPawn()->SetActorLocation(MoveTarget);
bMovingToTarget = false;
}
else
{
FVector Target = FMath::Lerp(PreActorLocation, MoveTarget, MoveToTargetAlpha);
GetPawn()->SetActorLocation(Target);
}
}
}
if (bRotatingToTarget)
{
if (GetPawn())
{
RotateToTargetAlpha += DeltaSeconds / RotateDuration;
if (RotateToTargetAlpha > 1.f)
{
SetControlRotation(RotateTarget);
bRotatingToTarget = false;
}
else
{
FRotator Target = FMath::Lerp(PreControlRotation, RotateTarget, RotateToTargetAlpha);
SetControlRotation(Target);
}
}
}
if (bDistanceToTarget)
{
if (ADigitalTwinPawn* DTPawn = Cast<ADigitalTwinPawn>(GetPawn()))
{
DistanceToTargetAlpha += DeltaSeconds / DistanceDuration;
if (DistanceToTargetAlpha > 1.f)
{
bDistanceToTarget = false;
}
else
{
float Target = FMath::Lerp(PreDistance, DistanceTarget, DistanceToTargetAlpha);
}
}
}
}