推广赚钱 广告 全新升级

新地球之--前端的3D地球扫描特效

  [复制链接]
查看15853 | 回复1746 | 2022-5-7 21:36 | 显示全部楼层 |阅读模式
新地球上车(图片在压缩包里面,或者自己替换下想要的图片 更换1.png和2.jpg,网络图片也是可以的,解压缩点index.html就可以了看效果了)


现在创建地球进行绘制,代码如下全部附上:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>D3地球</title>
  6.     <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
  7.     <script src="https://cdn.jsdelivr.net/npm/echarts-gl/dist/echarts-gl.min.js"></script>
  8.     <script src="http://d3js.org/d3.v5.min.js"></script>
  9.     <style>
  10.         html,
  11.         body {
  12.             width: 100%;
  13.             height: 100%;
  14.             margin: 0px;
  15.             padding: 0px;
  16.             overflow: hidden;
  17.         }
  18.         #showC {
  19.             width: 100%;
  20.             height: 100%;
  21.         }
  22.     </style>
  23. </head>
  24. <body>
  25.     <div id="showC" style="background: black;"></div>
  26. </body>
  27. <script>
  28.     var baseImg = "./img/2.jpg"; // 背景纹理贴图
  29.     var scanImg = "./img/1.png"; // 扫描光影效果
  30.     var myChart = echarts.init(document.getElementById("showC"));
  31.     var config = { // 扫描线条配置
  32.         lineWidth: 0.5, // 扫描线条宽度
  33.         color: '#01CADE', // 线条颜色
  34.         levels: 1,
  35.         intensity: 3, // 强度
  36.         threshold: 0.01
  37.     }
  38.     var canvas = document.createElement('canvas');
  39.     canvas.width = 4096;
  40.     canvas.height = 2048;
  41.     context = canvas.getContext("2d");
  42.     context.lineWidth = config.lineWidth;
  43.     context.strokeStyle = config.color;
  44.     context.fillStyle = config.color;
  45.     context.shadowColor = config.color;
  46.     image(scanImg).then(function (image) {
  47.         var m = image.height,
  48.             n = image.width,
  49.             values = new Array(n * m),
  50.             contours = d3.contours().size([n, m]).smooth(true),
  51.             projection = d3.geoIdentity().scale(canvas.width / n),
  52.             path = d3.geoPath(projection, context);
  53.         //   StackBlur.R(image, 5);
  54.         for (var j = 0, k = 0; j < m; j) {
  55.             for (var i = 0; i < n; i, k) {
  56.                 values[k] = image.data[(k << 2)] / 255;
  57.             }
  58.         }
  59.         var opt = {
  60.             image: canvas
  61.         }
  62.         var results = [];
  63.         function update(threshold, levels) {
  64.             context.clearRect(0, 0, canvas.width, canvas.height);
  65.             var thresholds = [];
  66.             for (var i = 0; i < levels; i ) {
  67.                 thresholds.push((threshold 1 / levels * i) % 1);
  68.             }
  69.             results = contours.thresholds(thresholds)(values);
  70.             redraw();
  71.         }
  72.         function redraw() {
  73.             results.forEach(function (d, idx) {
  74.                 context.beginPath();
  75.                 path(d);
  76.                 context.globalAlpha = 1;
  77.                 context.stroke();
  78.                 if (idx > config.levels / 5 * 3) {
  79.                     context.globalAlpha = 0.01;
  80.                     context.fill();
  81.                 }
  82.             });
  83.             opt.onupdate();
  84.         }
  85.         d3.timer(function (t) {
  86.             var threshold = (t % 10000) / 10000;
  87.             update(threshold, 1);
  88.         });
  89.         initCharts(opt);
  90.         update(config.threshold, config.levels);
  91.     });
  92.     function image(url) {
  93.         return new Promise(function (resolve) {
  94.             var image = new Image();
  95.             image.src = url;
  96.             image.onload = function () {
  97.                 var canvas = document.createElement("canvas");
  98.                 canvas.width = image.width / 8;
  99.                 canvas.height = image.height / 8;
  100.                 var context = canvas.getContext("2d");
  101.                 context.drawImage(image, 0, 0, canvas.width, canvas.height);
  102.                 resolve(context.getImageData(0, 0, canvas.width, canvas.height));
  103.             };
  104.         });
  105.     }
  106.     function initCharts(opt) {
  107.         var contourChart = echarts.init(document.createElement('canvas'), null, {
  108.             width: 4096,
  109.             height: 2048
  110.         });
  111.         var img = new echarts.graphic.Image({
  112.             style: {
  113.                 image: opt.image,
  114.                 x: -1,
  115.                 y: -1,
  116.                 width: opt.image.width 2,
  117.                 height: opt.image.height 2
  118.             }
  119.         });
  120.         contourChart.getZr().add(img);
  121.         opt.onupdate = function () {
  122.             img.dirty();
  123.         };
  124.         myChart.setOption({
  125.             globe: {
  126.                 top: '5%',
  127.                 globeRadius: 130,
  128.                 baseTexture: baseImg,
  129.                 displacementScale: 0.05,
  130.                 displacementQuality: 'high',
  131.                 shading: 'realistic',
  132.                 realisticMaterial: {
  133.                     roughness: 0.2,
  134.                     metalness: 0
  135.                 },

  136.                 postEffect: {
  137.                     enable: true,
  138.                     depthOfField: {
  139.                         // enable: true
  140.                     }
  141.                 },
  142.                 light: {
  143.                     ambient: {
  144.                         intensity: 1
  145.                     },
  146.                     main: { // 主光源
  147.                         intensity: 0,
  148.                         shadow: false
  149.                     },
  150.                     /*ambientCubemap: {
  151.                         texture: ROOT_PATH 'data-gl/asset/lake.hdr',
  152.                         exposure: 1,
  153.                         diffuseIntensity: 0.5,
  154.                         specularIntensity: 2
  155.                     }*/
  156.                 },
  157.                 viewControl: {
  158.                     center: [0, 0, 0],
  159.                     alpha: 30,
  160.                     beta: 160,
  161.                     autoRotate: true,
  162.                     autoRotateAfterStill: 10,
  163.                     distance: 240,
  164.                     autoRotateSpeed: 4,
  165.                     targetCoord: [100.405051, 30.912916]
  166.                 },
  167.                 layers: [{
  168.                     type: 'blend',
  169.                     blendTo: 'emission',
  170.                     texture: contourChart,
  171.                     intensity: config.intensity,
  172.                 }],
  173.             },
  174.             series: [{ // 点
  175.                 type: 'scatter3D',
  176.                 // type: 'scatter',
  177.                 coordinateSystem: 'globe',
  178.                 blendMode: 'source-over',
  179.                 showEffectOn: 'render',
  180.                 zlevel: 10,
  181.                 effectType: 'ripple',
  182.                 // 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==",
  183.                 symbolSize: 15,
  184.                 rippleEffect: {
  185.                     period: 4,
  186.                     scale: 4,
  187.                     brushType: 'fill'
  188.                 },
  189.                 hoverAnimation: true,
  190.                 itemStyle: {
  191.                     normal: {
  192.                         label: {
  193.                             show: true,
  194.                             formatter: function (params) {
  195.                                 return params.data[3] '\n' params.data[4] '\n' params.data[5];
  196.                             },
  197.                             distance: 10
  198.                         },
  199.                     },
  200.                     emphasis: {
  201.                         label: {
  202.                             show: true,
  203.                             formatter: function (params) {
  204.                                 return params.data[3] '\n' params.data[4] '\n' params.data[5];
  205.                             },
  206.                             distance: 10
  207.                         },
  208.                     }
  209.                 },
  210.                                 // 设置位置
  211.                 data: [
  212.                     [116.405051, 39.912916,1,"1","暴富","发财"],
  213.                     [104.071388, 30.639088,2,"2","发财","发财"],
  214.                     [121.493628, 31.241707,3,"3","长沙市","发财"],
  215.                 ]
  216.                 // data:data,
  217.             }]
  218.         });
  219.         myChart.dispatchAction({
  220.             type: 'showTip', // 根据 tooltip 的配置项显示提示框。
  221.             seriesIndex: 0,
  222.             // dataIndex: 0
  223.         });
  224.     }
  225. </script>
  226. </html>
复制代码
image.png

下载:
游客,如果您要查看本帖隐藏内容请回复

蓝奏链接如访问不了把lanzous换成lanzoux或lanozui
;主题回复不显示隐藏内容就刷新页面;
dkveevdfoe | 2022-5-8 07:08 | 显示全部楼层
楼主我爱你!
回复

使用道具 举报

子蕙1575 | 2022-5-8 08:04 | 显示全部楼层
太生气了,无法HOLD啦 >_<......
回复

使用道具 举报

c67263hx16 | 2022-5-12 08:07 | 显示全部楼层
激动人心,无法言表!
回复

使用道具 举报

vbfnpvfvat | 2022-5-13 02:30 | 显示全部楼层
爱了爱了
回复

使用道具 举报

笪6761 | 2022-5-16 04:22 | 显示全部楼层
强烈支持楼主ing……
回复

使用道具 举报

酆丝柳 | 2022-5-17 13:49 | 显示全部楼层
ksdmiwda
回复

使用道具 举报

巫4931 | 2022-5-20 23:56 | 显示全部楼层
我只是路过打酱油的。
回复

使用道具 举报

ygxkpepgmk | 2022-5-22 00:09 | 显示全部楼层
淡定,淡定,淡定……
回复

使用道具 举报

adkdntmvxe | 2022-5-22 08:16 | 显示全部楼层
真是难得给力的帖子啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则