0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HT 流畅过渡动画 × 场景切换实现方案

图扑-数字孪生 来源:图扑-数字孪生 作者:图扑-数字孪生 2025-09-03 14:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在图扑 HT 项目中,尤其是复杂应用里,单一场景或图纸通常难以承载所有需求,因此在多个图纸或场景之间进行切换是一种常见的实现方式。本文将深入解析图扑 HT 项目中场景/图纸切换的核心实现方法,并详细介绍如何为切换过程添加流畅自然的过渡效果,以提升用户体验。

wKgZO2i35PCAToFmAAei5wYc7Ok341.png

场景 / 图纸核心切换步骤

图扑 HT 项目中,实现图纸或场景的无缝切换需严格遵循以下关键步骤,以避免潜在问题并确保切换过程稳定可靠:

  1. 清除当前的数据模型
  2. 使用 dataModel.clear() 清除当前场景关联的所有数据模型。
  3. 反序列化新场景/图纸
  4. 通过 view.deserialize(url) 方法加载并反序列化新的场景或图纸资源文件,完成新场景的载入。

注意:不建议通过创建多个 ht.graph3d.GraphView 进行切换。

原因在于 ht.graph3d.GraphView 是基于 WebGL 的 3D 渲染组件。而多数浏览器对单个页面可运行的 WebGL 上下文数量有严格限制。频繁创建新实例会导致内存泄漏或资源耗尽,引发场景显示异常甚至浏览器崩溃。

场景切换过渡效果

为了在场景切换时获得更流畅、更具视觉吸引力的体验,可以添加过渡动画。常见的实现思路有两种:

利用场景属性实现过渡

通过控制场景的特定属性,在切换过程中产生动态过渡效果,常见的有景深动画和亮度调节等。

景深动画过渡

景深效果主要通过以下两个属性控制:

  • image 属性:模拟景深的贴图(通常为四周黑色、中间透明的 PNG 图片,黑色区域应用景深模糊,透明区域保持清晰)。
  • aperture(孔径)属性:代表中间空白区域的大小,取值范围 0~1,0 表示无景深效果,1 表示景深效果最明显。
wKgZPGi35PGAdy6vADBsqMO5GU0259.gif

实现步骤

使用一张全黑景深贴图(确保整个场景受景深影响),在旧场景切换前开启景深并执行递增孔径值的动画,新场景加载后执行递减孔径值的动画,形成“渐隐渐显”的过渡效果。

let dof = g3d.getPostProcessingModule('Dof');
dof.image = 'assets/景深.png'
dof.aperture = 0
// 景深开启
g3d.enablePostProcessing('Dof', true);
let anim = {
      duration: 800,
      easing: (t: number) => {
         return t * t;
      },
      action: (v: number, t: number) => {
        // 动态设置景深阈值
        dof.aperture = v * 0.2
        }
}
ht.Default.startAnim(anim);

新场景反序列化后,新场景也需要执行景深动画。这时执行的景深动画跟旧场景的景深动画区别在于 action 中的逻辑是递减的过程:dof.aperture =0.2-v*0.2。

wKgZO2i35PKAceGLAD-0Ceg3Sls538.gifwKgZPGi35PSAUHcdADxyVBw7d1Y445.gif

其他属性过渡效果

除景深外,还可通过调节亮度等场景属性实现过渡,原理与景深动画一致:

  • 旧场景切换前,执行属性动画(如亮度逐渐降低至 0,场景变暗);
  • 新场景加载后,执行反向动画(如亮度从 0 逐渐恢复至正常值,场景变亮)。

利用 2D 图纸动画实现过渡

通过在 3D 场景上层叠加 2D 图纸,利用 2D 元素的动画效果遮蔽切换过程,创意自由度更高,为整体呈现带来了更多的艺术动感和技术深度。

帧动画过渡(云朵过渡)

旧场景被“云朵”图片序列逐渐覆盖(遮蔽),切换新场景后,“云朵”再逐渐消散以展现新场景。

wKgZO2i35PaAdj9RADoYPHHgvtI927.gif

实现步骤

  1. 准备一组连续的过渡图片(如从透明到完全遮蔽再到透明的云朵图片序列);
  2. 旧场景切换前,执行动画使图片从初始状态过渡到完全遮蔽场景;
  3. 新场景加载后,执行反向动画使图片从完全遮蔽过渡到消失。

代码示例

const cloudList = [    
    "assets/cloud1.png",
    "assets/cloud2.png",
    ...
    "assets/cloud20.png",
];
const image = this.getDataByTag('cloud');
let i = 0;
ht.Default.startAnim({
    frames: 20,
    interval:50,
    action: (t) => {
        cloudList[i] && image.setImage(cloudList[i]);
    }
})

在新旧场景内执行的动画代码基本一样,区别在于切换前 action 中是从第一张图片切换到最后一张,在新场景反序列化后是从最后一张切换回第一张。

其他创意效果

利用 2D 覆盖层进行过渡的核心优势在于创意自由度极高。开发者可以结合 HT 强大的 2D 动画能力,对覆盖元素应用多种属性动画组合:

  • 渐入渐出的遮罩层动画;
  • 模拟镜头推拉的缩放动画;
  • 基于路径的元素移动动画;
  • ……
wKgZPGi35PiAOPbXAEGCLGXSTzc160.gif

2D 图纸间切换过渡

前文主要探讨了 3D 场景的切换过渡。同样地,在纯 2D 图纸 (ht.graph.GraphView) 之间进行切换时,也可以利用 HT 的 2D 特性实现平滑的过渡效果。一种实用的方法是动态生成并动画化当前视图的缩略图。

利用缩略图过渡

在图纸切换前动态生成缩略图并施加动画,实现平滑过渡的效果,具体的实现步骤:

■生成当前视图缩略图:在触发图纸切换前,使用 gv.toDataURL() 生成当前视图的缩略图。

■创建过渡节点:

生成与图纸视图窗口尺寸相同的节点。

将缩略图设置为该节点的内容。

■应用动画效果:在动画中调整缩略图节点的裁切、透明等属性,以达到过渡效果。

wKgZO2i35PqAIjgNAC9NdSOOBF8233.gif

代码示例

functiongenerateThumbnail() {
     var jsonSerializer = new ht.JSONSerializer(dm); // 创建序列化器,并传入旧图纸的 dm
     jsonSerializer.isSerializable = function (data) { // 过滤节点
         return data.getTag() != 'mask';
     }
     var json = ht.Default.parse(jsonSerializer.serialize()); 
     json.a = {};
     const gv = new ht.graph.GraphView(); // 创建一个新的2D 视图
     gv.dm().deserialize(json); // 反序列化


     const thumbnail = gv.toDataURL(null, null, 1, 0); // 生成缩略图
}
functioncreateThumbnailData(thumbnail){
     const thumbnail_data = new ht.Node(); // 生成缩略图节点
     thumbnail_data.setImage(thumbnail);
     const contentRect = gv.getContentRect(); // 获取所有图元占用的矩形区域
     const rect = div.getBoundingClientRect();// 获取2D视图尺寸
     const width = rect.width;
     const height = rect.height;
     thumbnail_data.p({ x: contentRect.x + contentRect.width / 2, y: contentRect.y + contentRect.height / 2 }) // 为缩略图节点设置位置
     thumbnail_data.setSize({ width, height });// 为缩略图节点设置尺寸
     thumbnail_data.setScale(contentRect.width / width, contentRect.height / height);// 为缩略图节点设置缩放
     thumbnail_data.setAnchor({ x: 0.5, y: 0.5 });
     dm.add(thumbnail_data);


     const mask = dm.getDataByTag('mask'); 
     thumbnail_data.setHost(mask); 
     thumbnail_data.s('clip.host', true); // 开启吸附裁切后,缩略图节点会根据吸附的节点进行裁切


     ht.Default.startAnim({
        duration: 2000,
        easing: function (t) { return t; },
        finishFunc: function () {
              dm.remove(thumbnail_data); // 动画结束后移除缩略图节点
        },
        action: function (v, t) {
              thumbnail_data.s('opacity', 1 - v + 0.1);
              mask.setScaleX(1 - v);
              thumbnail_data.iv();
        }
     });
}


view.mi((e) =>{
  if(e.kind === 'onClick' && e.type === 'data'){
        if(e.data.getTag() === 'switchBtn'){ // 点击按钮切换图纸
        const thumbnail = generateThumbnail(); // 生成缩略图
        ....
        createThumbnailData(thumbnail); // 生成缩略图节点
        ...
      }
    }
})

在图扑软件 HT 项目中实现场景/图纸切换,关键在于遵循 dataModel.clear() + view.deserialize() 的核心步骤,并避免重复创建 ht.graph3d.GraphView 实例。

为了提升用户体验,添加过渡效果是重要环节。无论是通过动态调整场景后处理属性(如景深、亮度)还是利用精心设计的 2D 图纸动画(如帧序列),本质上都是对 HT 引擎灵活性和设计者创意的结合应用。不仅优化了技术流程,更能创造出引人入胜的视觉表现,是当前 Web 可视化项目中的重要实践。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HT
    HT
    +关注

    关注

    0

    文章

    47

    浏览量

    30853
  • 可视化
    +关注

    关注

    1

    文章

    1316

    浏览量

    22581
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    图扑软件 3D 场景预加载应用实现

    应用中,资源预加载尤为重要,可有效解决首次加载时的卡顿、白屏及交互延迟等问题。 预加载实现方案 01 基础实现原理 HT for Web 中所有资源的请求都会经过
    的头像 发表于 12-01 16:04 60次阅读
    图扑软件 3D <b class='flag-5'>场景</b>预加载应用<b class='flag-5'>实现</b>

    HT7180单串多串锂电池升压方案2.7V-12V电压10A电流禾润电子一级代理聚能芯半导体原厂技术支持

    在智能硬件、便携设备迭代加速的当下,电源方案的适配性、动力性与安全性成为产品竞争力的核心。禾润 HT7180 宽压升压芯片横空出世,以四大核心优势打破行业瓶颈,为多场景设备提供高效稳定的电源解决
    发表于 11-19 18:02

    禾润电子HT0104:4 路双向电平转换的高效解决方案聚能芯半导体一级代理原厂技术支持

    中尤为重要。 从物联网设备的跨模块通信,到工业总线的电平匹配,再到消费电子的多电压域交互,HT0104 以其宽兼容、高可靠、易集成的优势,完美适配各类应用场景。无需复杂外围电路,即可实现稳定的跨电压域
    发表于 11-13 17:21

    智能显示模块可以播放动画吗?动画功能怎么实现,在哪可以添加?

    智能显示模块可以播放动画吗?动画功能怎么实现,在哪可以添加?
    发表于 11-08 08:57

    图扑 HT 自研技术架构下 AR 应用开发与行业解决方案实现

    、实时数据交互与空间识别能力,在建筑施工建造、数据中心机柜管理、办公空间导航三大核心场景中,实现了从技术架构到落地应用的全链路自研可控,为行业提供高效、精准、安全的数字化解决方案,推动传统行业向智能化管理模式升级。 图扑
    的头像 发表于 10-10 11:27 316次阅读
    图扑 <b class='flag-5'>HT</b> 自研技术架构下 AR 应用开发与行业解决<b class='flag-5'>方案</b><b class='flag-5'>实现</b>

    SGTools--动画控件--屏幕实现动画显示 就是这么简单

    详细步骤可以观看视频, 实现动画很简单,提前准备好gif文件和一个张背景图 使用SGTools工具,就可以制作动画界面啦 视频中屏幕型号是7寸 HMT070ATA-9C
    发表于 09-16 10:29

    【M-K1HSE开发板免费体验】相关源码之阅读和分析1-使用XComponent + Vsync 实现自定义动画

    Native 层的 EGL/OpenGL ES 进行高性能的自定义图形渲染,并通过 Vsync (垂直同步) 信号来驱动动画的刷新,最终解决UI卡顿问题,实现流畅的自定义动画。 这是
    发表于 09-03 16:05

    分享---储能UI界面能量流动动画实现方法

    本文分享 工商业储能设备的UI界面中如何实现 能量流动的动画效果。 本例子效果 基于拓普微工业级 7寸屏电容串口屏(HMT070ETA-D型号)实现: 第1步:建立工程和页面 使用SGTools新建
    发表于 09-02 18:22

    禾润 HT0104MTNR:TXB0104PWR/TXS0104EPWR/RSO1O4YQ 的完美替代方案,重新定义电平转换价值

    TXB0104PWR 的 VCCA、VCCB、A/B 端口及 OE 控制逻辑。这意味着无需修改 PCB 布局,即可直接替换现有方案,显著降低开发成本与时间风险。无论是工业设备升级还是消费电子量产,均能快速实现平滑过渡
    发表于 08-08 17:48

    鸿蒙5开发宝藏案例分享---体验流畅的首页信息流

    ?** 鸿蒙新闻类首页开发全攻略:流畅动效+懒加载实战** Hey 各位鸿蒙开发者! 今天要分享一个超实用的鸿蒙新闻类首页开发方案,官方文档里藏着的宝藏案例被我挖出来了!从流畅的Tab切换
    发表于 06-12 11:42

    鸿蒙5开发宝藏案例分享---在线短视频流畅切换

    的优化方案躺在那儿,从短视频秒切到金融App防崩溃,连代码都给你打包好了!**最离谱的是,这么硬核的案例库居然没几个人知道? 今天必须当回课代表,把压箱底的黑科技掏出来,尤其那个让短视频切换如德芙般丝滑
    发表于 06-12 11:31

    HT71663同步升压2.7V-13V输入10A聚能芯半导体禾润一级代理

    在便携式设备飞速发展的今天,电源转换效率与产品尺寸始终是行业难以平衡的难题。但现在,HT71663 高功率全集成升压转换器强势登场,一举打破僵局,为便携式系统带来颠覆性的高效小尺寸解决方案
    发表于 05-09 18:00

    用DeepSeek-R1实现自动生成Manim动画

    动画,视觉化呈现抽象的概念与原理。 什么是Manim?  Manim 是一个基于 Python 的动画引擎,专门用于创建高质量的数学相关动画,广泛应用于教育、科普等领域,帮助人们更直观地理解抽象的数学概念和原理。所有 有志于从事
    的头像 发表于 02-07 12:31 4637次阅读
    用DeepSeek-R1<b class='flag-5'>实现</b>自动生成Manim<b class='flag-5'>动画</b>

    流畅刻入骨子里的ColorOS 15,成功卫冕鲁大师“2024年度最流畅手机系统”

    2024“年度最流畅手机系统”大奖,被来自绿厂ColorOS 15收入囊中,它在全场景动画效果上展现出了令人难以置信的丝滑体验。
    的头像 发表于 01-07 10:09 856次阅读

    鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用

    纠结繁琐细节,可轻松地构建路由框架,缩短构建周期,实现模块高效解耦,为应用带来更加流畅自然的页面跳转性能。某头部办公APP使用该方案后,有效降低路由框架搭建难度,搭建周期从1个月下降至1天
    发表于 01-02 18:00