Three.js场景中ECharts图表动态渲染方案

2025-04-30 0 387

使用 Three.js 的 WebGL 小实验。实现了一个互动性强的 3D 数据可视化效果,展示了郑州各区的常住人口数据,同时提供了视觉上很有表现力的落日背景和交互式视角控制。

Three.js场景中ECharts图表动态渲染方案
实现代码
<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Three.js 场景中的 ECharts 图表 - 郑州人口画像</title>    <style>        body { margin0overflow: hidden; }        canvas { display: block; }    </style></head><body>    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>    <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>    <script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/controls/OrbitControls.js"></script>    <script>        // 创建 ECharts 的画布        const echartsCanvas = document.createElement('canvas');        echartsCanvas.width = 512;        echartsCanvas.height = 512;        const chart = echarts.init(echartsCanvas);        // 配置 ECharts 柱状图(郑州各区人口数据,包含男性和女性)        const option = {            title: {                text'郑州各区常住人口 (2020)',                left'center',                top'2%',                textStyle: { color'#fff' }            },            legend: {                data: ['男性''女性'],                top'10%',                left'center',                textStyle: { color'#fff' },                selectedModetrue // 允许点击切换显示            },            grid:{                top:'20%'            },            tooltip: {                trigger'axis',                axisPointer: { type'shadow' },                formatterfunction(params) {                    return `${params[0].name}:<br/>男性: ${params[0].value} 万人<br/>女性: ${params[1].value} 万人`;                }            },            xAxis: {                type'category',                data: ['金水''管城''中原''二七''惠济''上街''中牟''荥阳''新郑'],                axisLabel: { color'#fff' }            },            yAxis: {                type'value',                name'人口 (万人)',                axisLabel: { color'#fff' }            },            series: [                {                    name'男性',                    type'bar',                    data: [81.6055.4352.8652.3531.8210.2661.5856.4544.46],                    itemStyle: { color'#5470c6' }                },                {                    name'女性',                    type'bar',                    data: [77.4052.5750.1449.6530.189.7458.4253.5542.17],                    itemStyle: { color'#91cc75' }                }            ],            backgroundColor'rgba(0,0,0,0.1)' // 透明背景        };        chart.setOption(option);        // Three.js 场景设置        const scene = new THREE.Scene();        const camera = new THREE.PerspectiveCamera(75window.innerWidth / window.innerHeight0.11000);        camera.position.set(025);        const renderer = new THREE.WebGLRenderer({ antialiastrue });        renderer.setSize(window.innerWidthwindow.innerHeight);        document.body.appendChild(renderer.domElement);        // 创建落日天空效果(渐变背景)        const gradientTexture = new THREE.CanvasTexture(generateGradientCanvas());        scene.background = gradientTexture;        function generateGradientCanvas() {            const canvas = document.createElement('canvas');            canvas.width = 512;            canvas.height = 512;            const context = canvas.getContext('2d');            const gradient = context.createLinearGradient(000512);            gradient.addColorStop(0'#1e3a8a'); // 深蓝色(天空顶部)            gradient.addColorStop(0.5'#f97316'); // 橙色(落日中部)            gradient.addColorStop(1'#dc2626'); // 红色(地平线)            context.fillStyle = gradient;            context.fillRect(00512512);            return canvas;        }        // 创建土地        const groundGeometry = new THREE.PlaneGeometry(100100);        const groundMaterial = new THREE.MeshLambertMaterial({ color0x228B22 }); // 绿色草地        const ground = new THREE.Mesh(groundGeometry, groundMaterial);        ground.rotation.x = -Math.PI / 2// 旋转使其水平        ground.position.y = -1// 放置在场景下方        scene.add(ground);        // 创建显示 ECharts 纹理的平面        const texture = new THREE.CanvasTexture(echartsCanvas);        const material = new THREE.MeshBasicMaterial({ map: texture, sideTHREE.DoubleSide });        const geometry = new THREE.PlaneGeometry(44);        const plane = new THREE.Mesh(geometry, material);        plane.position.y = 1// 稍微抬高以避免与地面重叠        scene.add(plane);        // 添加环境光        const ambientLight = new THREE.AmbientLight(0xffa07a0.6); // 偏暖的环境光以匹配落日        scene.add(ambientLight);        // 添加方向光,模拟落日光线        const directionalLight = new THREE.DirectionalLight(0xff45000.7); // 橙红色光线        directionalLight.position.set(-53, -5); // 光从低角度射入        scene.add(directionalLight);        // 添加轨道控制器并限制角度        const controls = new THREE.OrbitControls(camera, renderer.domElement);        controls.minPolarAngle = 0// 限制最小垂直角度(仰角)为水平(0 弧度)        controls.maxPolarAngle = Math.PI / 2// 限制最大垂直角度为水平(90度,π/2 弧度)        controls.update();        // 动画循环        function animate() {            requestAnimationFrame(animate);            texture.needsUpdate = true// 更新纹理以反映图表变化            renderer.render(scene, camera);        }        animate();        // 处理窗口大小调整        window.addEventListener('resize'() => {            camera.aspect = window.innerWidth / window.innerHeight;            camera.updateProjectionMatrix();            renderer.setSize(window.innerWidthwindow.innerHeight);        });    </script></body></html>
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

免责声明 1、百创网作为第三方中介平台,依据交易合同(商品描述、交易前商定的内容)来保障交易的安全及买卖双方的权益; 2、非平台线上交易的项目,出现任何后果均与百创网无关;无论卖家以何理由要求线下交易的,请联系管理举报。 3. 百创网网站的资源均由店家上传出售,本站无法判断和识别资源的版权等合法性属性。如果您对本网站上传的信息资源的版权存有异议,请您及时联系 我们。如果需要删除链接,请下载下面的附件,正确填写信息后并发给我们,本站核实信息真实性后,在24小时内对商品进行删除处理。 联系邮箱:baicxx@baicxx.com (相关事务请发函至该邮箱)

百创网-源码交易平台_网站源码_商城源码_小程序源码 行业资讯 Three.js场景中ECharts图表动态渲染方案 https://www.baicxx.com/30528.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、百创会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、百创无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在百创上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于百创介入快速处理。
查看详情
  • 1、百创作为第三方中介平台,依据交易合同(商品描述、交易前商定的内容)来保障交易的安全及买卖双方的权益; 2、非平台线上交易的项目,出现任何后果均与百创无关;无论卖家以何理由要求线下交易的,请联系管理举报。
查看详情
  • 免责声明 1、百创网作为第三方中介平台,依据交易合同(商品描述、交易前商定的内容)来保障交易的安全及买卖双方的权益; 2、非平台线上交易的项目,出现任何后果均与百创网无关;无论卖家以何理由要求线下交易的,请联系管理举报。 3. 百创网网站的资源均由店家上传出售,本站无法判断和识别资源的版权等合法性属性。如果您对本网站上传的信息资源的版权存有异议,请您及时联系 我们。如果需要删除链接,请下载下面的附件,正确填写信息后并发给我们,本站核实信息真实性后,在24小时内对商品进行删除处理。 联系邮箱:baicxx@baicxx.com (相关事务请发函至该邮箱)
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

  • 0 +

    访问总数

  • 0 +

    会员总数

  • 0 +

    文章总数

  • 0 +

    今日发布

  • 0 +

    本周发布

  • 0 +

    运行天数

你的前景,远超我们想象