【jsthree.js】全景vr看房进阶版

news2025/1/21 9:42:00

three小结:

Scene场景

指包含了所有要渲染和呈现的三维对象、光源、相机以及其他相关元素的环境;场景可以被渲染引擎或图形库加载和处理,以生成最终的图像或动画

  • 常见属性:
scene.background = new THREE.Color(0x000000); // 设置背景颜色为黑色

scene.fog = new THREE.Fog(0x000000, 0.1, 100); // 创建线性雾效,颜色为黑色,起始距离为0.1,结束距离为100
  • 常见方法:
scene.add(mesh); // 将名为mesh的对象添加到场景中

scene.remove(mesh); // 从场景中移除名为mesh的对象

var obj = scene.getObjectByName('mesh'); // 获取名称为mesh的对象

scene.traverse(function(object) {
  // 对每个对象执行的操作
  console.log(object);
});

scene.dispose(); // 清除场景及其相关资源

Geometry 几何体

指的是表示和描述三维对象形状的数据,描述了对象的形状

常用的Geometry(几何体):

  • BufferGeometry   是three.js中高性能的几何体对象
  • BoxGeometry   表示立方体的几何体对象
  • SphereGeometry   表示球体的几何体对象
  • PlaneGeometry  表示平面的几何体对象
  • CylinderGeometry  表示圆柱体(包括圆柱体、圆锥体和管道)的几何体对象

Material 材质

指的是给定几何体表面外观的属性和特征,定义了对象的外观属性

常用的Material(材质):

  • MeshBasicMaterial     是最简单的材质,不受场景光照的影响
  • MeshStandardMaterial      是一种基于物理渲染(PBR)的材质,提供了更真实和逼真的渲染效果
  • MeshPhysicalMaterial       是在MeshStandardMaterial基础上更进一步的物理材质

Mesh 网格模型

是由几何体和材质组合而成的实体,将几何体和材质组合成一个完整的实体

  • 方法举例:
mesh.material = new THREE.MeshBasicMaterial({ color: 0xff0000 }); // 设置网格的材质为红色基础材质

mesh.rotation.set(Math.PI / 2, 0, 0); // 设置网格绕X轴旋转90度

mesh.rotateY(Math.PI / 4); // 将网格绕Y轴旋转45度

mesh.position.set(0, 0, 0); // 设置网格的位置为原点

  • 属性举例: 
mesh.visible = false; // 隐藏网格

mesh.material.opacity = 0.5; // 将网格材质的透明度设置为0.5

Camera 相机

用于模拟人眼视角和观察场景的虚拟设备

常用的Camera 相机:

  • PerspectiveCamera(透视相机)   模拟了人眼观察物体的效果,具有近大远小的特性
  • OrthographicCamera(正交相机)  以固定的大小渲染场景中的物体,不考虑距离远近而产生的透视效果

方法举例:

camera.lookAt(new THREE.Vector3(0, 0, 0)); // 将相机对准场景原点

camera.updateProjectionMatrix(); // 更新相机的投影矩阵

const newCamera = camera.clone(); // 克隆相机

属性举例: 

camera.position.set(0, 0, 10); // 设置相机在场景中的位置

camera.rotation.set(0, Math.PI / 2, 0); // 设置相机的旋转角度

camera.fov = 60; // 设置透视相机的视角大小为60度

camera.zoom = 2; // 将正交相机设置为缩放倍数为2

光源

 

AmbientLight(环境光):环境光是一个均匀无方向的光源,用于模拟场景中无处不在的环境光照射。它不会产生阴影,对场景中的所有物体都产生均匀的照明效果。

const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 环境光

PointLight(点光源):点光源是一个从一个点向四面八方发射光线的光源。会在场景中产生逐渐减弱的光照效果,并且可以投射阴影。通常用于模拟灯泡、蜡烛等点光源 

const pointLight = new THREE.PointLight(0xff0000, 1, 10); // 红色点光源
pointLight.position.set(0, 3, 0)

DirectionalLight(平行光):平行光是一种无限远、平行的光源,模拟太阳光。它是从一个特定的方向射来的光,所有光线都是平行的。平行光可以产生阴影,对场景中的物体产生类似于自然光的直射效果 

const directionalLight = new THREE.DirectionalLight(0x00ff00, 1); // 绿色平行光
directionalLight.position.set(-1, 2, 4);

SpotLight(聚光灯):聚光灯是一个从一个点射出的光锥,具有指定的方向和光束角度。它可以投射出锥形的光束,并且可以产生阴影。聚光灯通常用于模拟手电筒、舞台灯光等

const spotLight = new THREE.SpotLight(0x0000ff, 1, 10, Math.PI / 4, 0.5); // 蓝色聚光灯
spotLight.position.set(2, 3, 0);
spotLight.target.position.set(0, 0, 0);

WebGLRenderer 渲染器

用于在Web浏览器中使用WebGL绘制和呈现3D图形

OrbitControls   相机控件工具

使用户可以通过鼠标或触摸手势来旋转、缩放和平移相机,以改变场景的视角

属性举例: 

controls.enabled = true; // 启用控制器

controls.minZoom = 0.5; // 设置相机的最小缩放倍数为0.5
controls.maxZoom = 2; // 设置相机的最大缩放倍数为2

controls.enableRotate = true; // 启用旋转操作
controls.enableZoom = true; // 启用缩放操作
controls.enablePan = true; // 启用平移操作

效果展示:

目录展示:

 代码展示:

 path.js

function path() {
    return [{
        name: "中式",
        styleObj: {
            background: '#409EFF'
        },
        children: [{
            name: "客餐厅",
            styleObj: {
                background: '#409EFF'
            },
            jpgNameArr: ["00125.jpg"]
        }, {
            name: "客厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "餐厨",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卧室",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卫浴",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "书房",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }]
    }, {
        name: "现代",
        styleObj: {
            background: null
        },
        children: [{
            name: "客餐厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "客厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "餐厨",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卧室",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卫浴",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }]
    }, {
        name: "新古典",
        styleObj: {
            background: null
        },
        children: [{
            name: "客餐厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "客厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "餐厨",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卧室",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卫浴",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }]
    }, {
        name: "欧式",
        styleObj: {
            background: null
        },
        children: [{
            name: "客餐厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "客厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "餐厨",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卧室",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卫浴",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }]
    }, {
        name: "美式",
        styleObj: {
            background: null
        },
        children: [{
            name: "客餐厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "客厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "餐厨",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卧室",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "卫浴",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }]
    }, {
        name: "北欧",
        styleObj: {
            background: null
        },
        children: [{
            name: "客餐厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "客厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        },{
            name: "卧室",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }]
    }, {
        name: "法式",
        styleObj: {
            background: null
        },
        children: [{
            name: "客厅",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }, {
            name: "餐厨",
            styleObj: {
                background: null
            },
            jpgNameArr: ["0011.jpg"]
        }]
    }]

}

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Three.js-webgl室内设计效果全景在线预览</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
        }

        #menu {
            position: absolute;
            bottom: 0px;
            color: #fff;
            background: rgba(0, 0, 0, 0.5);
            padding: 10px;
            z-index: 102;
            width: 500px;
            height: 80px
        }

        #menu>div {
            padding: 5px;
        }

        #menu span {
            display: inline-block;
            padding: 5px 10px;
            cursor: pointer;
        }

        .el-button--danger {
            font-size: 25px !important;
            background: rgba(0, 0, 0, 0.5) !important;
            border-width: 0px !important;
            width: 50px !important;
            height: 50px !important;
        }

        [v-cloak] {
            display: none;
        }
    </style>
    <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/build/three.min.js"></script>
    <script src="http://www.yanhuangxueyuan.com/versions/threejsR92/examples/js/controls/OrbitControls.js"></script>
    <script src="http://www.yanhuangxueyuan.com/js/vue@2.5.16.min.js"></script>
    <!-- 主要用于功能按钮 -->
    <script src="http://www.yanhuangxueyuan.com/js/element-ui/index.js"></script>
    <!-- 主要用于弹出框 -->
    <link rel="stylesheet" href="http://www.yanhuangxueyuan.com/js/element-ui/index.css">
    <script src="path.js"></script>
</head>

<body>
    <div id="app" z-index="105">
        <!-- 底部选择栏 -->
        <div id="menu" :style="{left:width/2 + -250+'px'}">
            <div><span style="font-weight:bold;cursor:default;"> 风格:</span><span v-for="obj in styleArr"
                    @click="styleClick(obj)" :style="obj.styleObj"> {{ obj.name }}</span></div>
            <div><span style="font-weight:bold;cursor:default;"> 位置:</span><span v-for="obj in posArr"
                    @click="posClick(obj)" :style="obj.styleObj" v-if="obj.jpgNameArr.length"> {{ obj.name }}</span>
            </div>
        </div>
        <!-- 顶部功能栏 使用的element-->
        <div style="position: absolute;right:20px;top:20px">
            <el-button type="danger" circle @click="audioClick()"><i><img
                        :src="(audioBoool)?('./UI/打开声音.png'):('./UI/关闭声音.png')" alt="" height="20"
                        width="20"></i></el-button>
            <el-button type="danger" circle @click="ScreenClick()"><i><img
                        :src="(ScreenBoool)?('./UI/全屏5.png'):('./UI/退出全屏.png')" alt="" width="18"
                        height="18"></i></el-button>
            <el-button type="danger" circle @click="rotateClick()"><i><img
                        :src="(rotateBoool)?('./UI/旋转.png'):('./UI/停止旋转.png')" alt="" width="20"
                        height="20"></i></el-button>
            <el-button type="danger" circle @click="questionClick()"><i><img src="./UI/帮助5.png" alt="" width="22"
                        height="22"></i></el-button>
        </div>
    </div>
    <script>
        // 创建场景
        var scene = new THREE.Scene();
        // 创建一个球体(Sphere)几何体
        var box = new THREE.SphereGeometry(25, 50, 50);
        // 创建一个基本网格材质
        var material = new THREE.MeshBasicMaterial({
            color: 0xffffff,
            side: THREE.BackSide,
        });
        // 创建了一个网格对象实例
        var mesh = new THREE.Mesh(box, material);
        // 将网格对象添加到场景中,以便在渲染时呈现出来
        scene.add(mesh);
        // 创建了一个纹理加载器实例
        var textureLoader = new THREE.TextureLoader();
        // 创建了一个音频监听器实例
        var listener = new THREE.AudioListener();
        // 创建一个用于播放音频的对象
        var audio = new THREE.Audio(listener);
        // 创建一个纹理加载器,并调用 load() 方法加载指定路径的纹理图像
        var texture = textureLoader.load('./风格/中式/客餐厅/00125.jpg', function (obj) {
            vm.loading.close();
            // 创建一个音频加载器
            var audioLoader = new THREE.AudioLoader();
            audioLoader.load('./音乐/琵琶语.mp3', function (AudioBuffer) {
                // 将加载的音频数据设置给 audio 对象
                audio.setBuffer(AudioBuffer);
                // 设置音频循环播放
                audio.setLoop(true);
                // 设置音频音量
                audio.setVolume(0.3);
                // 开始播放音频
                audio.play()
            });
            // 执行渲染
            render()
        });
        // 网格对象将使用加载的纹理作为材质的贴图
        mesh.material.map = texture;
        // 当前窗口的宽度
        var width = window.innerWidth;
        // 获取当前窗口的高度
        var height = window.innerHeight;
        // 计算宽高比
        var k = width / height;
        // 创建相机
        var camera = new THREE.PerspectiveCamera(60, k, 1, 1000);
        // 设置相机的缩放比例为 1。表示相机的视野不进行缩放
        camera.zoom = 1;
        // 修改相机的属性后,需要调用该方法来更新相机的投影矩阵,确保改变后的属性生效
        camera.updateProjectionMatrix();
        // 设置相机的位置坐标   通过设置相机的位置,可以决定场景中的视角
        camera.position.set(-0.87, 0.03, 0.4);
        // 设置相机的视线方向朝向场景的原点
        camera.lookAt(scene.position);
        // 创建一个基于 WebGL 的渲染器对象
        var renderer = new THREE.WebGLRenderer({
            // 开启抗锯齿效果,提高渲染的质量
            antialias: true,
        });
        // 设置渲染器的输出画布大小为窗口的宽度和高度
        renderer.setSize(width, height);
        // 将渲染器的 canvas 元素添加到页面的 body 中
        document.body.appendChild(renderer.domElement);
        // 创建时钟对象  用于跟踪时间的流逝,可以用来控制动画和其他与时间相关的操作
        var clock = new THREE.Clock();
        // 表示每秒帧数,这里设置为 30 帧
        var FPS = 30;
        // 计算每帧的时间间隔
        var 刷新时间 = 1 / FPS;
        var timeS = 0;

        function render() {
            // 浏览器执行下一次渲染时调用 render 函数
            requestAnimationFrame(render);
            // getDelta() 返回上一次调用之后的时间差,即两次渲染之间的时间间隔
            var 渲染间隔 = clock.getDelta();
            timeS = timeS + 渲染间隔;
            // 总运行时间是否大于刷新时间
            if (timeS > 刷新时间) {
                // 使用渲染器对象 renderer 来渲染场景 scene 和相机 camera
                renderer.render(scene, camera);
                if (vm.rotateBoool) {
                    // mesh 沿 Y 轴旋转 0.002 弧度
                    mesh.rotateY(0.002)
                }
                timeS = 0
            }
        }
        render();
        // 创建了一个控制器对象,用于控制相机的旋转、缩放和平移等操作
        var controls = new THREE.OrbitControls(camera);
        // 禁用 OrbitControls 控制器对象的平移功能
        controls.enablePan = false;
        // 获取本地数据
        var styleObjArr = path();
        var vm = new Vue({
            el: "#app",
            data: {
                loading: null,
                styleArr: styleObjArr,
                styleChoose: null,
                posArr: null,
                posChoose: null,
                width: window.innerWidth,
                height: window.innerHeight,
                classPath: '中式/客餐厅',
                path: '',
                audioBoool: true,
                ScreenBoool: true,
                rotateBoool: true,
                N: styleObjArr[0].children[0].jpgNameArr.length,
                num: 1,
            },
            methods: {
                audioClick: function () {
                    // 播放音乐
                    if (this.audioBoool) {
                        this.audioBoool = false;
                        audio.pause()
                    } else {
                        // 暂停音乐
                        this.audioBoool = true;
                        audio.play()
                    }
                },
                // 全屏方法
                ScreenClick: function () {
                    if (this.ScreenBoool) {
                        this.ScreenBoool = false;
                        requestFullScreen()
                    } else {
                        this.ScreenBoool = true;
                        exitFullscreen()
                    }
                },
                questionClick: function () {
                    // element弹框的的this.$alert
                    this.$alert('按住左键不放上下左右拖动,可以旋转整个场景', '旋转操作', {})
                },
                // 旋转
                rotateClick: function () {
                    if (this.rotateBoool) {
                        this.rotateBoool = false
                    } else {
                        this.rotateBoool = true
                    }
                },
                nextClick: function () {
                    if (this.num < this.N) {
                        this.num += 1
                    } else {
                        this.num = 1
                    }
                },
                upClick: function () {
                    if (this.num > 1) {
                        this.num -= 1
                    } else {
                        this.num = this.N
                    }
                },
                // 风格选择
                styleClick: function (styleObj) {
                    this.loading = this.$loading({
                        lock: true,
                        text: 'Loading',
                        spinner: 'el-icon-loading',
                        background: 'rgba(0, 0, 0, 0.7)'
                    });
                    this.num = 1;
                    this.styleChoose.styleObj.background = null;
                    this.posChoose.styleObj.background = null;
                    this.styleChoose = styleObj;
                    this.styleChoose.styleObj.background = '#409EFF';
                    this.posArr = this.styleChoose.children;
                    this.posChoose = this.posArr[0];
                    this.posArr[0].styleObj.background = '#409EFF';
                    this.N = this.posChoose.jpgNameArr.length;
                    this.classPath = this.styleChoose.name + '/' + this.posChoose.name;
                    this.path = this.classPath + '/' + this.posChoose.jpgNameArr[this.num - 1];
                    var texture = textureLoader.load('./风格/' + this.path, function (obj) {
                        // 关闭加载中的提示框
                        vm.loading.close();
                        render()
                    });
                    mesh.material.map = texture
                },
                // 位置选择
                posClick: function (posObj) {
                    this.loading = this.$loading({
                        lock: true,
                        text: 'Loading',
                        spinner: 'el-icon-loading',
                        background: 'rgba(0, 0, 0, 0.7)'
                    });
                    this.num = 1;
                    this.posChoose.styleObj.background = null;
                    this.posChoose = posObj;
                    this.N = this.posChoose.jpgNameArr.length;
                    this.posChoose.styleObj.background = '#409EFF';
                    this.classPath = this.styleChoose.name + '/' + this.posChoose.name;
                    this.path = this.classPath + '/' + this.posChoose.jpgNameArr[this.num - 1];
                    var texture = textureLoader.load('./风格/' + this.path, function (obj) {
                        vm.loading.close();
                        render()
                    });
                    mesh.material.map = texture
                }
            },
            watch: {
                num: function (value) {
                    this.loading = this.$loading({
                        lock: true,
                        text: 'Loading',
                        spinner: 'el-icon-loading',
                        background: 'rgba(0, 0, 0, 0.7)'
                    });
                    this.path = this.classPath + '/' + this.posChoose.jpgNameArr[this.num - 1];
                    console.log(this.path);
                    var texture = textureLoader.load('./风格/' + this.path, function (obj) {
                        vm.loading.close();
                        render()
                    });
                    mesh.material.map = texture;
                    render()
                }
            },
            created() {
                this.posArr = styleObjArr[0].children;
                this.styleChoose = this.styleArr[0];
                this.posChoose = styleObjArr[0].children[0];
                this.loading = this.$loading({
                    lock: true,
                    text: 'Loading',
                    spinner: 'el-icon-loading',
                    background: 'rgba(0, 0, 0, 0.7)'
                })
            }
        });

        window.onresize = onresizeFun;
        function onresizeFun() {
            renderer.setSize(window.innerWidth, window.innerHeight);
            // 设置相机的视图比例(即宽高比)
            camera.aspect = window.innerWidth / window.innerHeight;
            // 修改相机的属性后,需要调用该方法来更新相机的投影矩阵,确保改变后的属性生效
            camera.updateProjectionMatrix();
            vm.width = window.innerWidth;
            vm.height = window.innerHeight;
        };

        function requestFullScreen() {
            // 获取文档的根元素
            var de = document.documentElement;
            // 检查当前浏览器是否支持 requestFullscreen 方法
            if (de.requestFullscreen) {
                // 全屏显示模式
                de.requestFullscreen()
            } else if (de.mozRequestFullScreen) { //进一步检查当前浏览器是否支持 mozRequestFullScreen 方法
                de.mozRequestFullScreen()
            } else if (de.webkitRequestFullScreen) { //再进一步检查当前浏览器是否支持 webkitRequestFullScreen 方法
                de.webkitRequestFullScreen()
            }
        }
        // 与上相反 退出全屏
        function exitFullscreen() {
            var de = document;
            if (de.exitFullscreen) {
                de.exitFullscreen()
            } else if (de.mozCancelFullScreen) {
                de.mozCancelFullScreen()
            } else if (de.webkitCancelFullScreen) {
                de.webkitCancelFullScreen()
            }
        }
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【01背包理论】01背包问题dp[j](滚动数组) <动态规划板子>

【01背包理论】01背包问题dp[j] 有 n 件物品和一个最多能背重量为 w 的背包。 第 i 件物品的重量是 weight[i]&#xff0c;得到的价值是 value[i] 。 每件物品只有一个&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 题解 动态规划 确定 dp 数组以及下标的含义 滚…

wxpython: 数字时钟秒表

wxpython 数字时钟秒表&#xff1b;定时器和线程>示例 编写 wx_clock.py 如下 # -*- coding: utf-8 -*- """ 定时器和线程>示例""" import wx import time import threadingclass MyFrame(wx.Frame): def __init__(self):""…

【Java核心知识】线程基础知识

文章目录 线程线程与进程的区别创建线程的方法方法一&#xff1a;继承Thread类方法二&#xff1a;实现Runnable接口方法三&#xff1a;使用Callable和FutureTask创建带返回值的线程方法四&#xff1a;通过线程池创建线程 线程的基本操作线程的状态守护线程 线程 线程与进程的区…

基于Java的学生宿舍管理系统,springboot+jsp,MySQL数据库,前后端分离,学生+宿舍管理员+系统管理员三种身份,完美运行,有一万字论文。

基于Java的学生宿舍管理系统&#xff0c;springbootjsp&#xff0c;MySQL数据库&#xff0c;前后端分离&#xff0c;学生宿舍管理员系统管理员三种身份&#xff0c;完美运行&#xff0c;有一万字论文。 学生&#xff1a;个人信息管理、保修、假期&#xff08;入校、离校&#x…

【网络】路由配置实践

网络实践-路由篇 本文使用vmware虚拟机进行路由表配置实践&#xff0c;通过配置路由表连接两个不同的网络 网络规划&#xff1a; 准备三台centos7虚拟机&#xff0c;其中一台作为路由设备router&#xff0c;其余两台分别代表处在不通网络中的pc1和pc2。因此router虚拟机需要分…

IntelliJ IDEA的远程开发(Remote Development)

DEA的远程开发功能&#xff0c;可以将本地的编译、构建、调试、运行等工作都放在远程服务器上执行&#xff0c;而本地仅运行客户端软件进行常规的开发操作即可&#xff0c;官方给出的逻辑图如下&#xff0c;可见通过本地的IDE和服务器上的IDE backend将本地电脑和服务器打通&am…

iOS设备管理软件iMazing2024

文件系统是一种用于在存储设备上组织文件和文件夹的系统。所有的存储设备&#xff08;如计算机、USB存储器、手机等&#xff09;都有着自己的文件系统。 iMazing文件系统功能将iOS设备中封闭而复杂的文件管理系统整合在一起&#xff0c;让您管理文件像在电脑中使用Windows文件…

肖sir __linux__面试题和考核05

面试题 1、查看linux中第11行到第20行的数据&#xff08;比如文档a 有30行&#xff09; 方法1&#xff1a;tail -n 11 mm |head -n10 n 表示从第10行开始&#xff0c;取前10行 方法2&#xff1a;head -n -10 mm| tail -n 10 表示从末尾第10行开始&#xff0c;最后10行 方法3&am…

ThreadLocal原理剖析

一.ThreadLocal的含义 ThreadLocal也就是线程本地变量&#xff0c;创建了一个ThreadLocal变量&#xff0c;访问这个变量的每个线程都会有这个变量的一个本地拷贝&#xff0c;多个线程操作这个变量的时候&#xff0c;实际上是操作自己本地内存里面的变量&#xff0c;从而起到线…

基于单片机的简易智能电动车设计

一、项目介绍 智能交通工具在现代社会中起着越来越重要的作用&#xff0c;电动车作为一种环保、便捷的交通工具&#xff0c;受到了广泛的关注和应用。本设计基于单片机技术&#xff0c;设计一款简易智能电动车&#xff0c;实现基本的控制和功能&#xff0c;并提供良好的用户体…

kubectl入门

一.kubectl的三种资源管理方式&#xff1a; 二. kubectl资源介绍&#xff1a; 1.namespace&#xff1a;实现多套环境的资源隔离或者多租户的资源隔离。k8s中的pod默认可以相互访问&#xff0c;如果不想让两个pod之间相互访问&#xff0c;就将其划分到不同ns下。 2.pod&#x…

搭建Python开发环境

开发环境 Python是一种跨平台 的编程语言&#xff0c;这意味着它能够在所有的主流操作系统中运行&#xff0c;开发者可以Windows、Linux、Mac中开发和学习Python&#xff0c;甚至在Android手机中也可以运行Python代码。 在所有安装了Pythonr现代计算机上&#xff0c;都能够运…

华为OD:敏感字段加密

题目描述&#xff1a; 给定一个由多个命令字组成的命令字符串&#xff1a; 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号&#xff1b; 2、命令字之间以一个或多个下划线_进行分割&#xff1b; 3、可以通过两个双引号”"来标识包含下划线…

自定义创建项目

基于VueCli自定义创建项目 1.Eslint代码规范 代码规范:一套写代码的约定规则。 比如 赋值符号的左右是否需要空格 一句话结束是否要加&#xff1b; 正规的团队 需要统一的编码风格 https://standardjs.com/rules-zhcn.html 规则查找 https://zh-hans.eslint.org/docs/late…

CESM2代码下载

这半年忙着毕业写论文&#xff0c;好久好久好久不更新了∠( ω)&#xff0f; &#xff0c;今天准备开个新坑 ๑乛◡乛๑&#xff0c;学习一下CESM&#xff08;Community Earth System Model&#xff09;&#xff0c;它是一个完全耦合的全球气候模型&#xff0c;可用于地球过去、…

千纸鹤APP云验证系统源码 APK注入引流弹窗

千纸鹤APP云验证系统是一款全面的验证系统&#xff0c;包括网络验证、APK注入、注册机、引流弹窗、更新弹窗等功能。该系统提供完整的源代码&#xff0c;方便开发者二次开发和定制化需求。 可以对用户进行多种验证&#xff0c;包括账号密码验证、短信验证码验证等。该系统还提供…

jmeter 常数吞吐量定时器

模拟固定吞吐量的定时器。它可以控制测试计划中各个请求之间的时间间隔&#xff0c;以达到预期的吞吐量。 参数包括&#xff1a; Target Throughput&#xff1a;目标吞吐量&#xff08;每分钟请求数&#xff09;Calculate Throughput based on&#xff1a;吞吐量计算基准&…

机器人中的数值优化(七)——修正阻尼牛顿法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京师范大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京师范大学图书馆

程序员工作技巧

提高工作技巧的秘方 案例 让我们猜测一下 绵羊想表达的什么&#xff1f; 并不够准确 崩了&#xff0c;不能用了整个业务瘫痪了研发没有责任感 语义规则/模棱俩可 相对语言 量化数据表达&#xff1a;疼苦指数&#xff0c;拥堵指数&#xff0c;准确。 尽量减少标签化评价 标签…