待优化:一个双人决斗的摄像机算法

发表于2019-01-21
评论0 3k浏览
    一年多以前在公司做的一个摄像机算法,当时有点问题没有解决。现在有空闲了写出来想一想思路做做积累,看看能不能再优化一下。

适用范围:场景内只有2人,或一直注视主目标的状态
擅长处理:宏观视角,第三人称的注视视角
最初原型:火影忍者究极风暴的摄像头,可以在一定范围内来回跑动而不会频繁转动摄像机

设计思路:
  • 摄像机永远注视敌我双方连线中点(待优化部分);
  • 摄像机按照敌我之间距离的不同有着处理形式的变化;
  • 摇杆操作方向的前方永远是当前摄像机视角的前方;

正文:
(注:因为GAD本身的文本编辑原因,Word中所有公式和向量都无法正常显示,请记住这里的线是向量表示)
(注2:为了避免麻烦,本文首发于indienova和奶牛关,我自己3个地方3个号用的名字和头像都不同,转到这里也只是为了多些人看到方便一起交流优化,最终完成这个摄像机。希望别闹出自己抄自己这种乌龙出来。。。)
  • 初始变量:我方角色O,敌方角色E,OE中点M,相机在地面的投影C,初始角度θ';
  • 取EO与MC夹角θ,初始化摄像机位置C在|θ| = θ',偏向角色一方(暂定右),与M距离为length的位置上;
  • 随着OE的相对位置变化,M的位置也会有相应变化,C的位置取决于如下规则:
  • |θ| <= θ0时,不改变MC的朝向,以当前角度θ进行平移;
  • |θ| > θ0时,保持这一最大角度,令MC相对EO进行旋转;
  • 注意旋转后,EO和MC的相对位置必须和转动前相同,不能出现转动后越轴的情况;
  • 如图1所示,即使C'处在了另外一个轴上,因为未超出最大容忍角θ0,MC的朝向依然不会改变;
  • z 此套2D规则基础上,为C添加高度hight,即可得到C的三维坐标,此时摄像机永远位于C点,注视M点;
  • 另外该摄像机会根据r的长度,给予不同的θ0、length和hight值:
  1. r < rmin时,极限角度θ0 = θmin,距离l = lmin,高度h = hmin;
  2. r <= rmin && r <= rmin 时,计算出percent = (r - rmin) / (rmax - rmin),极限角度θ0 = θmin + percent * (θmax - θmin),距离l、高度h亦作相同处理;
  3. r > rmax时,极限角度θ0= θmax,距离l = lmax,高度h = hmax;

需要开放的可调整数据:
  • 距离范围rmin和rmax;
  • EO和MC的初始夹角θ'和夹角θmin、θmax;
  • MC距离lmin和lmax;
  • 摄像机高度hmin和hmax;

优化思路:
    目前可以想到的一个优化点就是,其实M点(注视点)的位置,也是一个可以控制的变量。当我更倾向于注视敌人时,可以将M点推到E的位置,这样就和传统的敌人——我——摄像机三点一线的设计比较接近,同时保证了有一定的容忍角度θ0。更倾向于自己时,则可以把注视点回拉,大概也能有不错的视角。

尚存问题:
    当双方距离过近时,其实会存在一个圆形范围,即使双方位置任意调转摄像机也不会跟随转动,虽然不会导致过于眩晕的情况,但之后远离怎么恢复原始角度,包括正向越轴(双方面对面行走直至穿插远离,行走射线与屏幕朝向呈90°角的情况)会导致摄像机瞬间转向的问题,如何优化还是未知数。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: