三维场景中常用的路径动画

简介: 三维场景中常用的路径动画

三维场景中常用的路径动画


前言


在三维场景中,除了用逼近真实的模型代表现实中的设备、标识物外,通常还会使用一些动画来表示模型在现实中一些行为和作用。常见的动画比如路径动画、旋转动画、发光动画、流动动画等。本文将为大家介绍几种常用的路径动画。首先,最简单的自然是直线路径动画。


直线路径动画


比如以下场景,地铁需要从上一站A驶入当前站B,在此过程中,我们将AB组合成一条路径(假设路径为直线),使用动画,不停的设置地铁(模型)的在路径上的位置,就可以实现地铁从A站-B站的动画过程。


1const points = [A, B];
 2// 创建路径
 3let path = new mono.Path();
 4points.forEach((point, i) => {
 5  const { x, y, z } = point;
 6  if (i == 0) {
 7    path.moveTo(x, y, z);
 8  } else {
 9    path.lineTo(x, y, z);
10  }
11});
12// 动画
13const instance = new mono.Animate({
14    form: 0,
15    to:1,
16    dur:3000,
17    delay,
18    reverse:false,
19    repeat: 1,
20    easing,
21    onPlay,
22    onUpdate: (val) => {
23      // 获取路径上的点
24      const point = path.getPointAt(val);
25      // 设置实体位置
26      entity.setPosition(point);
27    },
28    onDone,
29});
30instance.play();


动画效果:


微信图片_20220425134842.gif


至此,直线路径动画就实现了。那么现在想想,现实场景中不可能只有直线运动这种场景,比如小车巡检,就属于一个折线场景,那么我们就需要使用折线动画来完成。


折线路径动画


小车在房间内不间断的通过巡检监控,记录设备状态及检测相关数据。模拟小车巡检动画,我们需要采集巡检小车核心点位:A、B、C、D。同样的将ABCD组合成路径,不停的设置小车(模型)位置


1const points = [A, B, C, D];
 2// 创建路径
 3let path = new mono.Path();
 4points.forEach(...);
 5// 动画
 6const instance = new mono.Animate({
 7    ...
 8    onUpdate: (val) => {
 9      // 获取路径上的点
10      const point = path.getPointAt(val);
11      // 设置实体位置
12      entity.setPosition(point);
13    },
14    onDone,
15});
16instance.play();


动画效果:折线路径


微信图片_20220425134846.gif


当然,巡检过程可能是一个循环的闭合路径,所以可以满足使用四个点创建闭环路径,行形成闭环路径动画


折线路径闭环动画


1const points = [A, B, C, D];
 2// 创建路径
 3let path = new mono.Path();
 4points.forEach(...);
 5// 闭环路径
 6path.closePath()
 7// 动画
 8const instance = new mono.Animate({
 9    ...
10});
11instance.play();


动画效果:闭环路径


微信图片_20220425134850.gif


上面的折线动画是完成了,但是转弯的时候似乎略显生硬,接下来我们再尝试如何让转弯更自然。


圆润的折线路径动画


其实很简单,在已有的折线动画基础上,对路径先进行一步拐角处理,让路径整体显得很趋于自然。


1const points = [A, B, C, D];
 2// 创建路径
 3let path = new mono.Path();
 4points.forEach(...);
 5// 闭环路径
 6path.closePath()
 7// 获取平滑路径, 让转弯更自然
 8path = mono.PathNode.prototype.adjustPath(path, 20, 1);
 9// 动画
10const instance = new mono.Animate({
11    ...
12});
13instance.play();


动画效果:转弯更加的自然


微信图片_20220425134855.gif自然弯道.gif


实现了圆润的折线路径动画后,貌似看起来已经完工了。其实再仔细观察下,可以发现,在转弯的时候,模型没有同步转向,那么我们需要如何处理呢。


模型与路径动画同步旋转


在折线动画中,将模型绕对应的旋转旋转方向即可


1const points = [A, B, C, D];
 2// 创建路径
 3let path = new mono.Path();
 4points.forEach(...);
 5// 闭环路径 获取平滑路径, 让转弯更自然
 6...
 7// 旋转向量
 8const rotate = new mono.Vec3();
 9// 动画
10const instance = new mono.Animate({
11    onUpdate: (val) => {
12      // 位置
13      ...
14      // 模型同步旋转
15      const tangent = path.getTangentAt(val);
16      var normal = new mono.Vec3(0, 0, -1);
17      rotate.rotationTowards(normal, tangent);
18      entity.setRotation(rotate);
19    }
20});
21instance.play();


动画效果:可以看到小车上的摄像头是一直朝向设备

微信图片_20220425134858.gif

同步.gif


那么,直线路径动画和折线路径动画介绍完了。从上面动画截图中可以看出,我们是在一个固定的位置查看动画,那么,能让镜头沿着路径一起移动么


镜头沿路径动画一起移动


显然,镜头是可以沿着路径同时移动的。通常用于巡航(自动巡检)中.主要是在折线动画的基础上,同步设置镜头动画的位置和朝向点。


1const points = [....];
 2// 创建路径
 3let path = new mono.Path();
 4points.forEach(...);
 5// 闭环路径 获取平滑路径, 让转弯更自然
 6...
 7// 镜头初始位置
 8  const pos = camera.p(),
 9    target = camera.t();
10  const length = pos.clone().sub(target).length();
11// 动画
12const instance = new mono.Animate({
13    onUpdate: (val) => {
14      // 模型
15      ...
16      // 镜头沿路径动画
17      const tangent = path.getTangentAt(value);
18      point = path.getPointAt(value);
19      ntarget = point.clone().add(tangent.multiplyScalar(length));
20      camera.p(point);
21      camera.lookAt(ntarget);
22    }
23});
24instance.play();


动画效果:


微信图片_20220425134903.gif


既然能让镜头沿着路径同步移动,那么是否能让镜头与路径保持平行移动呢


镜头与路径保持平行一起移动


保持平行移动,其实是在点位的基础上,将镜头位置设置到对应距离点位置。以下是基于动画链完成的某流水线作业动画,需要路径动画同时,镜头同步移动。对动画链有兴趣的可参考前文《基于路径集合的三维动画链


1const points = [....];
 2// 创建路径
 3let path = new mono.Path();
 4points.forEach(...);
 5// 闭环路径 获取平滑路径, 让转弯更自然
 6...
 7// 镜头相对于目标动画模型的距离
 8const dis = 550
 9// 动画
10const instance = new mono.Animate({
11    onUpdate: (val) => {
12      // 模型
13      ...
14      // 镜头平行X轴动画
15      point = path.getPointAt(value);
16      camera.setPosition(point.clone().add(new mono.Vec3(0, dis, dis)));
17      camera.lookAt(point);
18    }
19});
20instance.play();


动画效果:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/04c4cc7d312a4810b31fa7be191e7c93~tplv-k3u1fbpfcp-zoom-1.image


案例说明


上面举例说明动画的示意图,来自两个案例,一个是地铁站三维可视化,可以认为是一个轨道交通方面的;另外一个是实验室车间 流水线可视化,主要用于流水线,设备监控等三维可视化呈现。

结语

至此,路径动画已经介绍的差不多了。利用常用的动画能够让整个三维场景更丰满,写实。希望在项目中可以多多利用起来。

相关文章
|
并行计算 PyTorch 算法框架/工具
mmcv-full1.3.8 在win10上的安装
mmcv-full1.3.8 在win10上的安装
1001 0
|
8月前
|
边缘计算 运维 监控
边缘计算场景实践
《边缘计算场景实践指南》系统阐述了边缘计算在5G、物联网与AI背景下的应用路径。涵盖云边端协同架构、ENS核心产品、CDN、视频分析与物联网等典型场景,详解部署流程、网络优化、安全防护与监控体系,并结合智慧工厂案例与成本分析,展望5G+边缘计算融合趋势,为企业落地边缘计算提供全面参考。(238字)
513 0
|
人工智能 搜索推荐 程序员
AI神器Deepseek:3分钟搞定一篇爆款文案!
大家好,我是小米,一个31岁、热爱分享技术的自媒体人。本文将介绍如何使用Deepseek写文案。Deepseek是一款基于AI的文案生成工具,能快速生成高质量文案,支持多种语言风格,帮助提高写作效率。文中通过具体案例——为咖啡店新品“焦糖玛奇朵”撰写推广文案,详细讲解了从明确目标到发布文案的全过程,并提供了优化和应用技巧。如果你还在为写文案发愁,不妨试试Deepseek,它将成为你的得力助手!
2539 23
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
567 3
|
Java Android开发 开发者
Android10 修改开发者选项中动画缩放默认值
Android10 修改开发者选项中动画缩放默认值
958 0
|
安全 网络协议 定位技术
决定海外代理IP网速快慢的六大因素
在全球化互联网时代,海外代理IP服务因能访问受限内容、保护隐私和提高网络安全而备受欢迎。本文探讨了决定海外代理IP网速的六大关键因素:服务器地理位置、带宽和性能、同时连接的用户数量、网络路径质量、代理类型与协议,以及用户端网络环境,帮助用户做出明智选择,享受快速稳定的代理服务。
|
前端开发 Java 数据库连接
开源一个基于SpringBoot的咖啡商城系统
开源一个基于SpringBoot的咖啡商城系统
608 0
开源一个基于SpringBoot的咖啡商城系统
|
Web App开发 JavaScript 前端开发
Windows环境下 NVM 介绍、下载安装及使用详解
Windows环境下 NVM 介绍、下载安装及使用详解
2539 0
|
前端开发 JavaScript
Threejs实现波动热点效果,波动标记,波动标签显示
Threejs实现波动热点效果,波动标记,波动标签显示
930 0
Threejs实现波动热点效果,波动标记,波动标签显示
|
算法 前端开发 开发者
一次过!快速申领软件著作权
申领软件著作权是保护软件知识产权的有效途径,对于软件开发者、软件企业等拥有者来说具有重要意义。本文将快速介绍申领软件著作权相关知识,包括软件著作权的定义、申请流程、申请材料等。
692 1

热门文章

最新文章