Three.js--》实现3d地球模型展示
目录
项目搭建
实现网页简单布局
初始化three.js基础代码
创建环境背景
加载地球模型
实现光柱效果
添加月球模型
今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。
项目搭建
本案例还是借助框架书写three项目,借用vite构建工具搭建vue项目,vite这个构建工具如果有不了解的朋友,可以参考我之前对其讲解的文章:vite脚手架的搭建与使用 。搭建完成之后,用编辑器打开该项目,在终端执行 npm i 安装一下依赖,安装完成之后终端在安装 npm i three 即可。
因为我搭建的是vue3项目,为了便于代码的可读性,所以我将three.js代码单独抽离放在一个组件当中,在App根组件中进入引入该组件。具体如下:
<template><!-- 3D地球 --><CoolEarth></CoolEarth>
</template><script setup>
import CoolEarth from './components/CoolEarth.vue';
</script><style lang="less">*{margin: 0;padding: 0;}
</style>
实现网页简单布局
在HTML布局处进行设置一个loading效果,并通过一个loading.glf动态图使loading效果更加具体,相关代码样式如下:
<template><div class="home"><div class="canvas-container" ref="screenDom"></div><div class="loading" v-if="progress != 100"></div><div class="progress" v-if="progress != 100"><img src="../assets/loading.gif" alt="" /><span>地球加载中:{{ progress }}%</span></div><div class="title">酷炫3D地球</div></div>
</template><style>
body {background-color: #000;
}
.canvas-container {width: 100vw;height: 100vh;
}
.home {width: 100vw;height: 100vh;transform-origin: 0 0;
}
.loading {position: fixed;top: 0;left: 0;width: 1920px;height: 1080px;background-image: url(../assets/loading.jpg);background-size: cover;filter: blur(50px);z-index: 100;
}
.progress {position: fixed;top: 0;left: 0;width: 1920px;height: 1080px;z-index: 101;display: flex;justify-content: center;align-items: center;font-size: 20px;color: #fff;
}
.progress > img {padding: 0 15px;
}.title {width: 380px;height: 40px;position: fixed;right: 100px;top: 50px;background-color: rgba(0, 0, 0, 0.5);line-height: 40px;text-align: center;color: #fff;border-radius: 5px;z-index: 110;
}
</style>
初始化three.js基础代码
three.js开启必须用到的基础代码如下:
导入three库:
import * as THREE from 'three'
初始化场景:
const scene = new THREE.Scene()
初始化相机:
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
camera.position.set(0,50,300)
初始化渲染器:
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth,window.innerHeight)
监听屏幕大小的改变,修改渲染器的宽高和相机的比例:
window.addEventListener("resize",()=>{ renderer.setSize(window.innerWidth,window.innerHeight)camera.aspect = window.innerWidth/window.innerHeightcamera.updateProjectionMatrix()
})
设置渲染函数:
const render = () =>{ controls.update();requestAnimationFrame(render);renderer.render(scene, camera);
}
进行挂载:
onMounted(()=>{// 设置进度THREE.DefaultLoadingManager.onProgress = function (item, loaded, total) {progress.value = new Number((loaded / total) * 100).toFixed(2);};// 将画布添加到页面中screenDom.value.appendChild(renderer.domElement)render()
})
ok,写完基础代码之后,接下来开始具体的Demo实操。
创建环境背景
这里通过TextureLoader加载各种类型的纹理图像,包括JPEG、PNG、GIF等。通过TextureLoader,开发人员可以轻松地将纹理加载到自己的Three.js场景中,从而为场景增加更多的细节和视觉效果。
// 创建星空的背景颜色
scene.background = new THREE.Color(0x030311);
// 加载点材质纹理
const starsTexture = new THREE.TextureLoader().load("./images/stars.png");
const starsMaterial = new THREE.PointsMaterial({size: 2,sizeAttenuation: true, // 尺寸衰减color: 0x4d76cf,transparent: true,opacity: 1,map: starsTexture,
});
接下来通过点材质创建星空效果,setAttribute方法可以用于向这些BufferAttribute对象中设置顶点属性数据,BufferAttribute是在Three.js等WebGL引擎中用于描述几何体或粒子的渲染数据结构,也是WebGL中顶点缓存对象(VBO)中存储顶点数据的方式之一:
// 使用点材质创建星空效果
const vertices = [];
for (let i = 0; i < 500; i++) {const vertex = new THREE.Vector3();vertex.x = 800 * Math.random() - 400;vertex.y = 800 * Math.random() - 400;vertex.z = 800 * Math.random() - 400;vertices.push(vertex.x, vertex.y, vertex.z);
}// 星空效果
let starsGeometry = new THREE.BufferGeometry();
starsGeometry.setAttribute("position",new THREE.BufferAttribute(new Float32Array(vertices), 3)
);
let stars = new THREE.Points(starsGeometry, starsMaterial);
scene.add(stars);

加载地球模型
接下来依然通过TextureLoader加载各种类型的纹理图像:
// 创建地球
let earthGeometry = new THREE.SphereGeometry(50, 32, 32);
let earthTexture = new THREE.TextureLoader().load("./images/map.jpg");
let earthMaterial = new THREE.MeshBasicMaterial({map: earthTexture,});
let earth = new THREE.Mesh(earthGeometry, earthMaterial);
scene.add(earth);

接下来在原有地球的基础上再加一层发光球体的壳,使地球更具有美感:
// 发光地球
let lightTexture = new THREE.TextureLoader().load("./images/earth.jpg");
let lightEarthGeometry = new THREE.SphereGeometry(53, 32, 32);
let lightEarthMaterial = new THREE.MeshBasicMaterial({map: lightTexture,alphaMap: lightTexture,blending: THREE.AdditiveBlending,transparent: true,
});
let lightEarth = new THREE.Mesh(lightEarthGeometry, lightEarthMaterial);
scene.add(lightEarth);

接下来通过 Sprite 将Sprite 对象图像资源打包在一张贴图上,然后在需要渲染Sprite 的时候使用不同的纹理坐标选取对应的图像片段进行绘制。
// 添加地球内外发光精灵
let spriteTexture = new THREE.TextureLoader().load("./images/glow.png");
let spriteMaterial = new THREE.SpriteMaterial({map: spriteTexture,color: 0x4d76cf,transparent: true,depthWrite: false,depthTest: false,blending: THREE.AdditiveBlending,
});
let sprite = new THREE.Sprite(spriteMaterial);
sprite.scale.set(155, 155, 0);
scene.add(sprite);

接下来接着使用该函数使其内发光:
// 内发光
let spriteTexture1 = new THREE.TextureLoader().load("./images/innerGlow.png");
let spriteMaterial1 = new THREE.SpriteMaterial({map: spriteTexture1,color: 0x4d76cf,transparent: true,depthWrite: false,depthTest: false,blending: THREE.AdditiveBlending,
});
let sprite1 = new THREE.Sprite(spriteMaterial1);
sprite1.scale.set(128, 128, 0);
scene.add(sprite1);
let scale = new THREE.Vector3(1, 1, 1);

实现光柱效果
通过for循环实现30个光柱效果的展示,这里依然通过TextureLoader加载各种类型的纹理图像:
for (let i = 0; i < 30; i++) {// 实现光柱let lightPillarTexture = new THREE.TextureLoader().load("./images/light_column.png");let lightPillarGeometry = new THREE.PlaneGeometry(3, 20);let lightPillarMaterial = new THREE.MeshBasicMaterial({color: 0xffffff,map: lightPillarTexture,alphaMap: lightPillarTexture,transparent: true,blending: THREE.AdditiveBlending,side: THREE.DoubleSide,depthWrite: false,});let lightPillar = new THREE.Mesh(lightPillarGeometry, lightPillarMaterial);lightPillar.add(lightPillar.clone().rotateY(Math.PI / 2));// 设置光柱的位置let lat = Math.random() * 180 - 90;let lon = Math.random() * 360 - 180;let position = lon2xyz(60, lon, lat);lightPillar.position.set(position.x, position.y, position.z);lightPillar.quaternion.setFromUnitVectors(new THREE.Vector3(0, 1, 0),position.clone().normalize());scene.add(lightPillar);
}

接下来利用贴图给地球的每个光柱添加光圈效果,这里利用gsap动画库实现:
// 创建波纹扩散效果
let circlePlane = new THREE.PlaneGeometry(6, 6);
let circleTexture = new THREE.TextureLoader().load("./images/label.png");
let circleMaterial = new THREE.MeshBasicMaterial({color: 0xffffff,map: circleTexture,transparent: true,blending: THREE.AdditiveBlending,depthWrite: false,side: THREE.DoubleSide,
});
let circleMesh = new THREE.Mesh(circlePlane, circleMaterial);
circleMesh.rotation.x = -Math.PI / 2;
circleMesh.position.set(0, -7, 0);lightPillar.add(circleMesh);gsap.to(circleMesh.scale, {duration: 1 + Math.random() * 0.5,x: 2,y: 2,z: 2,repeat: -1,delay: Math.random() * 0.5,yoyo: true,ease: "power2.inOut",
});

添加月球模型
接下来依然通过TextureLoader加载各种类型的纹理图像:
// 绕地球运行的月球
let moonTexture = new THREE.TextureLoader().load("./images/moon.jpg");
let moonMaterial = new THREE.MeshStandardMaterial({map: moonTexture,emissive: 0xffffff,emissiveMap: moonTexture,
});
let moonGeometry = new THREE.SphereGeometry(5, 32, 32);
let moon = new THREE.Mesh(moonGeometry, moonMaterial);
moon.position.set(150, 0, 0);
scene.add(moon);

接下来实现月球环模型:
// 创建月球环
let moonRingTexture = new THREE.TextureLoader().load("./images/moon_ring.png");
let moonRingMaterial = new THREE.MeshBasicMaterial({map: moonRingTexture,transparent: true,blending: THREE.AdditiveBlending,side: THREE.DoubleSide,depthWrite: false,opacity: 0.5,
});
let moonRingGeometry = new THREE.RingGeometry(145, 155, 64);
let moonRing = new THREE.Mesh(moonRingGeometry, moonRingMaterial);
moonRing.rotation.x = -Math.PI / 2;
scene.add(moonRing);

接下来通过gsap动画库当月球顺时针绕地球无限匀速旋转运动下去:
let time = {value: 0,
};
gsap.to(time, {value: 1,duration: 10,repeat: -1,ease: "linear",onUpdate: () => {moon.position.x = 150 * Math.cos(time.value * Math.PI * 2);moon.position.z = 150 * Math.sin(time.value * Math.PI * 2);moon.rotation.y = time.value * Math.PI * 8;},
});

效果完成之后,我们在一开始设置的挂载时显示进度也就有效果了,如下:

demo做完,给出本案例的完整代码:(获取素材也可以私信博主)
<template><div class="home"><div class="canvas-container" ref="screenDom"></div><div class="loading" v-if="progress != 100"></div><div class="progress" v-if="progress != 100"><img src="../assets/loading.gif" alt="" /><span>地球加载中:{{ progress }}%</span></div><div class="title">酷炫3D地球</div></div>
</template><script setup>
import * as THREE from 'three'
import { ref,onMounted } from 'vue'
import { gsap } from 'gsap'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'let screenDom = ref(null)
let progress = ref(0);// 经纬度转换函数
const lon2xyz = (R,longitude,latitude) =>{ let lon = ( longitude * Math.PI ) / 180 // 转弧度值const lat = (latitude * Math.PI) / 180 // 转弧度值lon = -lon // js坐标系z坐标轴对应经度-90度,而不是90度// 经纬度坐标转球面坐标计算公式const x = R * Math.cos(lat) * Math.cos(lon)const y = R * Math.sin(lat)const z = R * Math.cos(lat) * Math.sin(lon)// 返回球面坐标return new THREE.Vector3(x,y,z)
}
// 创建场景
const scene = new THREE.Scene()
// 创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
camera.position.set(0,50,300)
// 创建渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(window.innerWidth,window.innerHeight)// 创建控制器
const controls = new OrbitControls(camera,renderer.domElement)
controls.autoRotate = truewindow.addEventListener("resize",()=>{ renderer.setSize(window.innerWidth,window.innerHeight)camera.aspect = window.innerWidth/window.innerHeightcamera.updateProjectionMatrix()
})// 创建渲染函数
const render = () =>{ controls.update();requestAnimationFrame(render);renderer.render(scene, camera);
}onMounted(()=>{// 设置进度THREE.DefaultLoadingManager.onProgress = function (item, loaded, total) {progress.value = new Number((loaded / total) * 100).toFixed(2);};// 将画布添加到页面中screenDom.value.appendChild(renderer.domElement)render()
})// 创建星空的背景颜色
scene.background = new THREE.Color(0x030311);
// 加载点材质纹理
const starsTexture = new THREE.TextureLoader().load("./images/stars.png");
const starsMaterial = new THREE.PointsMaterial({size: 2,sizeAttenuation: true, // 尺寸衰减color: 0x4d76cf,transparent: true,opacity: 1,map: starsTexture,
});// 使用点材质创建星空效果
const vertices = [];
for (let i = 0; i < 500; i++) {const vertex = new THREE.Vector3();vertex.x = 800 * Math.random() - 400;vertex.y = 800 * Math.random() - 400;vertex.z = 800 * Math.random() - 400;vertices.push(vertex.x, vertex.y, vertex.z);
}// 星空效果
let starsGeometry = new THREE.BufferGeometry();
starsGeometry.setAttribute("position",new THREE.BufferAttribute(new Float32Array(vertices), 3)
);
let stars = new THREE.Points(starsGeometry, starsMaterial);
scene.add(stars);// 创建地球
let earthGeometry = new THREE.SphereGeometry(50, 32, 32);
let earthTexture = new THREE.TextureLoader().load("./images/map.jpg");
let earthMaterial = new THREE.MeshBasicMaterial({map: earthTexture,});
let earth = new THREE.Mesh(earthGeometry, earthMaterial);
scene.add(earth);// 发光地球
let lightTexture = new THREE.TextureLoader().load("./images/earth.jpg");
let lightEarthGeometry = new THREE.SphereGeometry(53, 32, 32);
let lightEarthMaterial = new THREE.MeshBasicMaterial({map: lightTexture,alphaMap: lightTexture,blending: THREE.AdditiveBlending,transparent: true,
});
let lightEarth = new THREE.Mesh(lightEarthGeometry, lightEarthMaterial);
scene.add(lightEarth);// 添加地球内外发光精灵
let spriteTexture = new THREE.TextureLoader().load("./images/glow.png");
let spriteMaterial = new THREE.SpriteMaterial({map: spriteTexture,color: 0x4d76cf,transparent: true,depthWrite: false,depthTest: false,blending: THREE.AdditiveBlending,
});
let sprite = new THREE.Sprite(spriteMaterial);
sprite.scale.set(155, 155, 0);
scene.add(sprite);// 内发光
let spriteTexture1 = new THREE.TextureLoader().load("./images/innerGlow.png");
let spriteMaterial1 = new THREE.SpriteMaterial({map: spriteTexture1,color: 0x4d76cf,transparent: true,depthWrite: false,depthTest: false,blending: THREE.AdditiveBlending,
});
let sprite1 = new THREE.Sprite(spriteMaterial1);
sprite1.scale.set(128, 128, 0);
scene.add(sprite1);
let scale = new THREE.Vector3(1, 1, 1);for (let i = 0; i < 30; i++) {// 实现光柱let lightPillarTexture = new THREE.TextureLoader().load("./images/light_column.png");let lightPillarGeometry = new THREE.PlaneGeometry(3, 20);let lightPillarMaterial = new THREE.MeshBasicMaterial({color: 0xffffff,map: lightPillarTexture,alphaMap: lightPillarTexture,transparent: true,blending: THREE.AdditiveBlending,side: THREE.DoubleSide,depthWrite: false,});let lightPillar = new THREE.Mesh(lightPillarGeometry, lightPillarMaterial);lightPillar.add(lightPillar.clone().rotateY(Math.PI / 2));// 设置光柱的位置let lat = Math.random() * 180 - 90;let lon = Math.random() * 360 - 180;let position = lon2xyz(60, lon, lat);lightPillar.position.set(position.x, position.y, position.z);lightPillar.quaternion.setFromUnitVectors(new THREE.Vector3(0, 1, 0),position.clone().normalize());scene.add(lightPillar);// 创建波纹扩散效果let circlePlane = new THREE.PlaneGeometry(6, 6);let circleTexture = new THREE.TextureLoader().load("./images/label.png");let circleMaterial = new THREE.MeshBasicMaterial({color: 0xffffff,map: circleTexture,transparent: true,blending: THREE.AdditiveBlending,depthWrite: false,side: THREE.DoubleSide,});let circleMesh = new THREE.Mesh(circlePlane, circleMaterial);circleMesh.rotation.x = -Math.PI / 2;circleMesh.position.set(0, -7, 0);lightPillar.add(circleMesh);gsap.to(circleMesh.scale, {duration: 1 + Math.random() * 0.5,x: 2,y: 2,z: 2,repeat: -1,delay: Math.random() * 0.5,yoyo: true,ease: "power2.inOut",});
}// 绕地球运行的月球
let moonTexture = new THREE.TextureLoader().load("./images/moon.jpg");
let moonMaterial = new THREE.MeshStandardMaterial({map: moonTexture,emissive: 0xffffff,emissiveMap: moonTexture,
});
let moonGeometry = new THREE.SphereGeometry(5, 32, 32);
let moon = new THREE.Mesh(moonGeometry, moonMaterial);
moon.position.set(150, 0, 0);
scene.add(moon);// 创建月球环
let moonRingTexture = new THREE.TextureLoader().load("./images/moon_ring.png");
let moonRingMaterial = new THREE.MeshBasicMaterial({map: moonRingTexture,transparent: true,blending: THREE.AdditiveBlending,side: THREE.DoubleSide,depthWrite: false,opacity: 0.5,
});
let moonRingGeometry = new THREE.RingGeometry(145, 155, 64);
let moonRing = new THREE.Mesh(moonRingGeometry, moonRingMaterial);
moonRing.rotation.x = -Math.PI / 2;
scene.add(moonRing);let time = {value: 0,
};
gsap.to(time, {value: 1,duration: 10,repeat: -1,ease: "linear",onUpdate: () => {moon.position.x = 150 * Math.cos(time.value * Math.PI * 2);moon.position.z = 150 * Math.sin(time.value * Math.PI * 2);moon.rotation.y = time.value * Math.PI * 8;},
});</script><style>
body {background-color: #000;
}
.canvas-container {width: 100vw;height: 100vh;
}
.home {width: 100vw;height: 100vh;transform-origin: 0 0;
}
.loading {position: fixed;top: 0;left: 0;width: 1920px;height: 1080px;background-image: url(../assets/loading.jpg);background-size: cover;filter: blur(50px);z-index: 100;
}
.progress {position: fixed;top: 0;left: 0;width: 1920px;height: 1080px;z-index: 101;display: flex;justify-content: center;align-items: center;font-size: 20px;color: #fff;
}
.progress > img {padding: 0 15px;
}.title {width: 380px;height: 40px;position: fixed;right: 100px;top: 50px;background-color: rgba(0, 0, 0, 0.5);line-height: 40px;text-align: center;color: #fff;border-radius: 5px;z-index: 110;
}
</style>相关文章:
Three.js--》实现3d地球模型展示
目录 项目搭建 实现网页简单布局 初始化three.js基础代码 创建环境背景 加载地球模型 实现光柱效果 添加月球模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多…...
<SQL>《SQL命令(含例句)精心整理版(6)》
《SQL命令(含例句)精心整理版(6)》 18 DB2查询语句18.1 查询数据库大小18.2 查看表占表空间大小18.3 查看正在执行的语句18.4 db2expln 查看执行计划18.5 db2advis 查看优化建议 19 空值19.1 NULL19.2 TRIM 18 DB2查询语句 18.1 …...
信息系统建设和服务能力评估证书CS
信息系统建设和服务能力评估体系CS简介 简介:本标准(团标T/CITIF 001-2019)是信息系统建设和服务能力评估体系系列标准的第一个,提出了对信息系统建设和服务提供者的综合能力要求。 发证单位:中国电子信息行业联合会。…...
vue3引入路由
1.首先在项目中安装路由 npm install vue-router -S 2.src文件夹下新建》views文件夹》新建home文件夹》新建Home.vue文件 在src文件夹下》新建router文件夹》新建index.js import { createRouter,createWebHashHistory } from vue-router const route s[ { path:/, compo…...
前后端联调跨域问题
文章目录 什么是同源策略如何判断是否同源?跨域资源共享(CORS)如何解决跨域问题 什么是同源策略 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。 如何判断是否同源? 如果…...
day11 - 手写数字笔迹细化
手写数字笔迹细化 对于手写数字识别实验中,经常会遇到因为笔迹较粗导致误识别的情况,所以我们通常会先将笔迹进行细化,笔迹变细以后,数字的特征会更明显,后续进行识别的准确率就会更高。 例如数字7 和 1 ,…...
C++ QT QDBus基操
以下是使用QDBus进行跨进程通信的具体用法: 1. 创建DBus服务 在服务端进程中,需要创建一个DBus服务,并注册DBus对象。示例代码如下: #include <QDBusConnection> #include <QDBusMessage> #include <QDBusInterf…...
STM32的SPI外设
文章目录 1. STM32 的 SPI 外设简介2. STM32 的 SPI 架构剖析2.1 通讯引脚2.2 时钟控制逻辑2.3 数据控制逻辑2.4 整体控制逻辑 3. 通讯过程4. SPI 初始化结构体详解 1. STM32 的 SPI 外设简介 STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 …...
VMWare ESXI6.7创建虚拟机
VMware ESXi:专门构建的裸机 管理程序 首先开启ESXI主机 登录ESXI 打开浏览器输入物理机ip,输入账号密码进行登录 创建虚拟机 选择创建类型 创建RedHat7.6 选择存储类型和数据存储 仅一个存储,直接点下一页即可 配置虚拟机硬件和虚拟机附…...
TensorFlow 1.x学习(系列二 :4):自实现线性回归
目录 线性回归基本介绍常用的op自实现线性回归预测tensorflow 变量作用域模型的保存和加载 线性回归基本介绍 线性回归: w 1 ∗ x 1 w 2 ∗ x 2 w 3 ∗ x 3 . . . w n ∗ x n b i a s w_1 * x_1 w_2 * x_2 w_3 * x_3 ... w_n * x_n bias w1∗x1w2∗…...
Openwrt折腾记6-网络摄像头
前言: 前几天买了个电视机上的摄像头,但是估计是电视配置或软件不好,视频通话太卡顿。今天把它装的极路由4的usb上了。由于当初挑的是电视免驱的,所以我猜想是通用的芯片。 调查驱动 LINUX uvc支持型号的列表里 http://www.ide…...
C++判断大端小端
C判断大端小端 1. 基础知识 大端小端其实表示的是数据在存储器中的存放顺序。 大端模式:数据的高字节存放在内存的低地址中,而低字节则存放在高地址中。地址由小到大增加,数据则从高位向低位存放,这种存放方式符合人类的正常思维…...
K8S RBAC之Kubeconfig设置用户权限,不同的用户访问不同的namespace
1.CA签发客户端证书 检查证书是否存在 # ll /etc/kubernetes/pki/ 总用量 48K -rw-r----- 1 kube root 2.1K 3月 2 16:44 apiserver.crt -rw------- 1 kube root 1.7K 3月 2 16:44 apiserver.key -rw-r----- 1 kube root 1.2K 3月 2 16:44 apiserver-kubelet-client.cr…...
CodeForces..学习读书吧.[简单].[条件判断].[找最小值]
题目描述: 题目解读: 给定一组数,分别是 “时间 内容”,内容分为00,01,10,11四种,求能够得到11的最小时间。 解题思路: 看似00,01,10࿰…...
灵活使用Postman环境变量和全局变量,提高接口测试效率!
目录 前言: 环境变量和全局变量的概念 环境变量和全局变量的使用方法 1. 定义变量 2. 使用变量 环境变量和全局变量的实例代码 变量的继承和覆盖 变量的动态设置 总结: 前言: Postman是一个流行的API开发和接口测试工具,…...
Springboot+Vue3 整合海康获取视频流并展示
目录 1.后端 1.1 导入依赖 1.2 代码实战 2.前端 2.1 首先安装海康的web插件,前端vue3代码如下: 1.后端 1.1 导入依赖 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId&g…...
Linux——进程退出
目录 一.进程退出时有三种选择: 1.1 echo $?命令: 功能: 打印距离现在最近一次执行某进程的退出码 例2代码: 例3: 例4代码: 1.3 进程运行过程中可能会出现的错误种类: 二.总结ÿ…...
组长给组员派活,把组长自己的需求和要改的bug派给组员,合理吗?
组长把自己的工作派给手下,合理吗? 一位程序员问: 组长给他派活,把组长自己的需求或者要改的bug派给他。组长分派完需求之后,他一个人干两个项目,组长却无所事事,这样合理吗? 有人说…...
Spring注解开发——bean的作用范围与生命周期管理
文章目录 1.bean管理1.1 bean作用范围Scope注解 1.2 bean生命周期PostConstructPreDestroy 2.小结 1.bean管理 1.1 bean作用范围 Scope注解 不写或者添加Scope(“singleton”)表示的是单例 如何配置多例? 在Scope(“prototype”)表示的是多例 1.2 bean生命周…...
C++ > Cmake
目录 编译器 多文件编译与链接 Makefile构建系统 编译器 厂商 C C GNU gcc g main.cpp #include <cstdio>int main() {printf("Hello, world!\n");return 0; }编译器, 是一个根据源代码生成机器码的程序 g main.cpp -o a.out调用编译器程序g, 读…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
