UE4 ActionGame知识点总结3-Camera系统解析

APlayerCameraManager::SetViewtarget的作用就是根据参数设置PendingViewTarget和ViewTarget的信息。PendingViewTarget就是目标位置的Target信息,ViewTarget就是当前的Target信息。如果PendingViewTarget.Target有值,表示当前正在镜头切换中。

SetViewtarget就是确定镜头应该切换到哪个Actor上,而不是指定具体相机的位置和旋转,因为Actor可能会移动,提前指定位置旋转不能保证相机切换到那里的时候Actor还在那。因为Actor身上可以绑定CameraComonent,所以指定Actor的好处是通过Actor可以找到CameraComonent的位置,然后切换到CameraComonent上。如果真的需要切到指定的位置和旋转,那么在那个位置生成一个CameraActor然后切换即可。

函数总结: SetViewtarget就是告诉CameraManager相机需要切换到传入的Target上。这个函数逻辑仅仅设置PendingViewTarget和ViewTarget的Target信息,并没有进行相机位置的计算。相机位置最终的计算是在下面的DoUpdateCamera中计算的,但是DoUpdateCamera函数需要的PendingViewTarget和ViewTarget是本函数设置的。

APlayerCameraManager::DoUpdateCamera首先判断当前是否在切换过程中,如果不是,那么通过UpdateViewtarget传入Viewtarget可以获取到当前镜头的信息。如果在切换过程中,通过切换时长,已经切换的时长,插值算法,当前Viewtarget的POV信息,目标PendingViewtarget的POV信息计算出当前应该的POV信息。如果切换时间到了,直接将PendingViewtarget赋值给Viewtarget并且置空PendingViewtarget。最后的POV信息通过FillCameraCache缓存起来。记住,实时的镜头POV信息是存储在CameraCache中的,并不是Viewtarget的POV信息,因为有可能当前在切换过程中

APlayerCameraManager::UpdateViewtarget 的作用是根据PendingViewTarget和ViewTarget的Target信息填充POV相关信息(其中就是相机的位置和旋转),不会改变Target(Target是SetViewTarget函数负责改变的)。

具体逻辑:

1.  给POV的FOV,Ratio等信息先设置默认值。

2.  判断Target是否是CameraActor类型

         是: POV信息由CameraComponent的GetCameraView填充。

      不是:先判断是否是指定的相机类型(命令行camera  ***可以指定),如果是相机特定类型则特殊处理,否则交给PlayerCameraManager::UpdateViewTargetInteral填充。UpdateViewTargetInteral函数先判断Cameramanager是否有蓝图复写BlueprintUpdateCamera操作,这个函数提供了外部定制相机的机会。如果没有复现则调用Target的CalcCamera。CalcCamera先判断是否搜索绑定的CameraComponent,如果设置了搜索,那么找到处于Active的CameraComponent,然后调用CameraComponent->GetCameraView,否则调用调用GetActorEyesViewPoint获得相机位置和旋转(内部使用的就是Actor本身的位置和旋转,Pawn复写了该函数,可以在蓝图中调整BaseEyeHeight);

3.  如果需要,应用相机的Modifiers,包括CameraAnims.

4.  设置PlayerCameraManager的Location和Rotation.参数就是上面综合得到的位置。

5. 最后UpdateCameraLenEffects.这个函数是更新相机特效的位置,保证特效出现在相机前方。相机位置计算代码:AEmitterCameraLensEffectBase::GetAttachedEmitterTransform。


举例:

新建一个第三人称的模板然后运行,镜头对着Player. 晃动鼠标镜头也同样移动,不同的角度对着Player.我们就分析这个流程:

游戏开始时系统会将Pawn设置为ViewTarget(通过CameraManager::SetViewTarget)。接着系统Tick调用APlayerCameraManager::DoUpdateCamera,这时候ViewTarget是Pawn,PendingViewTarget没有值。UpdateViewtarget 函数被调用并且传入的是ViewTarget.然后调用到PlayerCameraManager::UpdateViewTargetInteral,再往后调用到Pawn身上的cameraComponent->GetCameraView。所以最后镜头的POV信息就是从Pawn身上的CameraComponent上获得的。而我们移动鼠标改变的最终也是Pawn身上的CameraComponent信息。

扩展阅读推荐:https://blog.csdn.net/u012999985/article/details/68947410

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值