3.11更新
大致最终的效果:https://www.bilibili.com/video/BV1dr421J7os
加入高低差兼容的效果:https://www.bilibili.com/video/BV1Fr421p7hc
本文章参考视频:《鬼泣5》相机规则分析
可以看文章前先看一遍这位大佬的视频,差不多对椭圆轨道有个概念,下面我们再细讲轨道的确定
一、基本概念
从以上视频可以看出几个基本的点:
- 鬼泣的相机锁定逻辑采用了椭圆轨道,相机回正轨道采用以当前的椭圆的长轴为半径的圆轨道。
- 这样设计的目的是为了保证在鬼泣这种高强度位移的游戏中,相机运动没那么剧烈。同时这样的镜头设计表演感更强,与鬼泣强主角的特性更匹配。
- 但是同时视频中没有提到具体椭圆轨道的确定,比较简略,本文尝试去拆解一下具体的相机椭圆轨道的确定
确定整个相机轨道需要确定有:轨道的坐标系(原点,xy轴方向),长轴长度,短轴长度,焦点位置。
而如果只是简单确定了我们需要让被锁定的敌人和玩家处于椭圆轨道的短轴上,同时不考虑相机的纵向位移,那么我们仅仅确定了椭圆相机轨道的坐标系。还有很多的参数不知道,需要我们去逆向拆解这个设计。
从体验的角度上,我们能确认的点:
- 相机的fov大概为90。
- 为了保证良好的锁定感,相机所处在椭圆上的位置与相机的朝向(向前向量)有关,锁定的焦点不是一个确定的点。
- 为了保证镜头的稳定,相机的朝向在角色与敌人相对位置改变时是固定的(不引入相机朝向修正时),改变的只有相机的位置。说明相机在椭圆轨道上的具体位置由相机的朝向(向前向量)决定,或者再详细点,由相机向前向量在坐标系平面上的投影向量和坐标系长轴的夹角确定。
- 当以上提到的夹角为0度/180度时,角色和敌人应该尽量占据较大的画面位置。
所以确定每一个参数的顺序是:
- 敌人与玩家的相对位置确定坐标系
- 敌人与玩家的距离确定椭圆短轴b
- 相机朝向与坐标系x轴平行时,角色和敌人在画幅中的位置确定椭圆长轴a
- 通过相机朝向与坐标轴x轴的夹角确定相机位置
那么接下来再分别具体介绍每一个参数的确定
注:下文中若无特殊说明,提到的夹角均是相机向前向量在坐标系平面上的投影向量与坐标系x轴夹角
二、参数确定
2.1 坐标系确定
获取下敌人和玩家的xy坐标就行,然后生成几个vector2d,再归一化就行,具体实现后面再开一篇文章介绍。
2.2 短轴b
如图是鬼泣中角色与怪物保持一定距离,当夹角接近90度时,角色在镜头中的位置。可以基本看出此时为了保证代入感,相机时拉的和角色很近的。此时的b就是角色与敌人的距离加上一个值,而角色敌人距离变大时角色在镜头中的位置几乎没有变化,说明这个值是一个定值,来保证在角色和敌人距离拉远时角色在镜头中的位置不会有很大的改变。
同时可以看出鬼泣的一个小设计,当夹角拉到90度时,相机会向左或者右修正一个小角度,来防止角色挡住怪物。
而当角色和怪物的距离比较近时,角色在镜头中的位置开始改变,说明此时计算b的加值变大了,来保证b不会过小,而导致相机离玩家和怪物过近的情况。
所以做一个总结
2.3 长轴a
长轴a可以通过夹角为0/180度时的镜头来确定,因为理论上此时相机所处的位置就是长轴上。
想得出a得首先提到鬼泣相机锁定的一个特性,这个特性在后面确定相机位置时也需要用到:当夹角开始偏离90度一定距离后,玩家在镜头中所处的位置是固定的。
如图是三种不同夹角下玩家在镜头中的位置,都是在画面的同一位置。那么为了方便计算,我们将相机的朝向(向前向量)与相机到玩家的向量的夹角叫做α。
很明显,当夹角为0度时,玩家仍处在镜头中的那个位置,那么就可以由此计算出a
需要额外注意的是,当距离小于预设值时,α会发生变化,此时a的公式也不成立,可以参考上面b的处理做个简单的分段函数来处理。
那么由以上的分析,椭圆轨道就大致确定下来了,接下来需要确定的是如何通过夹角来确定相机在椭圆上的位置。
2.4 相机位置
这样其实相机位置就转化成一条直线和椭圆的相交问题了,可以转换成一元二次方程求出两个解再根据情况取舍。
那么由以上的分析,其实鬼泣基本的相机轨道逻辑就是这样了,但是还有几个细节需要处理,我们分别说明。
- 归正时的相机轨道
- 当夹角在90度左右时的平滑处理(如果按照以上求相机位置的方法处理,当夹角在90度左右时会非常怪)
- 玩家与敌人距离很近时的相机锁定逻辑
三、优化轨道
3.1 归正轨道
为了防止游戏中玩家将相机归正到玩家背后时,相机运动过于剧烈导致感觉角色拍脸的不良体验,鬼泣中归正的轨道不是椭圆轨道,而是根据当前相机位置确定的一个圆轨道,等到相机归正后再过渡回椭圆轨道。
基于相机当前的位置做一个圆周轨道用来归正就行。
3.2 当夹角在90度左右时的平滑处理
首先说说为什么要平滑。如果你按照我前面说的去做,那么你会发现夹角在90左右时轨道会跳变。
如图就是原因,夹角为90度时相机并不在角色的后方,所以在90度左右时相机会直接从角色的左后方跳变到右后方,导致不平滑。
这里猜测鬼泣的做法是在夹角在90度左右时,相机朝向角色与怪物的中心点,当下面如图中的临界情况时,相机的位置过渡到上面所说的规则。
至于近距离,使用一个最小椭圆轨道,当距离小于某值时过渡到预设的最小轨道即可。
本文说明了相机轨道的确定和相机位置的确定,下一篇讲讲相机修正规则。
下一篇已经更新了: