赞
踩
一共有四种相机,分别为普通相机、电影相机、摇臂相机和滑轨相机。四种相机可以从左边Modes里面拖拽,也可以在Actor蓝图类里面“Add component”。
相机内嵌了一个镜头类,图中右下角模拟了相机拍摄到的镜头画面。可以通过配置,使得在播放时,整个画面可以显示某个相机的镜头。相机的这一特点是它存在的意义。在底层编码逻辑上,镜头Actor和相机Actor的关系是一种继承关系。
需要注意的是,只有普通相机和电影相机在创建时自带镜头,而如果只是新建一个摇臂相机或滑轨相机,只是空空如也的支架,需要在蓝图里面手动添加相机挂载在它上面才能有镜头。
如下图,可以发现摇臂相机和滑轨相机的各个可视组件其实相对整体的Actor也是继承关系。
我们希望用键盘的“WASD”键和鼠标来控制一个自由的电影相机的移动和视角。
在“Settings-Project Settings-Input“里面自定义Input事件。虽然直接用键盘同样可以实现事件触发,但是这不是编程的好习惯。定义Input事件可以把单纯的字母命名,使得编程时,即使不用注释也能知道这个事件是干什么的。除此之外,”Axis Mapping”可以有输入值,从而把原来的两个按键合并成一个input事件。这里把”W,S”键统称为“MoveForward”,”A,D” 键统称为“MoveRight”, ”Q,E” 键统称为“MoveUp”, 鼠标上、下移动统称为“LookUp”, 鼠标左、右移动统称为“LookRight”,如下图所示,scale是按按键时事件的输入值。
使用”Add Actor Local Offset”(偏移)和”Add Actor Local Rotation”(旋转)。
注意:想要控制某个相机时,一定要启动player controller(如下图),这样按按键才会有反应。并且必须确保只能有一个Actor启动了player controller,否则程序不知道你控制的是谁,会混乱。
如果不更改,点击“播放”以后出生地点并不是相机所在地,视角也不是相机视角。转换到相机的视角的方法是,在level buleprints里面“Set View Target With Blend”到想要去的相机视角即可。下图中的新目标就是自由相机的蓝图类(BP_FreeCamera)。(之后换相机的时候记得改成那些相机)。
摇臂相机可以伸长、缩短臂长,以及用鼠标调整转角。
前面说过,如果不搭载子相机,摇臂相机就是个空空如也的支架。因此在“CraneCameraMount”里添加一个子类CineCamera。这一逻辑表明,在编程过程中,“CraneCameraMount”的长度、角度与CineCamera同步变化。
和自由相机几乎一样。由于现实生活中摇臂相机的长度有限制、转角也有限制,因此用”Clamp”来限制阈值。
摇臂相机配置完后,也要记得转换到相机的视角!方法和自由相机一模一样。
滑轨相机的滑轨可以自己画,其实他就是一个Spline。滑轨相机的移动基本上是沿滑轨的前后移动,因此它只有一个自由度。
控制滑轨相机在固定滑轨上前后移动,并且不管移动到哪里,相机镜头都对准方阵原点(即利用相机的Track功能)。
普通相机可以很容易实现track,只需要在detail-track上打勾再选择一个Actor即可,但是蓝图类里面的相机组件没有此功能,因此不能像摇臂相机搭载子相机那样。此处通过建立ChildActor的方法实现挂载相机。
滑轨的position总长是1.0。因此想绕滑轨转圈圈,就对总长1取余即可。
在构造函数里进行配置。创建实例化可编辑Actor型变量”LookAtTargetActor”(小眼睛)。 Actor型变量的意思是,这个变量可以指向任意一个Actor。之后设定相机镜头的target是这个变量,即镜头永远指向这个变量。
在关卡配置界面把”LookAtTargetActor”选成想要对准的那个Actor就行。
由于滑轨相机的镜头在它的Child Actor上,而不像之前几个相机那样在自己身上,所以转换到相机的视角部分有所不同。需要找到滑轨相机的Child Actor再设定为New Target.
想要实现用UI控件点击对应按钮就能随意切换到对应机位的功能(以上述三种相机为例)。(UI控件配置见之前的博客)
创建一个CameraManager蓝图类,使得相应事件触发时,自动切换到对应相机机位。Switch Camera函数待编辑,CameraID是函数的输入变量,表征要切换到哪个相机(三个相机分别是0,1,2)。图中三个事件通过UI控件触发。
各个相机之间以及与CameraManager之间都是不同的蓝图类,只有创建接口才能实现信息传递,才能控制不同相机的状态。因此又用到了实例化可编辑蓝图类变量(可编辑蓝图类变量解释见“ 控制滑轨相机对准目标”)。此处在CameraManager里面创建名为Cameras的可编辑蓝图类变量数组,并把自由相机、摇臂相机、滑轨相机的蓝图类按顺序存进去。
于是CameraManager蓝图类里面可以通过Cameras访问三个相机了。
需要注意,切换相机有两个操作,首先把之前那个相机”disable input”,接着再把现在这个相机”Enable Input”
其中“Set View Target”是一个自定义的函数,设定视角用的,见5.2,暂时先跳过。
对于一个相机情况,只需要在level blueprint里面设定view target就行了,但是对于三个相机,难度会大一些。这是因为滑轨相机和其它两个相机这部分程序不同,滑轨相机需要增加一个寻找Child Actor的步骤而其它相机不用。因此考虑采用面向对象语言的多态性来实现视角设定,即对于不同的相机内部,同一个函数有不同的实现。
新建interface,函数取名“SetViewTarget”,里面空着。然后在三个相机蓝图类里面添加这个interface。(Class Settings-Interfaces-Add)
我们自定义的“SetViewTarget”这个函数在三个相机的蓝图类里面视为事件。
对于自由相机和摇臂相机:
对于滑轨相机:
最后,在CameraManager里面调用这个事件即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。