最终效果:https://www.bilibili.com/video/BV1Fr421p7hc
上一篇:类《鬼泣5》camera逻辑拆解 – Ltopia (linyouker.site)
前面单独讲平面上的椭圆轨道确定,不存在高低差时相机当然没问题。但是当怪物和敌人存在高度差时,求出的相机位置由于不包含z轴数据,肯定会丢锁,这期就顺着上一期的内容,简单说一下我匹配高低差的思路。
设置相机位置
在谈高低差之前,其实还有一个需要花费心思的内容,就是相机的移动。如果单纯将相机移动到我们计算处的位置,肯定达不到平滑的相机位移的效果。这个是再怎么插值平滑也解决不了的。
这里给两个思路,两个我都用过。第一个是用虚幻官方的弹簧臂组件,计算出相机位置对应的offset,再实时改变offset,同时将弹簧臂长度设置为零;第二个是不用虚幻的相机组件,自己写一个相机管理器来管理相机的运动,再具体一点可以参考ALS的相机写法。这两种方法肯定是第二种更好,但是第一种很简单,不想自己写相机管理系统的可以用。以下的内容是基于第二种方法来的(其实第一种方法也可以用这种思路)。
我确定相机位置的方法如下,获取相机的向前/向右/向上向量,分别乘以某个随控制向量改变而改变的系数来得出相机位置。(当然其实我是先通过椭圆轨道计算出相机位置,再计算出什么样的系数可以让相机处于这个位置,再计算出相机位置。。。。可能比较绕)
那么当我们想锁定有高低差的敌人时,如果敌人超出了我们预想的镜头范围,我们只要提升上图的系数a,就能将敌人纳入我们的镜头中。这就是我们高低差锁定的核心思路。
高低差匹配
如图是我们预想的一个玩家和敌人存在高低差的情景。
为了确定敌人是否我们的镜头中,我们将敌人投影到相机向前向量决定的平面,计算出如图的角度,当这个角度超过某个阈值时,就说明敌人超出画框,我们要开始将镜头往后拉了。
那么相机往后拉到这个角度达到一个我们预想的比较合适的值时停止,计算这个往后拉的距离,就是我们让系数a增大的值。
我们甚至可以直接将着问题转换为一个简单的平面问题。
那么到这里,镜头的锁定问题就基本解决了,反正不会出现任何丢锁的现象了,至于相机的修正其实不是很复杂的问题,真正复杂的是战斗中相机与玩家招式/敌人的互动,比如敌人跳起时镜头往上拉这类的,等我研究清楚了下一篇来继续讲。