22

待优化:一个双人决斗的摄像机算法-腾讯游戏学院

 5 years ago
source link: http://gad.qq.com/article/detail/289130
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
    一年多以前在公司做的一个摄像机算法,当时有点问题没有解决。现在有空闲了写出来想一想思路做做积累,看看能不能再优化一下。

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

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

正文:
(注:因为GAD本身的文本编辑原因,Word中所有公式和向量都无法正常显示,请记住这里的线是向量表示)
(注2:为了避免麻烦,本文首发于indienova和奶牛关,我自己3个地方3个号用的名字和头像都不同,转到这里也只是为了多些人看到方便一起交流优化,最终完成这个摄像机。希望别闹出自己抄自己这种乌龙出来。。。)
5c455137394bf.png5c45513ce67aa.png
  • 初始变量:我方角色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°角的情况)会导致摄像机瞬间转向的问题,如何优化还是未知数。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK