默默地在背后关注她!
前言
在3d游戏中经常会用到镜头跟随效果,这次我们就来实现它!
阅读本文需要一些的基本知识:
- 向量基本运算(加法/减法/乘积)
- 会调用四元数API接口
- 运动学(速度/加速度/位移)
效果预览如下(可调远近上下/弹性跟随):
实现
相机跟随的原理就像是,你暗中跟随观察(尾随)你心仪的对象(Object)。
既然是观察,就要与对象保持一定的距离。
为了不被对象发现,我们观察的位置和对象的朝向有关。
当然,你要看到对象,你的眼睛方向一定得看着对象吧,这就是视口方向。
针对我们要达到的效果,需要定义好以下几个变量。
- 观察对象的朝向(上方向,前方向)
- 摄像机与对象的距离(水平距离,垂直距离)
最终我们需要算出以下几个玩意儿:
- 相机位置
- 相机旋转角度
位置
求相机的位置分两步:
- 根据对象的前方向和相机的水平距离,求出中间点坐标
- 根据对象的上方向和相机的垂直距离,求出相机的位置
中文式伪代码如下:
对象到中间点的向量 = -1 * 对象前方向 * 相机的水平距离
中间的坐标 = 对象到中间点的向量 + 对象点坐标
中间点到相机的向量 = 对象上方向 * 相机的垂直距离
相机坐标 = 中间点坐标 + 中间点到相机的向量
角度
旋转角度可以通过视口朝向和上方向得出。
伪代码如下:
前向向量 = 对象坐标 - 相机坐标
旋转角度 = 旋转API(前向向量的归一化, 对象上向量)
需要注意的是,在 Cocos Creator
中相机朝向和节点旋转的角度是相反的,所以前向量的方向要取反向。
弹簧
我们还可以给相机添加一个弹性跟随的效果。
计算过程如下:
- 先根据上面的方法计算出相机的理想位置。
- 然后假设现在相机所在的位置和理想的位置中有个弹簧。
- 再根据弹簧模型求出合力(加速度)
- 最后模拟运动算出时间点位置(位置+速度)
弹簧简易模型受两个因素影响:
- 弹簧长度(即相对位置)--拉力
- 当前速度 --阻力
为此我们可以定义想要的弹力系数
和阻力系数
。
结合起来的计算位置的伪代码如下:
理想位置 = 计算理想位置()
相对距离的向量 = 理想位置 - 当前位置
加速度 = - 相对距离*弹力系数 - 当前速度*阻力系数
当前速度 = 当前速度 + 加速度*间隔时间
当前位置 = 当前位置 + 当前速度
扩展
还可以用其他的方法去更新位置:
关于弹簧系数的关系参考:
小结
位置!距离!旋转!弹簧!
以上为白玉无冰使用 Cocos Creator 3.0 preview-1
实现 "弹性跟随相机!"
的技术分享。欢迎三连(点赞/在看/留言/分享)支持!
FFF
= 专注(focus)、反馈(feedback)以及纠正(fix it)!
参考资料
《游戏编程算法与技巧》
《大学物理》
原文链接