0x00在数字孪生3D场景中,镜头的移动由键盘和鼠标控制。缩放是一种非常常见且必要的行为。用户正是通过这些操作,才能实现对整个3D场景的观看和控制。0x01键盘控制相机前后左右移动通常,我们使用几种键盘来控制相机的移动,如W前进,S后退,A左转,D右转。如果你是开发过threejs的读者,或许能想象到思路就是监听键盘事件。如果是字母W,则将镜头位置和中心点前移,其他按键类似。但是,UE将相关的类似操作封装成新的事件。通过在项目中配置,可以得到相关事件的映射,如下图,在项目配置中(Edit->ProjectSettings->Input):如上图所示,W和up键映射向前的MoveForward事件,S和向下键映射向后的MoveForward事件。所以监听MoveForward事件可以实现相机的前后移动。同样,监听MoveRight事件可以左右移动。添加相机组件跟随上一篇《UE 实现鼠标点选模型》,打开A_Pawn蓝图类,添加相机组件如下:添加完成后,可以通过控制Pawn来控制镜头。因为camera是Pawn的child,Pawn的变化会影响camera的变化。添加“浮动兵移动”组件“浮动兵移动”组件为Pawn类提供简单的移动功能。指定了“浮动兵移动”组件后,就可以控制Pawn类移动了。添加“浮动棋子移动”组件:添加后可以看到:监听MoveForward事件实现前进后退。在蓝图中添加MoveForward事件:其中AxisValue表示事件的缩放值(1表示向前,-1表示向后)。监听MoveForward后就是控制Pawn的前进后退,可以通过“添加移动输入”来控制Pawn的移动:target是Pawn类,这里可以使用self(Pawnclass本身,WorldDirection表示运动的方向,ScaleValue表示运动的缩放值,一般1表示向前,-1向后,这个正好对应前面的AxisValue。获取Pawn本身的旋转方向作为WorldDirection的input.通过获取控制旋转,再通过控制旋转获取ForwardVector获取Pawn的前向向量。如果熟悉webgl和threejs,这一步类似于下面的函数:/***获取网元的正面向量*@methodfrontDirection*@return{Vec3}返回网元的正面向量*/frontDirection:function(){varn=new$Vec3(0,0,1);n=n.applyMatrix4(newMat4().extractRotation(this.matrixWorld));n.标准化();returnn;},如下图所示显示:最终蓝图如下:监听MoveRight事件实现左右移动这类似于“监听MoveForward事件实现前进后退”,不会在这里详细描述。整个蓝图如下:0x02mousemovementcontrolscamerarotationUE有两个鼠标事件“X”和“mouseY”分别代表鼠标在X方向和Y方向的移动。鼠标X事件实现相机左右旋转。监听鼠标X事件后,需要设置相机的旋转。通过下方的蓝图节点,可以设置Pawn的旋转。target是Pawn本身,NewRotation表示要设置的新旋转的值,是一个向量,这个属性也可以分为三个分量,x,y,z。拆分的原因是因为我们左右旋转,我们只需要改变Z轴方向的旋转即可。后续涉及的拆分结构管脚与这里类似,可能不再单独说明。首先需要得到原来的旋转值,然后在原来的旋转值的基础上增加一个新的增量。获取Pawn的旋转,可以通过“GetControlRotation”获取控制器的当前旋转值:修改节点的目标是控制器,所以需要获取控制器作为目标的输入:on在原来Z轴旋转的基础上,加上最后一个增量,这个增量就是“MouseX”节点的AxisValue,但是一般来说AxisValue会比较小,所以先乘以一个倍数,对应的结果作为增量。Z轴旋转加上增量后的值赋值给“SetControlRotation”节点的Z旋转值。整体蓝图流程如下:判断鼠标是否按下通常来说,如果我们要旋转相机,需要按下鼠标,然后移动才能旋转。所以我们需要加一个条件判断。首先,通过以下节点,我们可以判断鼠标是否被按下:目标是播放器控制器,所以我们需要获取播放器控制器并进行连接。按键。该节点还可以判断其他按键的按下情况。然后添加一个条件分支,将上述节点的结果作为条件分支节点的输入条件:整体蓝图流程如下:MouseY事件实现相机上下旋转MouseY事件实现相机的上下移动向下旋转和“鼠标X事件实现相机左右旋转”,这里不再赘述,区别在于设置了X轴的旋转。总体蓝图流程如下。0x03鼠标滚轮控制镜头的变焦。要实现车轮变焦,需要弹簧臂组件。首先在蓝图中添加一个弹簧臂组件,如下图所示:添加后,需要添加弹簧臂作为相机的父亲,这样弹簧臂的变化会随着相机的变化而变化:弹簧arm组件有一个length属性,通过改变这个长度可以达到拉伸的效果。首先监听鼠标滚轮事件:然后设置弹簧臂的长度,可以将弹簧臂组件拖入蓝图:设置长度,首先获取原始长度,最后在原始长度上加上一个长度,整个蓝图如下:0x04本文通过蓝图介绍镜头的平移、旋转、缩放,涉及的知识点较多,需要细心耐心观看。如果您有好的经验,欢迎与我交流。关注公众号“ITMan表叔”添加作者微信进行交流,及时收到更多有价值的文章。
