news 2026/4/16 13:07:00

ECharts 水球图不够炫?试试 RayChart 的创意可视化玩法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ECharts 水球图不够炫?试试 RayChart 的创意可视化玩法

有趣的3D图表水球:从 ECharts 到 RayChart 的升维打击

在数据可视化大屏中,“水球图”(Liquid Fill Chart)绝对是展示百分比数据(如CPU使用率、完成度、剩余电量)的颜值担当。

大家最熟悉的莫过于 ECharts 的echarts-liquidfill插件。它简单、好用,但在这个“卷”视觉的时代,传统的 2D 扁平水球有时显得不够“震撼”。

今天我们来聊聊一个有趣的话题:如何用 RayChart 手搓一个真实的 3D 水球,并对比它与 ECharts 水球的区别。

1. 传统的 2D 做法:ECharts LiquidFill

ECharts 的水球本质上是2D Canvas/SVG 绘图

原理

它的“波浪”并不是真的流体,而是通过数学公式(通常是正弦函数y = A * sin(Bx + C) + D)在 2D 平面上绘制出的闭合路径。通过不断改变相位(Offset),让曲线平移,从而产生“波动”的视觉错觉。

特点

  • 优点
    • 性能极佳:几乎不占用 GPU 资源。
    • 兼容性好:甚至可以在不支持 WebGL 的环境运行。
    • 配置简单:几行配置就能搞定。
  • 缺点
    • 扁平:没有厚度,没有光影。
    • 质感单一:虽然可以加渐变色,但无法表现出水的折射、玻璃的通透感。

2. 进阶的 3D 做法:RayChart 硬核实现

为了追求“透亮”、“像真水一样”的效果,我们必须引入WebGLPBR(基于物理的渲染)

在我的开源项目RayChart中,我实现了一个Liquid3D组件。下面来看看它是如何“骗”过你的眼睛的。

核心构成

一个真实的 3D 水球通常由三部分组成:

  1. 玻璃外壳:一个透明的球体容器。
  2. 液体主体:球体内部被截断的下半部分。
  3. 液体表面:一个随波浪起伏的顶盖。

技术实现细节

A. 玻璃外壳 (The Glass Shell)

ECharts 很难做出的效果就是“玻璃感”。在 RayChart (基于 Three.js) 中,我们使用MeshPhysicalMaterial,并开启transmission(透光率)属性。

const shellMaterial = new THREE.MeshPhysicalMaterial({ color: 0xffffff, transmission: 0.9, // 90% 透光,像玻璃一样 roughness: 0, // 极其光滑 ior: 1.5, // 折射率,模拟玻璃/水晶 thickness: 0.5, // 厚度,产生真实的折射效果 transparent: true });

这让背景能够透过球体产生扭曲,质感瞬间拉满。

B. 液体主体:着色器里的“裁剪术”

液体本身其实也是一个球体(SphereGeometry),但我们需要根据水位把它“切”开。

普通的clippingPlanes切出来是平的,没有波浪。所以我们需要写一点 Shader(着色器)。

秘籍:使用onBeforeCompile修改标准材质,在 Fragment Shader 中加入discard逻辑。

// GLSL 片段着色器伪代码 float h = getWaveHeight(vWorldPosition.x, vWorldPosition.z); // 计算波浪高度 // 如果当前像素的高度 > 水位 + 波浪高度,就丢弃(不渲染) if (vWorldPosition.y > uLevelY + h) discard;

这样,原本完整的球体就被“切”出了一个起伏的边缘。

C. 液体表面:动态波浪

被切掉的顶部不能空着,需要盖一个“盖子”。这个盖子是一个高密度的PlaneGeometry

难点:盖子的波动必须和球体的切口严丝合缝,否则会漏水。

解决方案:

  1. 几何同步:表面使用与主体完全相同的波浪公式(正弦波叠加)。
  2. 圆形遮罩:因为 Plane 是方形的,我们需要在 Shader 里把超出球体半径的部分裁掉。
// Vertex Shader: 让顶点随波浪起伏 vec3 pos = position; float waveH = getWaveHeight(worldPos.x, worldPos.z); pos.y += waveH; // 顶点置换 // Fragment Shader: 切成圆形 if (length(vUv - 0.5) * 2.0 > 1.0) discard;

3. 终极对比:ECharts vs RayChart

维度ECharts LiquidFillRayChart Liquid3D
渲染引擎Canvas / SVGWebGL (Three.js)
视觉维度2D 平面3D 空间
质感色块、渐变、扁平阴影折射、反射、高光、环境光遮蔽
交互鼠标悬浮高亮360度旋转、缩放、甚至可以晃动液体
性能开销⭐ (极低)⭐⭐⭐ (中高,依赖 GPU)
适用场景普通报表、H5 页面、移动端大屏可视化、数字孪生、高逼格演示

4. 总结

  • 如果你需要一个快速加载、兼容性强的进度展示,ECharts依然是首选。
  • 如果你在做酷炫的数据大屏,想要那种“看起来很贵”的效果,RayChart的 3D 水球绝对值得一试。

RayChart项目正在探索更多这样的 3D 图表组件,希望能把 WebGL 的门槛降下来,让大家都能轻松用上“电影级”的图表。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:28:17

Open Interpreter科研助手:实验数据处理自动化方案

Open Interpreter科研助手:实验数据处理自动化方案 1. 引言 在科研工作中,实验数据的处理往往占据了研究人员大量时间。从原始数据清洗、格式转换到统计分析与可视化,每一个环节都可能涉及复杂的编程操作,尤其对于非计算机专业的…

作者头像 李华
网站建设 2026/3/21 0:11:29

HY-MT1.5-1.8B部署日志分析:常见错误定位实战教程

HY-MT1.5-1.8B部署日志分析:常见错误定位实战教程 1. 引言 随着多语言应用场景的不断扩展,高效、轻量且支持边缘部署的翻译模型成为实际工程落地的关键需求。HY-MT1.5-1.8B 作为混元翻译系列中的轻量级主力模型,在保持高性能的同时显著降低…

作者头像 李华
网站建设 2026/3/27 19:57:01

手把手教你用bert-base-chinese搭建问答系统

手把手教你用bert-base-chinese搭建问答系统 在自然语言处理(NLP)领域,构建一个高效、准确的中文问答系统是许多智能应用的核心需求。得益于预训练语言模型的发展,尤其是 BERT 系列模型的出现,开发者可以快速实现高质…

作者头像 李华
网站建设 2026/4/16 14:32:59

Pyodide完整教程:在浏览器中零配置运行Python的终极指南

Pyodide完整教程:在浏览器中零配置运行Python的终极指南 【免费下载链接】pyodide Pyodide is a Python distribution for the browser and Node.js based on WebAssembly 项目地址: https://gitcode.com/gh_mirrors/py/pyodide 你是否曾梦想过在浏览器中直接…

作者头像 李华
网站建设 2026/4/16 15:45:47

MinerU批量处理秘籍:云端并行转换100+PDF不卡顿

MinerU批量处理秘籍:云端并行转换100PDF不卡顿 你是不是也遇到过这样的情况:手头一堆法律案件的PDF文档,动辄几十页上百页,想把内容提取出来整理成可编辑的格式,结果本地电脑一打开就卡死?我以前做法律助理…

作者头像 李华
网站建设 2026/4/16 15:20:12

NotaGen参数调优:平衡创意与音乐性的方法

NotaGen参数调优:平衡创意与音乐性的方法 1. 引言 随着大语言模型(LLM)在序列生成任务中的广泛应用,其在符号化音乐生成领域的潜力逐渐显现。NotaGen正是基于这一范式构建的AI音乐生成系统,专注于高质量古典音乐的自…

作者头像 李华