zoukankan      html  css  js  c++  java
  • 弹性跟随相机!3D入门教程!

    默默地在背后关注她!

    前言

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

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

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

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

    实现

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

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

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

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

    原理图

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

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

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

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

    位置

    求相机的位置分两步:

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

    计算位置

    中文式伪代码如下:

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

    角度

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

    旋转角度的求法

    伪代码如下:

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

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

    摄像机节点

    弹簧

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

    计算过程如下:

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

    弹簧模型

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

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

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

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

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

    扩展

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

    积分法

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

    弹簧模型系数

    小结

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

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

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

    参考资料

    《游戏编程算法与技巧》
    《大学物理》
    原文链接

  • 相关阅读:
    nginx获取上游真实IP(ngx_http_realip_module)
    配置NFS固定端口
    elasticsearch 占CPU过高
    jdk集合常用方法分析之HashSet和TreeSet
    SparkSQL使用之如何使用UDF
    SparkSQL使用之JDBC代码访问Thrift JDBC Server
    SparkSQL使用之Thrift JDBC server
    SparkSQL使用之Spark SQL CLI
    jdk分析之String
    jdk集合常用方法分析之ArrayList&LinkedList&以及两者的对比分析
  • 原文地址:https://www.cnblogs.com/lamyoung/p/14322653.html
Copyright © 2011-2022 走看看