吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2787|回复: 8
收起左侧

[学习记录] 新地球之--前端的3D地球扫描特效

[复制链接]
jiami 发表于 2022-5-7 11:42
本帖最后由 jiami 于 2022-5-7 13:06 编辑


Access to Image at 'file:///Users canvas本地图片跨域报错解决方案
1、设置跨域
     添加跨域条件   crossorigin="anonymous"
    前提是后端支持这个图片跨域

2、上面加了之后还是报错
  如标题所示
  你需要把你的项目放到服务器上面跑
  或者自己搭建一个本地服务器
  然后在访问你的html
新地球上车(图片在压缩包里面,或者自己替换下想要的图片 更换1.png和2.jpg,网络图片也是可以的,解压缩点index.html就可以了看效果了)
链接: https://pan.baidu.com/s/1GbjYUUoRe8eFTn_2lL9dzg?pwd=hq12  
提取码: hq12

现在创建地球进行绘制,代码如下全部附上:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>D3地球</title>
    <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/echarts-gl/dist/echarts-gl.min.js"></script>
    <script src="http://d3js.org/d3.v5.min.js"></script>
    <style>
        html,
        body {
            width: 100%;
            height: 100%;
            margin: 0px;
            padding: 0px;
            overflow: hidden;
        }
        #showC {
            width: 100%;
            height: 100%;
        }
    </style>
</head>
<body>
    <div id="showC" style="background: black;"></div>
</body>
<script>
    var baseImg = "./img/2.jpg"; // 背景纹理贴图
    var scanImg = "./img/1.png"; // 扫描光影效果
    var myChart = echarts.init(document.getElementById("showC"));
    var config = { // 扫描线条配置
        lineWidth: 0.5, // 扫描线条宽度
        color: '#01CADE', // 线条颜色
        levels: 1,
        intensity: 3, // 强度
        threshold: 0.01
    }
    var canvas = document.createElement('canvas');
    canvas.width = 4096;
    canvas.height = 2048;
    context = canvas.getContext("2d");
    context.lineWidth = config.lineWidth;
    context.strokeStyle = config.color;
    context.fillStyle = config.color;
    context.shadowColor = config.color;
    image(scanImg).then(function (image) {
        var m = image.height,
            n = image.width,
            values = new Array(n * m),
            contours = d3.contours().size([n, m]).smooth(true),
            projection = d3.geoIdentity().scale(canvas.width / n),
            path = d3.geoPath(projection, context);
        //   StackBlur.R(image, 5);
        for (var j = 0, k = 0; j < m; ++j) {
            for (var i = 0; i < n; ++i, ++k) {
                values[k] = image.data[(k << 2)] / 255;
            }
        }
        var opt = {
            image: canvas
        }
        var results = [];
        function update(threshold, levels) {
            context.clearRect(0, 0, canvas.width, canvas.height);
            var thresholds = [];
            for (var i = 0; i < levels; i++) {
                thresholds.push((threshold + 1 / levels * i) % 1);
            }
            results = contours.thresholds(thresholds)(values);
            redraw();
        }
        function redraw() {
            results.forEach(function (d, idx) {
                context.beginPath();
                path(d);
                context.globalAlpha = 1;
                context.stroke();
                if (idx > config.levels / 5 * 3) {
                    context.globalAlpha = 0.01;
                    context.fill();
                }
            });
            opt.onupdate();
        }
        d3.timer(function (t) {
            var threshold = (t % 10000) / 10000;
            update(threshold, 1);
        });
        initCharts(opt);
        update(config.threshold, config.levels);
    });
    function image(url) {
        return new Promise(function (resolve) {
            var image = new Image();
            image.src = url;
            image.onload = function () {
                var canvas = document.createElement("canvas");
                canvas.width = image.width / 8;
                canvas.height = image.height / 8;
                var context = canvas.getContext("2d");
                context.drawImage(image, 0, 0, canvas.width, canvas.height);
                resolve(context.getImageData(0, 0, canvas.width, canvas.height));
            };
        });
    }
    function initCharts(opt) {
        var contourChart = echarts.init(document.createElement('canvas'), null, {
            width: 4096,
            height: 2048
        });
        var img = new echarts.graphic.Image({
            style: {
                image: opt.image,
                x: -1,
                y: -1,
                width: opt.image.width + 2,
                height: opt.image.height + 2
            }
        });
        contourChart.getZr().add(img);
        opt.onupdate = function () {
            img.dirty();
        };
        myChart.setOption({
            globe: {
                top: '5%',
                globeRadius: 130,
                baseTexture: baseImg,
                displacementScale: 0.05,
                displacementQuality: 'high',
                shading: 'realistic',
                realisticMaterial: {
                    roughness: 0.2,
                    metalness: 0
                },

                postEffect: {
                    enable: true,
                    depthOfField: {
                        // enable: true
                    }
                },
                light: {
                    ambient: {
                        intensity: 1
                    },
                    main: { // 主光源
                        intensity: 0,
                        shadow: false
                    },
                    /*ambientCubemap: {
                        texture: ROOT_PATH + 'data-gl/asset/lake.hdr',
                        exposure: 1,
                        diffuseIntensity: 0.5,
                        specularIntensity: 2
                    }*/
                },
                viewControl: {
                    center: [0, 0, 0],
                    alpha: 30,
                    beta: 160,
                    autoRotate: true,
                    autoRotateAfterStill: 10,
                    distance: 240,
                    autoRotateSpeed: 4,
                    targetCoord: [100.405051, 30.912916]
                },
                layers: [{
                    type: 'blend',
                    blendTo: 'emission',
                    texture: contourChart,
                    intensity: config.intensity,
                }],
            },
            series: [{ // 点
                type: 'scatter3D',
                // type: 'scatter',
                coordinateSystem: 'globe',
                blendMode: 'source-over',
                showEffectOn: 'render',
                zlevel: 10,
                effectType: 'ripple',
                // symbol:"path://data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAllBMVEX8xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38xV38v0v7sSX7rx/7sSYAAACsGEOsAAAALHRSTlMAAiJCWWRhViBYZiEBN22Wsr+xlYS8wr1bwSRuy+v8JUT7RVpjvlfMA8CwO6U37FgAAAABYktHRDHZ2x1yAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH5QUYCTchBK9bdAAAAMxJREFUGNNtkdsSgjAMREMFLyuKoAZFQQXvVvT/v84UOoCO+9Se6c4mWyIjR/Vcrz/oKYcaDUewGo0t8ifoaOJX0LBpMAvDaD411DAlh8WSK8ULuSjJWAlbs9Va6MqhBNjEzNs0y9KtvN0AO9oDc2EHLToIDYCcCiBiTvWzLJ86ZZ4BBR2BkDnT5etV6ow5BDzq/8CTgefG/q7skbHXQZc66GKD/o70Z/irXTP+XrMp5Ha6t4WQ/+hW9/Bto+O2ZNVW7yS563luntTf8QEebBqPN9S75gAAAABJRU5ErkJggg==",
                symbolSize: 15,
                rippleEffect: {
                    period: 4,
                    scale: 4,
                    brushType: 'fill'
                },
                hoverAnimation: true,
                itemStyle: {
                    normal: {
                        label: {
                            show: true,
                            formatter: function (params) {
                                return params.data[3] + '\n' + params.data[4] + '\n' + params.data[5];
                            },
                            distance: 10
                        },
                    },
                    emphasis: {
                        label: {
                            show: true,
                            formatter: function (params) {
                                return params.data[3] + '\n' + params.data[4] + '\n' + params.data[5];
                            },
                            distance: 10
                        },
                    }
                },
                                // 设置位置
                data: [
                    [116.405051, 39.912916,1,"1","暴富","发财"],
                    [104.071388, 30.639088,2,"2","发财","发财"],
                    [121.493628, 31.241707,3,"3","长沙市","发财"],
                ]
                // data:data,
            }]
        });
        myChart.dispatchAction({
            type: 'showTip', // 根据 tooltip 的配置项显示提示框。
            seriesIndex: 0,
            // dataIndex: 0
        });
    }
</script>
</html>

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
shuaier + 1 + 1 可以用,上传到自己的网站上即可浏览

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cccuuuiii 发表于 2022-5-7 12:02
不懂,下载了,几个浏览器也打不开。
gallon 发表于 2022-5-7 12:23
城已空人未散 发表于 2022-5-7 13:39
IT_K 发表于 2022-5-7 15:42
echarts的特效
wangyouyou 发表于 2022-5-7 16:13
这里跳下去只需2.7秒,摔死的概率是92.4%
greatfisher 发表于 2022-5-7 16:21
楼主真正有才,学习了。
HKDXQ 发表于 2022-5-7 17:02
三楼 数学学得好! 刚才那巴掌对脸的作用力是32.2牛
枝展梨花开 发表于 2022-5-7 17:25
不知道好不好用,先下载看看
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表