相机飞向POI

已有的点击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);
			}
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值