溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何把echarts的圖表貼在three.js模型

發(fā)布時間:2020-06-21 20:06:10 來源:億速云 閱讀:815 作者:鴿子 欄目:web開發(fā)

因為二者都是渲染成canvas的,直接用echarts生成的canvas當作貼圖就可以了。

方法確定可行,那么我們就直接開始擼代碼。

先搭建一個three的基本場景起來,這里不在復述。

然后新建一個平面,我們把圖片貼在這個平面上即可。

addPlane() {
    var geometry = new THREE.PlaneGeometry(10,10);
    var material = new THREE.MeshBasicMaterial({ 
        side: THREE.DoubleSide,
        // transparent:true
    });
    this.plane = new THREE.Mesh(geometry, material);
    this.scene.add(this.plane);
}

擺好相機的角度,此時場景中是一個白板。

如何把echarts的圖表貼在three.js模型

然后打開echarts的官網(wǎng),找到案例,來個儀表盤吧。代碼拷貝下來。跑起來。

為了方便演示,我在body中創(chuàng)建了2個div,分別作為three和圖表的容器。實際開發(fā)中圖表的容器不需要顯示出來的,也不需要添加到body中的。

<div id="webgl" style="width:512px;height: 512px;float: left;"></div>
<div id="echart" style="width:512px;height: 512px;margin-left: 620px;"></div>
var myChart = echarts.init(document.getElementById('echart'));
option = {
    tooltip: {
        formatter: "{a} <br/> : {c}%"
    },
    //toolbox會在右上角生成兩個功能按鈕,咱們不需要,直接干掉。
    // toolbox: { 
    //     feature: {
    //         restore: {},
    //         saveAsImage: {}
    //     }
    // },
    series: [
        {
            name: '業(yè)務指標',
            type: 'gauge',
            detail: { formatter: '{value}%' },
            data: [{ value: 50, name: '完成率' }]
        }
    ]
};
option.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;
myChart.setOption(option, true);
const dom = document.getElementById("webgl");
const scene = new Basescene(dom);
scene.addPlane();

此時看到下面頁面:

如何把echarts的圖表貼在three.js模型

方法一:CanvasTexture

three.js有一個api:CanvasTexture??梢詡魅胍粋€canvas對象,用這個方法可以完成上面的任務。

CanvasTexture( canvas : HTMLElement, mapping : Constant, wrapS : Constant, wrapT : Constant, magFilter : Constant, minFilter : Constant, format : Constant, type : Constant, anisotropy : Number )

changeTextureT(texture){
    this.plane.material.map = new THREE.CanvasTexture(texture)
    this.plane.material.needsUpdate = true  
    var thiscancas = document.getElementById("echart").getElementsByTagName('canvas')[0]
    scene.changeTextureT(thiscancas)
}

運行結(jié)果如下,確實不清晰,和他們遇到的問題的一樣。嘗試把echarts繪制大點,但是這個是自適應的,導致儀表板很丑,不是想象的樣子,如果是自己繪制的表格,就可以這樣處理了。

如何把echarts的圖表貼在three.js模型

方法二:getDataURL

既然echarts也是渲染canvas,看看api,應該有方法導出圖片。就是下面的api,而且有可選參數(shù),可以設置分辨率。

如何把echarts的圖表貼在three.js模型

changeTextureE(texture){
    this.plane.material.map = new THREE.TextureLoader().load(texture)
    this.plane.material.needsUpdate = true  
}
var texture = myChart.getDataURL({
    pixelRatio: 4,
    backgroundColor: '#fff'
}); 
scene.changeTextureE(texture)

分辨率設置為4確實清晰多了。

如何把echarts的圖表貼在three.js模型

下面三個圖分別是分辨率1,分辨率4以及方法1繪制的效果對比。

如何把echarts的圖表貼在three.js模型如何把echarts的圖表貼在three.js模型

如何把echarts的圖表貼在three.js模型

3個圖區(qū)別很明顯,方法2>方法1。該使用什么方法已經(jīng)很明白了。

下面是動態(tài)圖片,開始沒有貼圖,然后貼上方法1生成的貼圖,接著閃一下,換成方法2分辨率4生成的貼圖。放大還是很清晰的。

如何把echarts的圖表貼在three.js模型

最后問題:echarts的圖表很多都是有緩沖動畫的,如果也想在貼圖上實時刷新,可行嗎。幀率能跟上嗎。

全部代碼:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>three.js使用Echarts貼圖</title>
    <script src="../js/three.js"></script>
    <script src="../js/controls/OrbitControls.js"></script>
    <script src="./echarts.js"></script>
</head>
<body>
    <div id="webgl" style="width:512px;height: 512px;float: left;"></div>
    <div id="echart" style="width:512px;height: 512px;margin-left: 620px;"></div>
    <script>
        var myChart = echarts.init(document.getElementById('echart'));
        option = {
            tooltip: {
                formatter: "{a} <br/> : {c}%"
            },
            // toolbox: {
            //     feature: {
            //         restore: {},
            //         saveAsImage: {}
            //     }
            // },
            series: [
                {
                    name: '業(yè)務指標',
                    type: 'gauge',
                    detail: { formatter: '{value}%' },
                    data: [{ value: 50, name: '完成率' }]
                }
            ]
        };
        option.series[0].data[0].value = (Math.random() * 100).toFixed(2) - 0;
        myChart.setOption(option, true);
        class Basescene {
            constructor(dom) {
                this.id = (new Date()).getTime();
                this.dom = dom;
                this.divWidth = this.dom.offsetWidth;
                this.divHeight = this.dom.offsetHeight;
                this.scene = new THREE.Scene();
                this.camera = new THREE.PerspectiveCamera(45, this.divWidth / this.divHeight, 1, 2000);
                this.renderer = new THREE.WebGLRenderer({
                    alpha: true,
                    antialias: true
                });
                this.controls = new THREE.OrbitControls(this.camera, this.renderer.domElement);
                this.init();
            }
            init() {
                this.camera.position.set(0, 0, 20);
                this.camera.lookAt(this.scene.position);
                this.renderer.setClearColor(0x222222);
                this.renderer.setSize(this.divWidth, this.divHeight);
                this.dom.appendChild(this.renderer.domElement);
                // this.scene.add(new THREE.AxesHelper(10));
                this.animate();
                this.addLight();
                console.log(this.scene);
            }
            addLight() {
                const light = new THREE.AmbientLight(0xffffff);
                this.scene.add(light);
            }
            render() {
                this.renderer.render(this.scene, this.camera);
            }
            animate = () => {
                this.request = requestAnimationFrame(this.animate);
                this.render();
            }
            addPlane() {
                var geometry = new THREE.PlaneGeometry(10, 10);
                var material = new THREE.MeshBasicMaterial({
                    side: THREE.DoubleSide,
                    // transparent:true
                });
                this.plane = new THREE.Mesh(geometry, material);
                this.scene.add(this.plane);
            }
            changeTextureE(texture) {
                this.plane.material.map = new THREE.TextureLoader().load(texture)
                this.plane.material.needsUpdate = true
            }
            changeTextureT(texture) {
                this.plane.material.map = new THREE.CanvasTexture(texture)
                this.plane.material.needsUpdate = true
            }
        }
        const dom = document.getElementById("webgl");
        const scene = new Basescene(dom);
        scene.addPlane();
        setTimeout(() => {
            var thiscancas = document.getElementById("echart").getElementsByTagName('canvas')[0]
            scene.changeTextureT(thiscancas)
        }, 2000);
        setTimeout(() => {
            var texture = myChart.getDataURL({
                pixelRatio: 4,
                backgroundColor: '#fff'
            });
            scene.changeTextureE(texture)
        }, 4000);
    </script>
</body>
</html>

以上就是echarts生成的圖表在three.js中的應用詳解的詳細內(nèi)容,更多請關(guān)注億速云其它相關(guān)文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI