UE4 third person第三人称摄像机设置的原理解释以及Control Rotation到底是个啥

时间:2024-03-04 07:20:23

1.Control Rotation 到底是是个啥:

首先作为游戏开发者,我们就是上帝,于是当我们需要摆布我们的角色的时候我需要知道他在哪(Location),他是什么姿势(rotation),他被放大了多少倍(Scale),除了姿势以外其他的信息都直接存在我的上帝之手中的一根指向我的傀儡的指针所指的位置(Pawn,我不需要特别了解,想知道的时候拿过来康康就可以了)。但是我呢,有点不对劲就特别喜欢知道他的姿势,于是我就自己一开始存了一个姿势,你可以当成是我的上帝之眼的姿势吧。我们经常在third person游戏中使用诸如 add playercontroller yaw pitch roll啥的函数,就是在变化我的上帝之眼的姿势这个姿势其实也是我们的playercontroller本身actor的rotation。只不过我们的控制器是不变的位置的,因为没意义。所以我们f8进行调试的时候就能在某个角落发现我们的上帝之眼了ORZ。

   

经过验证这个control rotation 就和actor rotation 一毛一样。 而且这个值跟摄像机啥的一毛钱关系都没有,从源码上来看只有 playercontroller 的rotation影响摄像机的rotation。而不存在反过来影响,control rotation就是一个很特别的存在。

 

 2.在我们设置camera和spring arm的时候遇到的一些check box的作用机理。

 

 首先是spring arm里面的 Use Pawn contorl Rotation这里就是问你用不用上帝之眼的姿势。注意这里的使用是Runtime时候使用所以勾选此选项在自己的角色中调整spring arm的rotation啥的都会显示变化,

剩下的三个选项就会影响你在editor中调整arm的rotation的时候是否会有对应的变化显示。

在此之前请我们看一下源码

 

 

 

 

 在spring arm更新自己的rotation的时候就是直接先看有没有使用上帝之眼用了的话就直接给我,然后再依次检查有没有继承父亲的rotation,没有继承的话就直接粗暴的给我用自己的relative rotation(这是一个固定值请注意)覆盖掉。这段代码的解读就能理解两个场景的原因了。

一:Character不适用上帝之眼而我们的spring arm使用,但是我们不继承任何一个relative rotation 分量此时看代码就知道,使用上帝之眼被无效化了因为全部被覆盖了。所以此时我们的第三人称环绕摄像机就没得用了。

二:Character使用上帝之眼时:

我们的spring arm 在不继承rotation选项的时候 spring arm无法呈现跟随的视角变化其原因就在于 DisiredRot统一被置换为0,0,0 而这个DisiredRot是用来决定springarm的孩子组件相对于armspring的起点的rotation的,所以也就被固定在那了。上帝之眼使用选项就变得没有意义了。。

当我们选择了继承选项的时候我们就不会覆盖为一个定值,因为我们的spring arm相对于人物旋转,而desired则会获得componentRotation这个就是arm相对于它的worldlocation的一个rotation。所以也跟着旋转。

总结:一般情况不要把这个inherit选项全勾上以免固定式视角了。但实际上灵活的camera还不如直接自己设定relative rotation。需要注意的一点是:这里的disiredRot只是作用于当前的viewtarget的所以当character不转动时候我们的componentrotation就无法得到更新,此时我们仍然可以使用use pawn rotation来使得desiredRot得到更新

 

Plus:连夜实验了一下,Desired只是对child有用,比如说我们关闭character的上帝之眼使用选项,输出arm这个component的world rotation不会有任何变化,但是视角依然在变化,于是我们进到源码里面寻找答案:

 

 armspring 首先是继承自scenecomponent,在它的tick函数中只有updateArmLocation这个函数,在此函数中没有任何改变worldrotation的调用,而能够改变这个值的只有在其parent节点的函数中进行,这也就解释了为什么我们的镜头一直在转却无法更新本身的rotation。因为每次update的时候arm只更新了socket和子节点的transform并不涉及自身的这个值的变更。

 

至于为什么editor里面所看到的arm像是rotation改变了,我们所观察到的红线只是摄像机相对于armspring的worldlocation的一个desiredRotation其实就这这么简单。。。。

 看这张图就能知道arm本身的位置和旋转根本就没变。

 

pluss:arm的worldrotation实际上是相对于父节点的rotation,并不是相对于世界坐标0,0,0的。

打个比方当我们在确定 arm的worldtransform的时候首先将arm的起始位置跟随character worldtransform一起进行变换然后,轮到变换我的arm的时候,先把已经跟随character变换过的arm起点移到0,0,0然后再进行rotation变换。实际上这里就是说的directx里面的Transform的计算方法了:先scale后rotaion最后location的变换。。

所以ue4上的worldrotation都是指的是把父节点移到原点再apply的rotation