ThreeJS-聚光等衰减(二十一)

聚光灯可以联系到现实中的手电筒

衰减分为:距离衰减和边缘衰减

.decay : Float(控制的是灯光自身的亮度)

The amount the light dims along the distance of the light. Default is 2.
In context of physically-correct rendering the default value should not be changed.

.distance : Float(距离衰减)

如果非零,那么光强度将会从最大值当前灯光位置处按照距离线性衰减到0。 缺省值为 0.0

.penumbra : Float(边缘衰减)

聚光锥的半影衰减百分比。在0和1之间的值。 默认值 — 0.0。

距离衰减

关键代码:

            //灯光有效距离,默认0表示不衰减
            directionalLight.distance = 0;
            gui.add(directionalLight, 'distance').min(0).max(100).step(1).name("灯光有效距离");

完整代码:

<template>
    <div id="three_div"></div>
</template>

<script>
    import * as dat from 'dat.gui' //界面控制
    import * as THREE from "three";
    import {
        OrbitControls
    } from "three/examples/jsm/controls/OrbitControls";
    import {
        RGBELoader
    } from "three/examples/jsm/loaders/RGBELoader"
    export default {
        name: "HOME",
        components: {
            // vueQr,
            // glHome,
        },
        data() {
            return {};
        },
        mounted() {
            //使用控制器控制3D拖动旋转OrbitControls
            //控制3D物体移动

            //1.创建场景
            const scene = new THREE.Scene();
            console.log(scene);

            //2.创建相机
            const camera = new THREE.PerspectiveCamera(
                75,
                window.innerWidth / window.innerHeight,
                0.1,
                1000
            );
            //设置相机位置
            camera.position.set(0, 0, 10);
            //将相机添加到场景
            scene.add(camera);
            //添加物体
            //创建一个半径为1,经纬度分段数位20的球
            const cubeGeometry = new THREE.SphereBufferGeometry(2, 100, 100);
            //纹理加载器加载图片
            const cubeMaterial = new THREE.MeshStandardMaterial({
                //side: THREE.DoubleSide,
            });
            //根据几何体和材质创建物体
            const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);
            //将物体加入到场景
            scene.add(mesh);

            //创建平面几何体
            const planeGeometry = new THREE.PlaneBufferGeometry(50, 50);
            //创建平面物体
            const planeMesh = new THREE.Mesh(planeGeometry, cubeMaterial);
            planeMesh.position.set(0, -2, 0);
            planeMesh.rotation.x = -Math.PI / 2;
            //场景添加平面物体
            scene.add(planeMesh);

            //给场景所有的物体添加默认的环境贴图
            //添加坐标轴辅助器
            const axesHepler = new THREE.AxesHelper(5);
            scene.add(axesHepler);
            //标准材质需要借助灯光

            //添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)
            const light = new THREE.AmbientLight(0xFFFFFF, 0.7);
            scene.add(light);
            //直线光(由光源发出的灯光)
            // const directionalLight = new THREE.DirectionalLight(0xFFFFFF, 0.7);
            // directionalLight.position.set(10, 10, 10);
            // scene.add(directionalLight);
            const directionalLight = new THREE.SpotLight(0xFFFFFF, 0.7);
            directionalLight.position.set(10, 10, 10);
            scene.add(directionalLight);

            // scene.add(mesh2);
            //初始化渲染器
            const render = new THREE.WebGLRenderer();
            //设置渲染器的尺寸
            render.setSize(window.innerWidth, window.innerHeight);
            //使用渲染器,通过相机将场景渲染进来

            //创建轨道控制器,可以拖动,控制的是摄像头
            const controls = new OrbitControls(camera, render.domElement);
            //设置控制阻尼,让控制器有更真实的效果
            controls.enableDamping = true;


            //开启投影
            //开启渲染器投影
            render.shadowMap.enabled = true;
            //开启灯光动态投影
            directionalLight.castShadow = true;
            //开启物体投影
            mesh.castShadow = true;
            //开启平面接受投影
            planeMesh.receiveShadow = true;
            //投影模糊度
            directionalLight.shadow.radius = 10;
            //设置投影的宽度和高度
            // directionalLight.shadow.mapSize.set(1024, 1024);

            //平行光投射相机的属性
            // directionalLight.shadow.camera.near= 0.5;
            // directionalLight.shadow.camera.far= 500;
            // directionalLight.shadow.camera.top= 3;
            // directionalLight.shadow.camera.bottom= -2;
            // directionalLight.shadow.camera.left= -2;
            // directionalLight.shadow.camera.right= 2;
            //灯光跟着物体移动而移动
            directionalLight.target = mesh;
            //directionalLight.angle = Math.PI/10;
            //创建gui
            const gui = new dat.GUI();
            // gui.add(directionalLight.shadow.camera, 'near').min(1).max(25).step(1).name("相机近距离").onChange( () => {
            //     directionalLight.shadow.camera.updateProjectionMatrix();
            // })
            gui.add(mesh.position, 'x').min(-30).max(30).step(1).name("移动位置");
            gui.add(directionalLight, 'angle').min(0).max(Math.PI/2).step(0.1).name("灯光弧度");
            
            //灯光有效距离,默认0表示不衰减
            directionalLight.distance = 0;
            gui.add(directionalLight, 'distance').min(0).max(100).step(1).name("灯光有效距离");
            //将webgl渲染的canvas内容添加到body上
            document.getElementById("three_div").appendChild(render.domElement);

            //渲染下一帧的时候就会调用回调函数
            let renderFun = () => {
                //更新阻尼数据
                controls.update();
                //需要重新绘制canvas画布
                render.render(scene, camera);
                //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数
                //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果
                window.requestAnimationFrame(renderFun);
            };
            // window.requestAnimationFrame(renderFun);
            renderFun();

            //画布全屏
            window.addEventListener("dblclick", () => {
                if (document.fullscreenElement) {
                    document.exitFullscreen();
                } else {
                    //document.documentElement.requestFullscreen();
                    render.domElement.requestFullscreen();
                }
            });

            //监听画面变化,更新渲染画面,(自适应的大小)
            window.addEventListener("resize", () => {
                //更新摄像机的宽高比
                camera.aspect = window.innerWidth / window.innerHeight;
                //更新摄像机的投影矩阵
                camera.updateProjectionMatrix();
                //更新渲染器宽度和高度
                render.setSize(window.innerWidth, window.innerHeight);
                //设置渲染器的像素比
                render.setPixelRatio(window.devicePixelRatio);
                console.log("画面变化了");
            });
        },
        methods: {
            paush(animate) {
                animate.pause();
            },
        },
    };
</script>

<style scoped lang="scss">
</style>

效果图:

灯边缘衰减

关键代码:

//边缘衰减

gui.add(directionalLight, 'penumbra').min(0).max(1).step(0.01).name("灯光边缘衰减");

完整代码:

<template>
    <div id="three_div"></div>
</template>

<script>
    import * as dat from 'dat.gui' //界面控制
    import * as THREE from "three";
    import {
        OrbitControls
    } from "three/examples/jsm/controls/OrbitControls";
    import {
        RGBELoader
    } from "three/examples/jsm/loaders/RGBELoader"
    export default {
        name: "HOME",
        components: {
            // vueQr,
            // glHome,
        },
        data() {
            return {};
        },
        mounted() {
            //使用控制器控制3D拖动旋转OrbitControls
            //控制3D物体移动

            //1.创建场景
            const scene = new THREE.Scene();
            console.log(scene);

            //2.创建相机
            const camera = new THREE.PerspectiveCamera(
                75,
                window.innerWidth / window.innerHeight,
                0.1,
                1000
            );
            //设置相机位置
            camera.position.set(0, 0, 10);
            //将相机添加到场景
            scene.add(camera);
            //添加物体
            //创建一个半径为1,经纬度分段数位20的球
            const cubeGeometry = new THREE.SphereBufferGeometry(2, 100, 100);
            //纹理加载器加载图片
            const cubeMaterial = new THREE.MeshStandardMaterial({
                //side: THREE.DoubleSide,
            });
            //根据几何体和材质创建物体
            const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);
            //将物体加入到场景
            scene.add(mesh);

            //创建平面几何体
            const planeGeometry = new THREE.PlaneBufferGeometry(50, 50);
            //创建平面物体
            const planeMesh = new THREE.Mesh(planeGeometry, cubeMaterial);
            planeMesh.position.set(0, -2, 0);
            planeMesh.rotation.x = -Math.PI / 2;
            //场景添加平面物体
            scene.add(planeMesh);

            //给场景所有的物体添加默认的环境贴图
            //添加坐标轴辅助器
            const axesHepler = new THREE.AxesHelper(5);
            scene.add(axesHepler);
            //标准材质需要借助灯光

            //添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)
            const light = new THREE.AmbientLight(0xFFFFFF, 0.7);
            scene.add(light);
            //直线光(由光源发出的灯光)
            // const directionalLight = new THREE.DirectionalLight(0xFFFFFF, 0.7);
            // directionalLight.position.set(10, 10, 10);
            // scene.add(directionalLight);
            const directionalLight = new THREE.SpotLight(0xFFFFFF, 0.7);
            directionalLight.position.set(10, 10, 10);
            scene.add(directionalLight);

            // scene.add(mesh2);
            //初始化渲染器
            const render = new THREE.WebGLRenderer();
            //设置渲染器的尺寸
            render.setSize(window.innerWidth, window.innerHeight);
            //使用渲染器,通过相机将场景渲染进来

            //创建轨道控制器,可以拖动,控制的是摄像头
            const controls = new OrbitControls(camera, render.domElement);
            //设置控制阻尼,让控制器有更真实的效果
            controls.enableDamping = true;


            //开启投影
            //开启渲染器投影
            render.shadowMap.enabled = true;
            //开启灯光动态投影
            directionalLight.castShadow = true;
            //开启物体投影
            mesh.castShadow = true;
            //开启平面接受投影
            planeMesh.receiveShadow = true;
            //投影模糊度
            directionalLight.shadow.radius = 10;
            //设置投影的宽度和高度
            // directionalLight.shadow.mapSize.set(1024, 1024);

            //平行光投射相机的属性
            // directionalLight.shadow.camera.near= 0.5;
            // directionalLight.shadow.camera.far= 500;
            // directionalLight.shadow.camera.top= 3;
            // directionalLight.shadow.camera.bottom= -2;
            // directionalLight.shadow.camera.left= -2;
            // directionalLight.shadow.camera.right= 2;
            //灯光跟着物体移动而移动
            directionalLight.target = mesh;
            //directionalLight.angle = Math.PI/10;
            //创建gui
            const gui = new dat.GUI();
            // gui.add(directionalLight.shadow.camera, 'near').min(1).max(25).step(1).name("相机近距离").onChange( () => {
            //     directionalLight.shadow.camera.updateProjectionMatrix();
            // })
            gui.add(mesh.position, 'x').min(-30).max(30).step(1).name("移动位置");
            gui.add(directionalLight, 'angle').min(0).max(Math.PI/2).step(0.1).name("灯光弧度");
            
            //灯光有效距离,默认0表示不衰减
            directionalLight.distance = 0;
            gui.add(directionalLight, 'distance').min(0).max(100).step(1).name("灯光有效距离");
            
            //边缘衰减
            gui.add(directionalLight, 'penumbra').min(0).max(1).step(0.01).name("灯光边缘衰减");
            
            //将webgl渲染的canvas内容添加到body上
            document.getElementById("three_div").appendChild(render.domElement);

            //渲染下一帧的时候就会调用回调函数
            let renderFun = () => {
                //更新阻尼数据
                controls.update();
                //需要重新绘制canvas画布
                render.render(scene, camera);
                //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数
                //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果
                window.requestAnimationFrame(renderFun);
            };
            // window.requestAnimationFrame(renderFun);
            renderFun();

            //画布全屏
            window.addEventListener("dblclick", () => {
                if (document.fullscreenElement) {
                    document.exitFullscreen();
                } else {
                    //document.documentElement.requestFullscreen();
                    render.domElement.requestFullscreen();
                }
            });

            //监听画面变化,更新渲染画面,(自适应的大小)
            window.addEventListener("resize", () => {
                //更新摄像机的宽高比
                camera.aspect = window.innerWidth / window.innerHeight;
                //更新摄像机的投影矩阵
                camera.updateProjectionMatrix();
                //更新渲染器宽度和高度
                render.setSize(window.innerWidth, window.innerHeight);
                //设置渲染器的像素比
                render.setPixelRatio(window.devicePixelRatio);
                console.log("画面变化了");
            });
        },
        methods: {
            paush(animate) {
                animate.pause();
            },
        },
    };
</script>

<style scoped lang="scss">
</style>

效果图:

衰减量(属于距离衰减,衰减量越大,距离越近)

 关键代码:

            //灯光衰减量控制
            directionalLight.decay = 2;
            gui.add(directionalLight, 'decay').min(-5).max(5).step(1).name("灯光衰减量");
            //需要渲染器开启物理渲染
            render.physicallyCorrectLights =true;

完整代码:

<template>
    <div id="three_div"></div>
</template>

<script>
    import * as dat from 'dat.gui' //界面控制
    import * as THREE from "three";
    import {
        OrbitControls
    } from "three/examples/jsm/controls/OrbitControls";
    import {
        RGBELoader
    } from "three/examples/jsm/loaders/RGBELoader"
    export default {
        name: "HOME",
        components: {
            // vueQr,
            // glHome,
        },
        data() {
            return {};
        },
        mounted() {
            //使用控制器控制3D拖动旋转OrbitControls
            //控制3D物体移动

            //1.创建场景
            const scene = new THREE.Scene();
            console.log(scene);

            //2.创建相机
            const camera = new THREE.PerspectiveCamera(
                75,
                window.innerWidth / window.innerHeight,
                0.1,
                1000
            );
            //设置相机位置
            camera.position.set(0, 0, 10);
            //将相机添加到场景
            scene.add(camera);
            //添加物体
            //创建一个半径为1,经纬度分段数位20的球
            const cubeGeometry = new THREE.SphereBufferGeometry(2, 100, 100);
            //纹理加载器加载图片
            const cubeMaterial = new THREE.MeshStandardMaterial({
                //side: THREE.DoubleSide,
            });
            //根据几何体和材质创建物体
            const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);
            //将物体加入到场景
            scene.add(mesh);

            //创建平面几何体
            const planeGeometry = new THREE.PlaneBufferGeometry(50, 50);
            //创建平面物体
            const planeMesh = new THREE.Mesh(planeGeometry, cubeMaterial);
            planeMesh.position.set(0, -2, 0);
            planeMesh.rotation.x = -Math.PI / 2;
            //场景添加平面物体
            scene.add(planeMesh);

            //给场景所有的物体添加默认的环境贴图
            //添加坐标轴辅助器
            const axesHepler = new THREE.AxesHelper(5);
            scene.add(axesHepler);
            //标准材质需要借助灯光

            //添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)
            const light = new THREE.AmbientLight(0xFFFFFF, 0.7);
            scene.add(light);
            //直线光(由光源发出的灯光)
            // const directionalLight = new THREE.DirectionalLight(0xFFFFFF, 0.7);
            // directionalLight.position.set(10, 10, 10);
            // scene.add(directionalLight);
            const directionalLight = new THREE.SpotLight(0xFFFFFF, 0.7);
            directionalLight.position.set(10, 10, 10);
            scene.add(directionalLight);

            // scene.add(mesh2);
            //初始化渲染器
            const render = new THREE.WebGLRenderer();
            //设置渲染器的尺寸
            render.setSize(window.innerWidth, window.innerHeight);
            //使用渲染器,通过相机将场景渲染进来

            //创建轨道控制器,可以拖动,控制的是摄像头
            const controls = new OrbitControls(camera, render.domElement);
            //设置控制阻尼,让控制器有更真实的效果
            controls.enableDamping = true;


            //开启投影
            //开启渲染器投影
            render.shadowMap.enabled = true;
            //开启灯光动态投影
            directionalLight.castShadow = true;
            //开启物体投影
            mesh.castShadow = true;
            //开启平面接受投影
            planeMesh.receiveShadow = true;
            //投影模糊度
            directionalLight.shadow.radius = 10;
            //设置投影的宽度和高度
            // directionalLight.shadow.mapSize.set(1024, 1024);

            //平行光投射相机的属性
            // directionalLight.shadow.camera.near= 0.5;
            // directionalLight.shadow.camera.far= 500;
            // directionalLight.shadow.camera.top= 3;
            // directionalLight.shadow.camera.bottom= -2;
            // directionalLight.shadow.camera.left= -2;
            // directionalLight.shadow.camera.right= 2;
            //灯光跟着物体移动而移动
            directionalLight.target = mesh;
            //directionalLight.angle = Math.PI/10;
            //创建gui
            const gui = new dat.GUI();
            // gui.add(directionalLight.shadow.camera, 'near').min(1).max(25).step(1).name("相机近距离").onChange( () => {
            //     directionalLight.shadow.camera.updateProjectionMatrix();
            // })
            gui.add(mesh.position, 'x').min(-30).max(30).step(1).name("移动位置");
            gui.add(directionalLight, 'angle').min(0).max(Math.PI/2).step(0.1).name("灯光弧度");
            
            //灯光有效距离,默认0表示不衰减
            directionalLight.distance = 0;
            gui.add(directionalLight, 'distance').min(0).max(100).step(1).name("灯光有效距离");
            
            //边缘衰减
            gui.add(directionalLight, 'penumbra').min(0).max(1).step(0.01).name("灯光边缘衰减");
            //灯光强度控制
            directionalLight.decay = 2;
            gui.add(directionalLight, 'decay').min(-5).max(5).step(1).name("灯光边缘衰减");
            //需要渲染器开启物理渲染
            render.physicallyCorrectLights =true;

            //将webgl渲染的canvas内容添加到body上
            document.getElementById("three_div").appendChild(render.domElement);

            //渲染下一帧的时候就会调用回调函数
            let renderFun = () => {
                //更新阻尼数据
                controls.update();
                //需要重新绘制canvas画布
                render.render(scene, camera);
                //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数
                //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果
                window.requestAnimationFrame(renderFun);
            };
            // window.requestAnimationFrame(renderFun);
            renderFun();

            //画布全屏
            window.addEventListener("dblclick", () => {
                if (document.fullscreenElement) {
                    document.exitFullscreen();
                } else {
                    //document.documentElement.requestFullscreen();
                    render.domElement.requestFullscreen();
                }
            });

            //监听画面变化,更新渲染画面,(自适应的大小)
            window.addEventListener("resize", () => {
                //更新摄像机的宽高比
                camera.aspect = window.innerWidth / window.innerHeight;
                //更新摄像机的投影矩阵
                camera.updateProjectionMatrix();
                //更新渲染器宽度和高度
                render.setSize(window.innerWidth, window.innerHeight);
                //设置渲染器的像素比
                render.setPixelRatio(window.devicePixelRatio);
                console.log("画面变化了");
            });
        },
        methods: {
            paush(animate) {
                animate.pause();
            },
        },
    };
</script>

<style scoped lang="scss">
</style>

效果图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pip lanms-neo报错问题

pip lanms-neo报错问题 安装Polygon3的时候&#xff0c;就遇到需要Microsoft Visual C 14.0的问题&#xff0c;以为通过本地whl安装&#xff0c;就能避免。结果&#xff0c;lanms-neo这个库&#xff0c;网上还不好找whl文件&#xff0c;找到的都是csdn里面的付费下载&#xff…

【Java8最优解】P1478 陶陶摘苹果(升级版)

陶陶摘苹果&#xff08;升级版&#xff09; 题目描述 又是一年秋季时&#xff0c;陶陶家的苹果树结了 nnn 个果子。陶陶又跑去摘苹果&#xff0c;这次他有一个 aaa 公分的椅子。当他手够不着时&#xff0c;他会站到椅子上再试试。 这次与 NOIp2005 普及组第一题不同的是&…

HotSpot笔记——共享库操作

共享库操作前言MakefileHotspot的Makefile如何定义需要共享库使用编译选项使用链接器选项dlopendlsym前言 jvm启动时&#xff0c;libjli.so、libjvm.so、libjava.so这些共享库的加载操作&#xff0c;都是c语言的&#xff0c;我们记录一下这些操作函数。 Makefile 以下是一个…

python学习笔记2

使用链接&#xff1a; Python 3 basics - GeeksforGeeks 对应的英文是&#xff1a; 这里联想一下Redis的数据类型: string list set hash zset 列表 有一个细节&#xff0c;可以看到下面的输出里面也带了中括号&#xff1a; 字典 第一行定义的时候是中括号&#xff0c;因为…

文章八:YOLOv5车牌识别系统的Web应用与API开发

在本篇文章中&#xff0c;我们将探讨如何使用YOLOv5车牌识别系统开发一个Web应用&#xff0c;以及如何创建一个车牌识别API供其他开发者使用。我们将介绍Flask框架的基本概念&#xff0c;并实现一个简单的车牌识别Web应用和API。 车牌识别视频Flask框架介绍 Flask是一个轻量级的…

vue-cropper 拖动图片和截图框

现象 开发遇到vue--cropper不能拖动图片和截图框 解决方法 can-move-box设置为true&#xff0c;表示可以拖动截图框 can-move设置为true&#xff0c;表示可以拖动图片 *注意&#xff1a; 我外层套了一个el-col, el-col的宽高一定要大于截图框的宽高&#xff0c;否则移动不了…

网络安全工程师做什么?

​ 网络安全很复杂。数字化转型、远程工作和不断变化的威胁形势需要不同的工具和不同的技能组合。 系统必须到位以保护端点、身份和无边界网络边界。负责处理这种复杂安全基础设施的工作角色是网络安全工程师。 简而言之&#xff0c;网络安全工程师是负责设计和实施组织安全系…

ELK、ELFK企业级日志分析系统

目录 一、ELK简介 1、什么是ELK 2、ELK工作原理及过程​编辑 3、ELK相关名词介绍 ①Elasticsearch介绍 ②Logstash介绍 ③Kibana介绍 ④Fluentd介绍 ⑤Filebeat介绍 二、ELK部署 1、实验环境 2、安装elasticsearch 3、安装logstash ​编辑4、安装kiabana ​编辑…

网站是怎么屏蔽脏话的呢:简单学会SpringBoot项目敏感词、违规词过滤方案

一个社区最重要的就是交流氛围与审查违规&#xff0c;而这两者都少不了对于敏感词进行过滤的自动维护措施。基于这样的措施&#xff0c;我们才能基本保证用户在使用社区的过程中&#xff0c;不至于被敏感违规词汇包围&#xff0c;才能够正常的进行发布帖子和评论&#xff0c;享…

unity3d:asset store上C#代码热重载插件,不需要重运行,重新加载更新后函数

C#热重载插件地址 https://assetstore.unity.com/packages/tools/utilities/hot-reload-edit-code-without-compiling-250972?clickref1011lwHg8abv&utm_sourcepartnerize&utm_mediumaffiliate&utm_campaignunity_affiliate#description 打开热重装有两种方法 …

地库位置复杂如何导航,反向寻车系统解决方案

地库位置复杂如何导航&#xff1f;问路这一行为在迷路时确实比较高效&#xff0c;但是得到的信息往往还是过于碎片和混乱&#xff0c;尤其是在停车场内&#xff0c;通过问路去往目的地既费时又费力。而有了停车场地图&#xff0c;这个问题就迎刃而解了。停车场地图可以帮助驾车…

金山云最新财报的两个历史新高:毛利创新高,亏损创新高

‍数据智能产业创新服务媒体——聚焦数智 改变商业2023年3月29日&#xff0c;中国领先的独立云服务提供商金山云&#xff08;美股代码&#xff1a;KC&#xff09;发布了截至2022年12月31日的四季度财报与年度业绩数据。金山云首席执行官邹涛先生表示&#xff1a;“我们以喜人的…

【IoT】乐鑫WiFI选型指南

目录 1、简介 2、ESP32系列 2.1、ESP32-S2 2.2、ESP32-C3 2.3、ESP32-S3 最近要替换在用的wifi模组&#xff0c;这就涉及到选型。 1、简介 首先来到乐鑫官网&#xff1a;提供 Wi-Fi、蓝牙芯片和 AIoT 解决方案 I 乐鑫科技 可以看到&#xff0c;乐鑫的产品从大的层面分为三…

SpringBoot集成actuator监控服务-自动配置将康检查

前言 SpringBoot监控管理 微服务的特点决定了功能模块的部署是分布式的&#xff0c;大部分功能模块都是运行在不同的机器上&#xff0c;彼此通过服务调用进行交互&#xff0c;前后台的业务流会经过很多个微服务的处理和传递&#xff0c;出现了异常如何快速定位是哪个环节出现了…

算法设计-搜索

一、BFS 模板 ​ 如下所示 set<Node> visited;bool check(Node son);int bfs(Node start) {// initqueue<Node> q;q.push(start);visited.insert(start);while (!q.empty()){Node front q.front();q.pop();for (son : q.neigbour){// pruneif (check(son)){q.pu…

MySQL教程——基础篇

MySQL教程MySQL教程——基础篇MySQL概述关系型数据库数据模型SQLSQL通用语法SQL数据类型SQL分类DDLDMLDQL基本查询条件查询聚合函数分组查询排序查询分页查询案例训练执行顺序DCL用户管理权限控制函数字符串函数数值函数日期函数流程函数约束概述约束演示外键约束添加外键删除外…

【ChatGPT】ChatGPT 能否取代程序员?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言: ChatGPT 的优势 自然语言的生成 文本自动生成 建立了更人性化的人机交互 ChatGPT 的局限性 算法的解释能力较差 程序的可实现性较差 缺乏优化和质量控制 程序员相较于 …

Spring框架核心功能手写实现

文章目录概要Spring启动以及扫描流程实现基础环境搭建扫描逻辑实现bean创建的简单实现依赖注入实现BeanNameAware回调实现初始化机制模拟实现BeanPostProcessor模拟实现AOP模拟实现概要 手写Spring启动以及扫描流程手写getBean流程手写Bean生命周期流程手写依赖注入流程手写Be…

乐鑫 ESP-IoT-Bridge 方案支持设备灵活入网

观看视频了解 ESP-IoT-Bridge 联网方案乐鑫科技推出 ESP-IoT-Bridge 联网方案&#xff0c;能够为物联网应用场景下的 Wi-Fi、蓝牙、Thread、以太网、MCU 等设备&#xff0c;提供便捷的网络服务。 ESP-IoT-Bridge 以乐鑫 SoC 为载体&#xff0c;通过实现各类网络接口&#xff08…

Java文件IO

目录 一. 文件路径 1.1 绝对路径 1.2 相对路径 二 . 文件操作 2.1 File类 2.2 字符流 Reader/Writer 2.3 字节流 InputStream/OutputStream 三. 实现一个文件的搜索功能 一. 文件路径 1.1 绝对路径 从盘符开始&#xff0c;一层一层往下找&#xff0c;得到的路径是绝对路…