DataGear 製作基於 three.js 的 3D 資料視覺化看板

DataGear發表於2024-02-29

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效果,如下所示:

image

下面,我們將上述3D元件製作為DataGear自定義圖表,可以根據資料集返回的數值,更新其顏色。

首先,新建SQL資料集:

名稱:最新指標值

SQL:

SELECT
	D_VALUE AS VALUE
FROM
	t_date_value
ORDER BY
	d_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圖表效果,如下圖所示:

image

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

原始碼地址:

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

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

相關文章