当前位置: 首页 > news >正文

DataGear制作基于three.js的3D数据可视化看板

DataGear专业版 1.0.0 已发布,欢迎试用! http://datagear.tech/pro/

DataGear 支持采用原生的HTML、JavaScript、CSS制作数据可视化看板,也支持导入由npmvite等前端工具构建的前端程序包。得益于这一特性,可以很容易制作基于three.js的3D数据可视化看板。

首先,参考three.js的官方教程 https://threejs.org/docs/index.html#manual/en/introduction/Installation 编写3D前端源码包。

源码包中包含两个文件:index.htmlmain.js,如下所示:

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script type="module" src="/main.js"></script>
<script type="module">
import { ThreeRenderer } from "/main.js";
window.ThreeRenderer = ThreeRenderer;
</script>
<div style="padding:1rem;"><button onclick="threeRender()">渲染</button><button onclick="threeUpdate()">更新</button><p></p><div id="threeChart" style="width:300px;height:300px;"></div>
</div>
<script>
var renderer;
function threeRender(){renderer = new ThreeRenderer(document.getElementById("threeChart"));renderer.render();
}
function threeUpdate(){renderer.update(0xff0000);
}
</script>
</body>
</html>

index.html是下述main.js中定义3D组件的调试页面,点击【渲染】、【更新】按钮可调试3D组件效果。

main.js

import * as THREE from 'three';export function ThreeRenderer(dom)
{this.dom = dom;this.render = function(){const scene = new THREE.Scene();const camera = new THREE.PerspectiveCamera( 75, this.dom.clientWidth / this.dom.clientHeight, 0.1, 1000 );const renderer = new THREE.WebGLRenderer();renderer.setSize( this.dom.clientWidth, this.dom.clientHeight );this.dom.appendChild( renderer.domElement );const geometry = new THREE.BoxGeometry( 1, 1, 1 );const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );const cube = new THREE.Mesh( geometry, material );scene.add( cube );camera.position.z = 5;function animate() {requestAnimationFrame( animate );cube.rotation.x += 0.01;cube.rotation.y += 0.01;renderer.render( scene, camera );}animate();this.cube = cube;};this.update = function(hexColor){const cube = this.cube;const material = cube.material;const color = material.color;color.setHex(hexColor);};
}

main.js定义了一个ThreeRenderer3D组件类,大部分代码由three.js官方教程拷贝,它的render函数绘制一个简单的3D立方体, update函数可以更新这个3D立方体的颜色。

调试:

npm install --save three
npm install --save-dev vite
npx vite

执行npx vite build将它们构建为前端程序包:

index.html
assets/index-*.js

先将上述前端程序包压缩为ZIP包后导入为DataGear看板,然后将index.html中的

<script type="module" crossorigin src="/assets/index-*.js"></script>

修改为采用相对路径引入方式:

<script type="module" crossorigin src="assets/index-*.js"></script>

此时,点击【保存并展示】看板后,打开展示页面,点击【渲染】、【更新】按钮,将可以看到3D效果,如下所示:

下面,我们将上述3D组件制作为DataGear自定义图表,可以根据数据集返回的数值,更新其颜色。

首先,新建SQL数据集:

名称:最新指标值

SQL:

SELECTD_VALUE AS VALUE
FROMt_date_value
ORDER BYd_date DESC
LIMIT 0, 1

上述SQL从t_date_value表中查询最新日期的指标值

然后,新建一个关联上述数据集的自定义类型的图表;

名称:最新指标值

图表类型:自定义

数据集:最新指标值

更新间隔:2000毫秒

上述图表每隔2秒更新一次数据

最后,修改刚才导入看板的index.html,添加自定义图表渲染器,当t_date_value表中最新指标值大于等于80时,将3D模型渲染为红色,否则,渲染为绿色。

修改后的index.html如下所示:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="assets/index-*.js"></script>
<script>
//自定义图表渲染器
var chartRenderer =
{render: function(chart){var internal = new ThreeRenderer(chart.element());internal.render();chart.internal(internal);},update: function(chart, results){var chartDataSet = chart.chartDataSetMain();var result = chart.resultOf(results, chartDataSet);var value = chart.resultCell(result, "VALUE", 0);var color = (value >= 80 ? 0xff0000 : 0x00ff00);var internal = chart.internal();internal.update(color);}
};
</script>
</head>
<body>
<div style="padding:1rem;text-align:center;"><h1>DataGear制作3D图表</h1><h5>http://www.datagear.tech</h5><div style="display:inline-block;width:300px;height:300px;margin:1rem;"dg-chart-renderer="chartRenderer" dg-chart-widget="【图表ID】"></div><div style="display:inline-block;width:300px;height:300px;margin:1rem;"dg-chart-renderer="chartRenderer" dg-chart-widget="【图表ID】"></div>
</div>
</body>
</html>

上述assets/index-*.js应替换为实际的JS文件名,【图表ID】应替换为实际的最新指标值图表的ID

点击【保存并展示】,即可看到3D图表效果,如下图所示:

官网地址:http://www.datagear.tech

源码地址:

Gitee:https://gitee.com/datagear/datagear

Github:https://github.com/datageartech/datagear

相关文章:

  • 提升Vue3应用效率的秘诀:深入比较ref与reactive!
  • ubuntu 安装jdk8
  • C语言中的套娃——函数递归
  • 【力扣白嫖日记】178.分数排名
  • 基于JavaWeb实现的校园新闻发布系统
  • 国产替代MATLAB的征途
  • 推荐收藏!科大讯飞算法岗(NLP 方向)面试题7道(含答案)
  • pytest基本应用
  • 网络安全与信创产业发展:构建数字时代的护城河
  • BFS中的多源BFS-双端队列BFS
  • 掌握 Android 中的 RecyclerView 优化
  • 中级.NET开发工程师面试经历
  • petalinux_zynq7 驱动DAC以及ADC模块之一:建立IP
  • 【论文精读】OS-Copilot: Towards Generalist Computer Agents with Self-Improvement
  • 考研408深度分析+全年规划
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Apache Spark Streaming 使用实例
  • Bytom交易说明(账户管理模式)
  • flutter的key在widget list的作用以及必要性
  • Java 内存分配及垃圾回收机制初探
  • Javascript基础之Array数组API
  • Java程序员幽默爆笑锦集
  • java概述
  • java取消线程实例
  • java正则表式的使用
  • MySQL用户中的%到底包不包括localhost?
  • Next.js之基础概念(二)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • ReactNativeweexDeviceOne对比
  • Ruby 2.x 源代码分析:扩展 概述
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • vue-router的history模式发布配置
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端相关框架总和
  • 前嗅ForeSpider中数据浏览界面介绍
  • 区块链分支循环
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 我的面试准备过程--容器(更新中)
  • 智能合约开发环境搭建及Hello World合约
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #每日一题合集#牛客JZ23-JZ33
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (三)elasticsearch 源码之启动流程分析
  • ./configure、make、make install 命令
  • .Net各种迷惑命名解释
  • .NET开发人员必知的八个网站
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .sys文件乱码_python vscode输出乱码
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思