3D引擎three.js/Babylon.js/physijs.js/clipper.js绘制地球飞机,three.js是JS的WebGL第三方库。

3D引擎”Babylon.JS”入门教程翻译总结

使用三个月的业余时间把官方教程的入门部分译为中文并上传到github,在下一步编程前做一个总结。

首先我们来看下要实现的效果

这个缩小后的图片,下面我们来看下近距离的动态效果。。

效果比较简陋,需要后期再处理。。。

下面进入主题,代码篇。。

HTML部分:

JS部分(globe.js)

1、实现地球
地球贴图(可以在网上下载)

2、添加球面光源(这里使用的是半球光)

3、添加星点

4、添加飞机

这里需要我们把 经纬度坐标 转成 xyz 坐标

画飞机

<span class="hljs-string">// <span class="hljs-string">&#x98DE;&#x673A;&#x5F62;&#x72B6;(&#x4E0D;&#x60F3;&#x753B;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x4E0B;&#x8F7D;&#x4E2A; <span class="hljs-string">&#x98DE;&#x673A;&#x6A21;&#x578B; <span class="hljs-string">&#x4F7F;&#x7528;&#x52A0;&#x8F7D;&#x5668;&#x52A0;&#x8F7D;&#x8FDB;&#x6765;)
<span class="hljs-string">var <span class="hljs-string">planeShape <span class="hljs-string">= <span class="hljs-string">new <span class="hljs-string">THREE.Shape();
<span class="hljs-string">planeShape.moveTo( <span class="hljs-number">0<span class="hljs-string">, <span class="hljs-number">0<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(0.2, <span class="hljs-number">-0.2<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(0.2, <span class="hljs-number">-1.3<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(1.6,-2.7);
<span class="hljs-string">planeShape.lineTo(1.6,-3);
<span class="hljs-string">planeShape.lineTo(0.2, <span class="hljs-number">-2.1<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(0.2, <span class="hljs-number">-3<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(0.5, <span class="hljs-number">-3.4<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(0.5, <span class="hljs-number">-3.7<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(0, <span class="hljs-number">-3.3<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(-0.5, <span class="hljs-number">-3.7<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(-0.5, <span class="hljs-number">-3.4<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(-0.2, <span class="hljs-number">-3<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(-0.2, <span class="hljs-number">-2.1<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(-1.6,-3);
<span class="hljs-string">planeShape.lineTo(-1.6,-2.7);
<span class="hljs-string">planeShape.lineTo(-0.2, <span class="hljs-number">-1.3<span class="hljs-string">);
<span class="hljs-string">planeShape.lineTo(-0.2, <span class="hljs-number">-0.2<span class="hljs-string">);
<span class="hljs-string">var <span class="hljs-string">planeGeometry <span class="hljs-string">= <span class="hljs-string">new <span class="hljs-string">THREE.ShapeGeometry(planeShape);
<span class="hljs-string">// <span class="hljs-string">&#x98DE;&#x673A;&#x6750;&#x8D28;
<span class="hljs-string">var <span class="hljs-string">planeMaterial <span class="hljs-string">= <span class="hljs-string">new <span class="hljs-string">THREE.MeshPhongMaterial({color: <span class="hljs-number">0x0FB4DD<span class="hljs-string">, <span class="hljs-attr">side: <span class="hljs-string">THREE.DoubleSide, <span class="hljs-attr">depthTest: <span class="hljs-literal">true<span class="hljs-string">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

depthTest作用是能否透过球体看到飞机,如果是false则旋转到球体另一面也能看到飞机

添加飞机

绘制轨迹(使用socket来获取的飞行轨迹经纬度坐标点)

如果要绘制所有点,且头尾是在球面上的曲线,则需要两次循环

<span class="hljs-keyword">var tcaRemainLength = tcaLength-<span class="hljs-function">tcaHalfLength
<span class="hljs-title">for<span class="hljs-params">(<span class="hljs-keyword">var j=<span class="hljs-number">0; j<tcahalflength; j++) { < span></tcahalflength;></span></span></span></span></span></span>

这个部分看看就行了。。

光点动画

这个点使用的是sphere,,当然也可以用顶点来实现,如下

<span class="hljs-keyword">var geometry = <span class="hljs-keyword">new THREE.Geometry();
geometry.vertices.push(<span class="hljs-keyword">new THREE.Vector3(<span class="hljs-number">0, <span class="hljs-number">0, <span class="hljs-number">0))
geometry.colors.push(<span class="hljs-keyword">new THREE.Color(<span class="hljs-number">0xffffff));

<span class="hljs-keyword">var material = <span class="hljs-keyword">new THREE.PointsMaterial({size: <span class="hljs-number">1, vertexColors: THREE.VertexColors, opacity: <span class="hljs-number">0.75, sizeAttenuation: <span class="hljs-literal">true, transparent: <span class="hljs-literal">true});
<span class="hljs-keyword">var point = <span class="hljs-keyword">new THREE.Points(geometry, material);
point.position.<span class="hljs-keyword">set(x, y, z);
<span class="hljs-keyword">group.<span class="hljs-keyword">add(point);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

另外不想用光点动画的话,也可以用线动画,实现原理是不断更新顶点坐标,如下

<span class="hljs-keyword">var curveGeometry = <span class="hljs-keyword">new THREE.Geometry();
<span class="hljs-keyword">var curveData = <span class="hljs-keyword">new THREE.CatmullRomCurve3(verArr.slice(<span class="hljs-number">0, <span class="hljs-number">10));
curveGeometry.vertices = curveData.getPoints(<span class="hljs-number">10);

<span class="hljs-keyword">var curveMaterial = <span class="hljs-keyword">new THREE.LineBasicMaterial({color: <span class="hljs-number">0x40E0D0});
<span class="hljs-keyword">var curveLine = <span class="hljs-keyword">new THREE.Line(curveGeometry, curveMaterial);
group.add(curveLine);

<span class="hljs-keyword">var index = <span class="hljs-number">0;
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">lineAnimate<span class="hljs-params">() {
    index++;
    <span class="hljs-keyword">if(index>coordsNum<span class="hljs-number">-10) {
        index = <span class="hljs-number">0;
    }
    <span class="hljs-keyword">var offsetData = verArr.slice(index, <span class="hljs-number">10+index);
    <span class="hljs-keyword">if(offsetData.length > <span class="hljs-number">0) {
        curveData = <span class="hljs-keyword">new THREE.CatmullRomCurve3(offsetData);
           curveLine.geometry.vertices = curveData.getPoints(<span class="hljs-number">10);
        curveLine.geometry.verticesNeedUpdate = <span class="hljs-literal">true;
    }
    requestAnimationFrame(lineAnimate);
}
lineAnimate();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

最后就是布置场景和事件了

完整代码:

var log = console.log.bind(console);

var globeObj = (function() {
    'use strict';

    // &#x5224;&#x65AD;&#x6D4F;&#x89C8;&#x5668;&#x662F;&#x5426;&#x652F;&#x6301;webgl
    if(!Detector.webgl) Detector.addGetWebGLMessage();

    var container, stats;
    var camera, scene, renderer;
    var group;
    var mouseX = 0, mouseY = 0;
    var winWth = window.innerWidth, winHgt = window.innerHeight;

    // &#x83B7;&#x53D6;position
    function getPosition(lng, lat, alt) {
        var phi = (90-lat)*(Math.PI/180),
            theta = (lng+180)*(Math.PI/180),
            radius = alt+200,
            x = -(radius * Math.sin(phi) * Math.cos(theta)),
            z = (radius * Math.sin(phi) * Math.sin(theta)),
            y = (radius * Math.cos(phi));
        return {x: x, y: y, z: z};
    }

    // &#x98DE;&#x673A;
    function plane() {
        var socket = io('https://loc.variflight.com/*****&#x6B64;&#x5904;&#x63A5;&#x53E3;&#x5730;&#x5740;&#x4E0D;&#x80FD;&#x7ED9;&#x4E86;', {transports: ['websocket']});

        var clientBounds = [52.793056,72.427908,2.970897,135.181814];

        // &#x8FDE;&#x63A5;
        socket.on('connect', function() {
            socket.emit("sub", clientBounds, -1, '', function(){});
        });

        // &#x98DE;&#x673A;&#x6807;&#x8BB0;
        var planeMarkers = {};

        // &#x98DE;&#x673A;&#x5F62;&#x72B6;
        var planeShape = new THREE.Shape();
        planeShape.moveTo( 0, 0);
        planeShape.lineTo(0.2, -0.2);
        planeShape.lineTo(0.2, -1.3);
        planeShape.lineTo(1.6,-2.7);
        planeShape.lineTo(1.6,-3);
        planeShape.lineTo(0.2, -2.1);
        planeShape.lineTo(0.2, -3);
        planeShape.lineTo(0.5, -3.4);
        planeShape.lineTo(0.5, -3.7);
        planeShape.lineTo(0, -3.3);
        planeShape.lineTo(-0.5, -3.7);
        planeShape.lineTo(-0.5, -3.4);
        planeShape.lineTo(-0.2, -3);
        planeShape.lineTo(-0.2, -2.1);
        planeShape.lineTo(-1.6,-3);
        planeShape.lineTo(-1.6,-2.7);
        planeShape.lineTo(-0.2, -1.3);
        planeShape.lineTo(-0.2, -0.2);
        var planeGeometry = new THREE.ShapeGeometry(planeShape);
        // &#x98DE;&#x673A;&#x6750;&#x8D28;
        var planeMaterial = new THREE.MeshPhongMaterial({color: 0x0FB4DD, side: THREE.DoubleSide, depthTest: true});
        // &#x6DFB;&#x52A0;&#x98DE;&#x673A;
        function addPlane(item) {
            if(item.anum && item.lng && item.lat) {
                var plane = new THREE.Mesh(planeGeometry, planeMaterial);
                // &#x65CB;&#x8F6C;
                plane.rotation.z = THREE.Math.degToRad(item.ang);
                // &#x5B9A;&#x4F4D;
                var position = getPosition(item.lng, item.lat, 5);
                plane.position.set(position.x, position.y, position.z);
                // &#x663E;&#x793A;/&#x9690;&#x85CF;
                // plane.visible = false;
                // &#x4FDD;&#x5B58;
                planeMarkers[item.anum] = plane;
                // &#x6DFB;&#x52A0;&#x5230;&#x573A;&#x666F;
                group.add(plane);
                // &#x7ED8;&#x5236;&#x5386;&#x53F2;&#x8F68;&#x8FF9;
                drawHistoryTrack(item.anum);
            }
        }

        // &#x65F6;&#x95F4;&#x6BB5;
        var curTime = Date.parse(new Date())/1000;
        var depTime = curTime - 30*60;
        // &#x8F68;&#x8FF9;&#x7EBF;&#x8D28;
        var trackMaterial = new THREE.LineBasicMaterial({color : 0x1B94B1});
        // &#x7ED8;&#x5236;&#x5386;&#x53F2;&#x8F68;&#x8FF9;
        function drawHistoryTrack(anum) {
            socket.emit("fullPath", anum, depTime, curTime, function(status, data){
                if(status) {
                    var dLength = data.length;
                    if(dLength>=2) {
                        var trackCoordArr = [];
                        for(var i=0; i<dlength; i++) { if(data[i].lng && data[i].alt) trackcoordarr.push({lng: data[i].lng, lat: data[i].lat}); } var tcalength="trackCoordArr.length;" if(tcalength>=2) {
                            var tcaHalfLength = Math.ceil(tcaLength/2),
                                tcaRemainLength = tcaLength-tcaHalfLength,
                                vertexArr = [];

                            /* &#x6240;&#x6709;&#x70B9;
                            for(var j=0; j<tcahalflength; j++) { var p1="getPosition(trackCoordArr[j].lng," trackcoordarr[j].lat, j*0.05); vertexarr.push(new three.vector3(p1.x, p1.y, p1.z)); } for(var k="tcaRemainLength;">0; k--) {
                                var p2 = getPosition(trackCoordArr[tcaLength-k].lng, trackCoordArr[tcaLength-k].lat, k*0.05);
                                vertexArr.push(new THREE.Vector3(p2.x, p2.y, p2.z));
                            }

                            var trackCurve = new THREE.CatmullRomCurve3(vertexArr);
                            */

                            // &#x4E09;&#x4E2A;&#x70B9;
                            var p1 = getPosition(trackCoordArr[0].lng, trackCoordArr[0].lat, 0),
                                p2 = getPosition(trackCoordArr[tcaHalfLength].lng, trackCoordArr[tcaHalfLength].lat, tcaLength*0.01),
                                p3 = getPosition(trackCoordArr[tcaLength-1].lng, trackCoordArr[tcaLength-1].lat, 0);

                            var trackCurve = new THREE.CatmullRomCurve3([
                                new THREE.Vector3(p1.x, p1.y, p1.z),
                                new THREE.Vector3(p2.x, p2.y, p2.z),
                                new THREE.Vector3(p3.x, p3.y, p3.z)
                            ]);

                            var trackGeometry = new THREE.Geometry(),
                                verticesArr = trackCurve.getPoints(tcaLength);

                            trackGeometry.vertices = verticesArr;

                            var trackLine = new THREE.Line(trackGeometry, trackMaterial);
                            group.add(trackLine);

                            // &#x52A8;&#x753B;&#x70B9;
                            addLightPoint(p1, tcaLength, verticesArr);
                        }
                    }
                }
            });
        }

        // &#x70B9;&#x52A8;&#x753B;
        var pointGeometry = new THREE.SphereGeometry(0.2, 20, 20);
        var pointMaterial = new THREE.MeshBasicMaterial({color: 0x40E0D0});
        function addLightPoint(pos, coordsNum ,verArr) {
            var pointMesh = new THREE.Mesh(pointGeometry, pointMaterial);
            pointMesh.position.set(pos.x, pos.y, pos.z);
            group.add(pointMesh);

            var index = 0;
            function pointAnimate() {
                index++;
                if(index>coordsNum) {
                    index = 0;
                }
                pointMesh.position.set(verArr[index].x, verArr[index].y, verArr[index].z);
                requestAnimationFrame(pointAnimate);
            }
            pointAnimate();

            /*var curveGeometry = new THREE.Geometry();
            var curveData = new THREE.CatmullRomCurve3(verArr.slice(0, 10));
            curveGeometry.vertices = curveData.getPoints(10);

            var curveMaterial = new THREE.LineBasicMaterial({color: 0x40E0D0});
            var curveLine = new THREE.Line(curveGeometry, curveMaterial);
            group.add(curveLine);

            var index = 0;
            function lineAnimate() {
                index++;
                if(index>coordsNum-10) {
                    index = 0;
                }
                var offsetData = verArr.slice(index, 10+index);
                if(offsetData.length > 0) {
                    curveData = new THREE.CatmullRomCurve3(offsetData);
                       curveLine.geometry.vertices = curveData.getPoints(10);
                    curveLine.geometry.verticesNeedUpdate = true;
                }
                requestAnimationFrame(lineAnimate);
            }
            lineAnimate();*/
        }

        // &#x76D1;&#x542C;&#x6570;&#x636E;(&#x6DFB;&#x52A0;&#x5E76;&#x66F4;&#x65B0;)
        socket.on('~', function(res) {
            if($.isEmptyObject(planeMarkers)) {
                $.each(res, function(i, item) {
                    addPlane(item);
                });
            } else {
                $.each(res, function(i, item) {
                    if(planeMarkers[item.anum]) {
                        if(item.lng && item.lat) {
                            var pos = getPosition(item.lng, item.lat, 5);
                            planeMarkers[item.anum].position.set(pos.x, pos.y, pos.z);
                        }
                    } else {
                        addPlane(item);
                    }
                });
            }
        });
    }

    // &#x5730;&#x7403;
    function globe() {
        var globeTextureLoader = new THREE.TextureLoader();
        globeTextureLoader.load('images/textures/earth.jpg', function (texture) {
            var globeGgeometry = new THREE.SphereGeometry(200, 100, 100);
            var globeMaterial = new THREE.MeshStandardMaterial({map: texture});
            var globeMesh = new THREE.Mesh(globeGgeometry, globeMaterial);
            group.add(globeMesh);
            group.rotation.x = THREE.Math.degToRad(35);
            group.rotation.y = THREE.Math.degToRad(170);
        });
    }

    // &#x661F;&#x70B9;
    function stars() {
        var starsGeometry = new THREE.Geometry();
        for (var i = 0; i < 2000; i ++) {
            var starVector = new THREE.Vector3(
                THREE.Math.randFloatSpread(2000),
                THREE.Math.randFloatSpread(2000),
                THREE.Math.randFloatSpread(2000)
            );
            starsGeometry.vertices.push(starVector);
        }
        var starsMaterial = new THREE.PointsMaterial({color: 0x888888})
        var starsPoint = new THREE.Points(starsGeometry, starsMaterial);
        group.add(starsPoint);
    }

    // &#x5149;
    function lights() {
        var hemisphereLight = new THREE.HemisphereLight(0xffffff, 0x333333, 2);
        hemisphereLight.position.x = 0;
        hemisphereLight.position.y = 0;
        hemisphereLight.position.z = -200;
        group.add(hemisphereLight);
    }

    // &#x521D;&#x59CB;&#x5316;
    function init() {
        container = document.getElementById('zh_globe_container');

        scene = new THREE.Scene();
        var bgTexture = new THREE.TextureLoader().load("images/textures/starfield.jpg");
        scene.background = bgTexture;

        camera = new THREE.PerspectiveCamera(50, winWth/winHgt, 1, 2000);
        camera.up.x = 0;
        camera.up.y = 1;
        camera.up.z = 0;
        camera.position.x = 0;
        camera.position.y = 0;
        camera.position.z = 400;
        camera.lookAt(0,0,0);

        group = new THREE.Group();
        scene.add(group);

        // &#x5730;&#x7403;
        globe();

        // &#x98DE;&#x673A;
        plane();

        // &#x661F;&#x70B9;
        stars();

        // &#x534A;&#x7403;&#x5149;
        lights();

        // &#x6E32;&#x67D3;&#x5668;
        renderer = new THREE.WebGLRenderer({antialias: true, preserveDrawingBuffer: true});
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(winWth, winHgt);
        container.appendChild(renderer.domElement);

        // &#x76D8;&#x65CB;&#x63A7;&#x5236;
        var orbitControl = new THREE.OrbitControls(camera, renderer.domElement);
        orbitControl.minDistrance = 20;
        orbitControl.maxDistrance = 50;
        orbitControl.maxPolarAngle = Math.PI/2;

        // &#x6027;&#x80FD;&#x6D4B;&#x8BD5;
        stats = new Stats();
        container.appendChild(stats.dom);

        // resize&#x4E8B;&#x4EF6;
        window.addEventListener('resize', onWindowResize, false);
    }

    // &#x7A97;&#x53E3;&#x5927;&#x5C0F;&#x6539;&#x53D8;
    function onWindowResize() {
        camera.aspect = window.innerWidth/window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
    }

    // &#x6E32;&#x67D3;
    function render() {
        group.rotation.y -= 0.0005;
        renderer.render(scene, camera);
    }

    // &#x52A8;&#x753B;
    function animate() {
        requestAnimationFrame(animate);
        render();
        stats.update();
    }

    init();
    animate();
})();</tcahalflength;></dlength;>

场景背景图

Original: https://www.cnblogs.com/timssd/p/13215614.html
Author: xxxxxxxx1x2xxxxxxx
Title: 3D引擎three.js/Babylon.js/physijs.js/clipper.js绘制地球飞机,three.js是JS的WebGL第三方库。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/545552/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python 编辑器提示 do not use bare except

    在捕获异常时,应该尽可能指定特定的异常,而不是只使用 except 语句。 比如说, except 语句会捕获 KeyboardInterrupt 和 SystemExit 异常,…

    技术杂谈 2023年6月21日
    085
  • 如何将代码优雅的插入到word中

    介:写博客或者word时需要插入代码,但如何更优雅的将代码插入到word中呢? 反面教材如下: 技巧步骤1:插入表格,设置表格无边框; 技巧步骤2:使用Notepad++的高级功能…

    技术杂谈 2023年7月23日
    052
  • 设计模式

    工场method posted on2022-05-25 14:04 莫水千流 阅读(12 ) 评论() 编辑 Original: https://www.cnblogs.com/…

    技术杂谈 2023年6月1日
    098
  • 什么是Redis

    Redis 是一个使用 C 语言写成的,开源的高性能key-value非关系缓存数据库。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集…

    技术杂谈 2023年7月23日
    072
  • Django web project

    在virtualenv下 生成web 工程目录 设置settings 使用默认数据库 开启网络服务 在网页上输入网址 http://127.0.0.1:8000/ 可以看到 Ori…

    技术杂谈 2023年5月30日
    076
  • 暴力猴下载和使用教程

    暴力猴下载地址 https://wwm.lanzoub.com/iCQfP03q1q7e 使用脚本地址: https://www.tampermonkey.net/scripts….

    技术杂谈 2023年6月21日
    0209
  • 【摸鱼神器】UI库秒变低代码工具——表单篇(二)子控件

    上一篇介绍了表单控件,这一篇介绍一下表单里面的各种子控件的封装方式。 主要内容 需求分析 子控件的分类 子控件属性的分类 定义 interface。 定义子控件的的 props。 …

    技术杂谈 2023年5月31日
    087
  • String s = new String(“xyz”)创建了几个实例你真的能答对吗?

    从面试题说起 String s = new String("xyz"); 创建了几个实例? 这是一道很经典的面试题,在一本所谓的Java宝典上,我看到的&#82…

    技术杂谈 2023年7月24日
    0100
  • kafka学习

    Kafka概述 Kafka是分布式(点对点模式)(发布-订阅模式)消息系统,由Scala 写成, 它主要用于处理流式数据。本质是基于消息队列缓存数据. Kafka对消息保存时根据T…

    技术杂谈 2023年7月24日
    097
  • 图的存储结构

    图的存储结构最常用的有4 5种,常用的两种:邻接矩阵和邻接表。 一、邻接矩阵 邻接矩阵,原理就是用两个数组,一个一维数组保存顶点集,一个二维数组保存边集。 V(G)={V1,V2,…

    技术杂谈 2023年5月31日
    082
  • xx

    http://news.xinhuanet.com/politics/2017-10/17/c_1121814199.htm Original: https://www.cnblo…

    技术杂谈 2023年5月31日
    083
  • [学习笔记]Java字符和字符串

    在Java中,字符和字符串是两种不同的数据类型; 字符 (char) 是一种基本数据类型,用单引号’ 括起来; 一个char类型可以保存一个标准的ASCII字符或一个U…

    技术杂谈 2023年7月24日
    093
  • Windows下安装MySQL

    Windows下安装MySQL 安装包下载 官网下载地址https://dev.mysql.com/downloads/mysql/ 点击下载之后会跳转界面 可以不选择注册或登录账…

    技术杂谈 2023年7月24日
    062
  • RabbMQ

    RabbitMQ基本概念 Broker: 简单来说就是消息队列服务器实体 Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列 Queue: 消息队列载体,每个消息…

    技术杂谈 2023年7月24日
    061
  • Flink编译指定版本hadoop依赖

    准备工作 编译步骤 准备工作 官方文档:https://nightlies.apache.org/flink/flink-docs-release-1.11/ops/deploym…

    技术杂谈 2023年7月11日
    073
  • Java通用树结构数据管理

    1、前言 ​ 树结构是一种较为常见的数据结构,如功能权限树、企业的组织结构图、行政区划结构图、家族谱、信令消息树等,都表现为树型数据结构。 ​ 树结构数据的共性是树节点之间都有相互…

    技术杂谈 2023年6月21日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球