首页 > 其他分享 >掌控物体运动艺术:图扑 Easing 函数实践应用

掌控物体运动艺术:图扑 Easing 函数实践应用

时间:2024-10-30 11:47:22浏览次数:5  
标签:动画 函数 掌控 Default 物体 ht easing action Easing

现如今,前端开发除了构建功能性的网站和应用程序外,还需要创建具有吸引力且尤为流畅交互的用户界面,其中动画技术在其中发挥着至关重要的作用。在数字孪生领域,动画的应用显得尤为重要。数字孪生技术通过精确模拟现实世界中的对象、过程和系统,对动画的需求远远超过传统前端开发。

在这种环境中,动画不仅仅是为了美观,更是用于实现系统与现实的同步、演示复杂过程和数据可视化的关键手段。

HT 动画介绍

在足够短的时间内快速连续地改变物体的某个属性,人的眼睛会感知到物体在平滑移动,这种利用人类视觉持续性产生的效果就是动画。图扑自研 HT for Web 产品中提供了多种创建动画方式,其中很常见的是使用 ht.Default.startAnim 创建动画

ht.Default.startAnim 支持两种动画模型:Frame-Based 和 Time-Based。这两种类型的动画所需的参数各不相同:

Frame-Based 帧动画具有固定的帧数,即 action 被调用的次数,创建动画时需传入一下参数:

  • frames:动画的帧数。
  • Interval:动画帧间隔毫秒数。
  • easing:动画缓动函数,默认为 ht.Default.animEasing。
  • finishFunc:动画完成后的回调函数。
  • action:必须提供 action 函数,用于实现动画过程。第一个参数代表通过 easing 函数运算后的值,第二个参数代表当前动画进度(0~1)。

Time-Based 周期动画,动画帧数(action 的调用次数)取决于系统环境,创建动画需要传入的参数:

  • duration:动画周期的毫秒数,默认使用 ht.Default.animDuration。
  • easing:动画的缓动函数,默认使用 ht.Default.animEasing。
  • finishFunc:动画结束时的回调函数。
  • action:必须提供 action 函数,用于实现动画过程。

以小球落地过程为例,只需在动画过程中不断调整小球的位置属性,就能实现小球落地的动画效果:

const ball = dm.getDataByTag('ball'); // 获取小球节点
const elevation = ball.getElevation(); // 获取小球节点纵向位置
ht.Default.startAnim({
    duration: 1500, 
    easing: t => t,
    finishFunc: function () { }, 
    action: function (v, t) {
        ball.setElevation(elevation - elevation * v); // 在动画中调整节点纵向位置
    }
});

 

在上图中,小球的落地动画效果已实现,但动画看起来仍显得有些生硬。这是因为在现实中,小球落地是加速运动的,并且当小球接触地面后,受力变化会导致回弹。因此,我们还需要在动画中控制小球的速度和运动趋势,以便更真实地模拟这一过程。

那么如何在动画中控制速度呢?

这就需要引用下面的 easing 函数使用。

关于 Easing 函数

Easing(缓动函数)是用于调整动画速度的函数,它们定义了动画在开始、进行中和结束时的速度变化。这些函数允许动画以非线性方式运行,使动画效果更自然、流畅和有吸引力。缓动函数在坐标轴中的表现可以看作是一个以时间(t)为横轴、值为纵轴的图表。以下附图展示了一些常用的 easing 函数,从图中可以清晰地看到不同 easing 的变化趋势。

了解了 easing 函数的作用后,我们可以通过调整它来实现小球落地时的加速运动以及接触地面后的回弹效果。

ht.Default.startAnim({
    duration: 1500,
    easing: function (t) {
        const n1 = 7.5625;
        const d1 = 2.75;
        if (t < 1 / d1) {
            return n1 * t * t;
        } else if (t < 2 / d1) {
            return n1 * (t -= 1.5 / d1) * t + 0.75;
        } else if (t < 2.5 / d1) {
            return n1 * (t -= 2.25 / d1) * t + 0.9375;
        } else {
            return n1 * (t -= 2.625 / d1) * t + 0.984375;
        }
    },
    finishFunc: function () { }, 
    action: function (v, t) {
        ball.setElevation(elevation - elevation * v);
    }
});

 

在实际项目中,物体的运动通常较为复杂,因此我们需要根据不同的运动类型选择合适的 easing 函数。以下示例展示了在场景内的节点进行不同运动时,不同 easing 函数所产生的效果。

大家也可以该通过链接进行操作感受,通过切换不同的 easing 函数将呈现出不一样的动画效果:https://hightopo.com/demo/easing_animation_demo/ 。

示例展示了多个动画的连续播放效果。我们可以在动画的 finishFunc 回调结束时,调用下一个动画,从而实现连续的动画效果。

ht.Default.startAnim({
    duration: 1500,
    easing: function (t) {    ......},
    action: function (v, t) { ...... },
    finishFunc: function () {
        // 调用下一个动画        
        ht.Default.startAnim({            
            ......        
        })    
     }, 
});

总结

常听人说 Easing 是动画的灵魂,就如同生命的节奏。有些人厚积薄发,有些人平稳一生,而也有些人起起伏伏,经历着高山低谷的跌宕起伏。无论过程如何多样精彩,终点都是一致的——正如动画中无论怎样变化的 Easing 曲线,最终都通向同一个终点帧。动画和人生一样,丰富的过渡和变化,赋予它们独特的美感和深意。

 

标签:动画,函数,掌控,Default,物体,ht,easing,action,Easing
From: https://www.cnblogs.com/xhload3d/p/18513963

相关文章

  • YOLO11改进 | 卷积模块 | 无卷积步长用于低分辨率图像和小物体的新 CNN 模块SPD-Conv
    秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转......
  • 掌控《F1车队经理2024》v1.3赛场:风灵月影十六项修改器使用手册
    引言《F1车队经理2024》v1.3是一款深受F1赛车迷喜爱的模拟经营类游戏,玩家可以扮演车队经理,管理车队、制定策略、培养车手,并带领车队在F1赛场上争夺荣誉。然而,对于部分玩家来说,游戏中的某些挑战可能过于艰巨,影响了他们的游戏体验。为了帮助这部分玩家更好地享受游戏,风灵月影团......
  • 基于数字图像matlab-运动物体检测
                            目录一.课程设计任务二.课程设计原理及设计方案1三.课程设计的步骤和结果四.设计体会4五.参考文献5             一 课程设计任务    在视频监控领域,需要对监控画面进行存储。长时间......
  • 20241025物体分割
    在计算机视觉中,语义分割、实例分割和全景分割都是图像分割的重要方法,它们帮助模型理解图像中每个像素的语义信息。下面是对这三种分割技术的解释和示例:语义分割(SemanticSegmentation)语义分割是指将图像中的每个像素分类到预定义的类别中。在语义分割中,不区分同一类别的不同......
  • 【八叉树】从上千万个物体中【**瞬间**】就近选取坐标
    众里寻他千百度,蓦然回首,那人却在灯火阑珊处前情提要在某些情况下,我们在场景中创建了数百万个物体,这些物体没有直接的网格或碰撞体(例如,通过GPU绘制的物体),因此无法通过常规的射线检测与碰撞体进行交互。我们仅掌握这些物体的坐标或顶点位置。在这种情况下,我们该如何通过鼠标来......
  • YOLO-物体检测
    #encoding:utf-8fromultralyticsimportYOLOfromPILimportImage,ImageDraw,ImageFontmodel=YOLO("yolov8n.pt")image1_path="img/guangzhou.jpg"result=model.predict(image1_path)img=Image.open(image1_path)draw=ImageDraw.......
  • Unity Physics.Raycast发射一条射线并检测它与场景中物体的碰撞
    在Unity中,Physics.Raycast是一种非常常用的物理检测方法,用于发射一条射线并检测它与场景中物体的碰撞。这种方法在许多游戏场景中非常重要,例如用于射击、检测地面、触发事件等。1.基本概念射线(Ray):在三维空间中,射线是一个从某一点出发并沿着某个方向延伸的无穷长线。碰撞......
  • Unity3D c# 使对象物体始终面向摄像机
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassLookAtMainCamera:MonoBehaviour{ //Usethisforinitialization voidStart(){ } //Updateiscalledonceperframe voidUpdate(){......
  • Faster R-CNN模型微调检测航拍图像中的小物体
    关于深度实战社区我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万+粉丝,拥有2篇国家级人工智能发明专利。社区特色:深度实战算法创新获取全部完整项目......
  • YoloDotNet v2.1:实时物体检测的利器
    https://www.cnblogs.com/shanyou/p/18457208 项目介绍YoloDotNetv2.1是一个基于C#和.NET8的实时物体检测框架,专为图像和视频中的物体检测而设计。它集成了Yolov8~Yolov11模型,通过ML.NET和ONNX运行时实现高效的物体检测,并支持GPU加速(使用CUDA)。YoloDotNet......