查看原文
其他

弹性跟随相机!3D入门教程!

lamyoung 白玉无冰 2022-06-10

默默地在背后关注她!

前言

在3d游戏中经常会用到镜头跟随效果,这次我们就来实现它!

阅读本文需要一些的基本知识:

  • 向量基本运算(加法/减法/乘积)
  • 会调用四元数API接口
  • 运动学(速度/加速度/位移)

效果预览如下(可调远近上下/弹性跟随):

实现

相机跟随的原理就像是,你暗中跟随观察(尾随)你心仪的对象(Object)。

既然是观察,就要与对象保持一定的距离

为了不被对象发现,我们观察的位置和对象的朝向有关。

当然,你要看到对象,你的眼睛方向一定得看着对象吧,这就是视口方向

原理图

针对我们要达到的效果,需要定义好以下几个变量。

  • 观察对象的朝向(上方向,前方向)
  • 摄像机与对象的距离(水平距离,垂直距离)

最终我们需要算出以下几个玩意儿:

  • 相机位置
  • 相机旋转角度

位置

求相机的位置分两步:

  1. 根据对象的前方向和相机的水平距离,求出中间点坐标
  2. 根据对象的上方向和相机的垂直距离,求出相机的位置
计算位置

中文式伪代码如下:

对象到中间点的向量 = -1 * 对象前方向 * 相机的水平距离
中间的坐标 = 对象到中间点的向量 + 对象点坐标
中间点到相机的向量 = 对象上方向 * 相机的垂直距离
相机坐标 = 中间点坐标 + 中间点到相机的向量

角度

旋转角度可以通过视口朝向和上方向得出。

旋转角度的求法

伪代码如下:

前向向量 = 对象坐标 - 相机坐标
旋转角度 = 旋转API(前向向量的归一化, 对象上向量)

需要注意的是,在 Cocos Creator 中相机朝向和节点旋转的角度是相反的,所以前向量的方向要取反向。

摄像机节点

弹簧

我们还可以给相机添加一个弹性跟随的效果。

计算过程如下:

  • 先根据上面的方法计算出相机的理想位置。
  • 然后假设现在相机所在的位置和理想的位置中有个弹簧。
  • 再根据弹簧模型求出合力(加速度)
  • 最后模拟运动算出时间点位置(位置+速度)
弹簧模型

弹簧简易模型受两个因素影响:

  • 弹簧长度(即相对位置)--拉力
  • 当前速度 --阻力

为此我们可以定义想要的弹力系数阻力系数

结合起来的计算位置的伪代码如下:

理想位置 = 计算理想位置()
相对距离的向量 = 理想位置 - 当前位置
加速度 = - 相对距离*弹力系数 - 当前速度*阻力系数
当前速度 = 当前速度 + 加速度*间隔时间
当前位置 = 当前位置 + 当前速度

扩展

还可以用其他的方法去更新位置:

积分法

关于弹簧系数的关系参考:

弹簧模型系数

小结

位置!距离!旋转!弹簧!

以上为白玉无冰使用 Cocos Creator 3.0 preview-1 实现 "弹性跟随相机!" 的技术分享。欢迎三连(点赞/在看/留言/分享)支持!

FFF = 专注(focus)、反馈(feedback)以及纠正(fix it)!

参考资料

《游戏编程算法与技巧》

《大学物理(核心知识)》

更多

标志板!Billboard !
2D 素材 3D 效果!
2020 原创精选!
四元数与3D旋转

完整代码: 整理后放在评论区置顶(从信中打开文章)

点击“阅读原文”查看精选导航

“点赞“ ”在看” 鼓励一下



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存