在游戏中,摄像机是玩家的眼睛,玩家可以使用摄像机去观察游戏世界。那么你知道在UE4中摄像机是如何工作的吗?下面为大家介绍UE4中的摄像机工作原理。
摄像机工作原理
游戏的类型多种多样,但每个游戏都需要玩家的视点(POV),在这里我们将摄像机位置与视点位置同步。下图的摄像机位置即为POV的位置,紫色的框即为FOV。
值为90的FOV
值为40的FOV
因为POV在游戏中是会随时变化的,所以我们需要调整摄像机,调整摄像机就是不断地更新POV的位置。如果想要切换不同的视角,可以切换POV。如果想要移动镜头,那就利用一些插值的算法来处理POV的位置。如果想要做一些视觉特效,可以直接在摄像机上加上一些后处理效果。
UE4摄像机关系梳理
首先放一张摄像机相关类的关系图。
1、ameraComponent和CameraActor
CameraComponent组件一般放在控制角色的根节点上,常规的行为与属性都可以在其中进行设置包括POV位置(即组件的位置),FOV,观察模式(分为正交模式和透视模式),宽高比,后处理效果等。
而CameraActor的作用更为简单,就是将CameraComponent组件封装到一个Actor里面来使其可以直接放到一个Level里面。
Mods里面可以放置Camera
CameraComponent组件里面还包括另外两个组件,一个是UDrawFrustumComponent,另一个是UStaticMeshComponent。UStaticMeshComponent是用来渲染Actor的对象模型,而UDrawFrustumComponent是用来显示摄像机视窗的。
2、layerCameraManger
可以叫他为摄像机管理器,那么他管理的是什么?答案就是视点POV。POV位置真正的计算过程是在这里进行的,你可以在这里处理不同人称视角的POV计算流程,处理摄像机震动与碰撞,也可以对摄像机增加镜头粒子特效(溅血效果等)。
3、iewTarget
iewTarget是我们想让摄像机跟随的对象。对于一般的第三人称游戏,我们的摄像机一直是对准着我们控制的角色的,这个角色可以认为是ViewTarget(不过ViewTarget不仅仅是一个Actor)。ViewTarget定义在PlayerCameraManager里面,负责提供给Manger一个理想的POV。一个ViewTarget结构包含一个Actor对象,该Actor对应的POV信息以及当前的PlayerState。我们可以通过ViewTarget包含的Actor的位置来计算摄像机POV的位置,并把计算后的结果再存储到ViewTarget里面的POV。
ViewTarget内部结构
4、ameraComponent,CamerActor与PlayerCameraManger
PlayerCameraManager通过绑定一个ViewTarget来计算POV的位置。我们将CameraComponent放进的Actor就是我们理想的ViewTarget。拥有CameraComponent的CameraActor也同样是ViewTarget。
PlayerCameraManager一般有几个摄像机模式(CameraStyle),如下图
而在构造时他默认的模式是另一个
默认模式下,PlayerCameraManager在更新POV的时候会调用Actor的CalcCamera。CalcCamera,先判断是否有CameraComponent并且bFindCameraComponentWhenViewTarget是否为true,是的话就获取CameraComponent的位置与朝向,不是的话就获取VIewTarget的Actor的坐标与朝向来更新视点POV的信息。
其他的模式需要玩家去进一步做详细的计算。
如果当前的ViewTarget是一个CameraActor的话,PlayerCameraManager就会直接获取CameraComponent的位置与朝向来更新POV。
5、layerController与PlayerCameraManger
在UE4里面每个Pawn都会有一个对应的Controller,我们需要Controller拥有控制Rotation(朝向)的功能。这里有一个UpdateRotation函数来控制朝向。
我们可以看一下开始的摄像机相关类图,这时候可以看到PlayerController里面有PlayerCameraManager属性。当我们旋转鼠标时,这个偏移量会通过AddControllerYawInput与AddControllerPitchInput传入RotationInput。在PlayerController执行UpdateRotation时会获取PlayerCameraManager并通过ProcessViewRotation计算出移动后(也就是将RotationInput计算进去)的Rotation,把这个Rotation赋值给ControlRotation以及Controller所控制的Pawn(也就包括他身上的CameraComponent组件)。
Controller接收鼠标旋转流程
最后CameraComponent朝向已经被修改,PlayerCameraManager在更新POV的Rotation时获取CameraComponent的朝向即可。
如果没有任何CameraComponent组件的话,可以在摄像机相关类图中找到PlayerCameraManager类,里面会有一个PlayerController属性,这样PlayerCameraManager就可以随时获取当前ViewTarget对应的PlayerController。而且在Controller接收鼠标旋转流程里面其实已经通过SerControlRotation获取了当前摄像机计算后的朝向,所以在PlayerCameraManager更新POV朝向的时候,获取Controller的ControlRotation就可以了。在更新POV朝向的时候就不需要获取CameraComponent的朝向了,没有借助任何CameraComponent或是CameraActor。
经过UE4的处理,玩家会随着摄像机的旋转而旋转。
更多文章推荐: