当前位置: 首页 > news >正文

Cesium实现雨、闪电、雪、雾天气效果

 基于 Cesium 的三维地理信息场景,集成了天气效果后处理、3D 模型加载、水域渲染等功能。以下是详细功能总结:


1. 场景初始化与基础配置

  • 三维地球初始化
    创建 Cesium Viewer 实例,隐藏默认控件(时间轴、动画控件等),启用抗锯齿(FXAA)。

  • 地图服务
    使用腾讯影像服务作为底图,支持 WGS84 坐标系。

  • 3D 模型加载
    加载本地 3D Tiles 建筑模型(tileset.json),并在加载完成后自动定位到模型。


2. 水域效果

  • GeoJSON 数据加载
    从 water.json 加载水域多边形数据,使用 Primitive 和 Material 创建水面。

  • 动态水面材质
    应用 Cesium.Material.WaterType 材质,配置波浪参数(频率、振幅、法线贴图),实现动态水面效果。


3. 天气后处理特效

通过 PostProcessStage 添加可交互的天气效果,利用 GLSL 着色器实现视觉特效:

🌧️ 降雨效果 (rain.glsl)
  • 倾斜雨滴
    通过旋转 UV 坐标模拟雨滴倾斜下落,结合噪声生成随机雨线。

  • 闪电模拟
    使用 Perlin 噪声生成闪电路径,计算辉光效果和光照强度。

  • 参数控制
    GUI 可调雨速 (rainSpeed)、雨滴大小 (rainSize),通过混合率控制雨幕透明度。

❄️ 降雪效果 (snow.glsl)
  • 多层次雪花
    分层生成不同大小和速度的雪花,利用随机函数和细胞噪声分布雪花位置。

  • 飘动效果
    正弦函数模拟雪花飘动轨迹,调整密度和渐变增强层次感。

🌫️ 雾效 (fog.glsl)
  • 深度计算
    从深度纹理获取片元到相机的距离,结合近/远平面参数计算雾化因子。

  • 颜色混合
    线性插值混合场景颜色与雾颜色,模拟距离渐变的雾效。

  • 交互参数
    GUI 可调雾颜色 (fogColor)、近距 (near)、远距 (far)。


4. 交互控制

  • dat.GUI 面板
    提供可视化控件,动态开关雨、雪、雾效果,调整参数(如雨速、雾范围等)。

  • 实时更新
    修改参数时,通过 uniforms 实时更新着色器变量,无需重新加载场景。


5. 技术亮点

  • 后处理管线
    将天气效果作为后处理阶段叠加到场景,不影响原始渲染流程。

  • 着色器优化
    使用噪声函数、深度纹理和几何计算高效模拟自然现象。

  • 模块化设计
    各天气效果独立封装,便于扩展和维护。


效果展示

  • :动态雨幕 + 随机闪电,参数可调雨滴密度和速度。

  • :多层次雪花飘落,模拟自然随机分布。

  • :基于距离的雾效,增强场景深度感和氛围。


应用场景

适用于三维地理可视化、模拟训练、游戏开发等需要动态天气交互的场景,提升环境真实感和用户体验。

 具体实现

src/shader/rain.glsl
// 声明颜色纹理(当前屏幕渲染内容)
uniform sampler2D colorTexture;
// 控制雨速的变量(由外部传入)
uniform float rainSpeed; 
// 控制雨滴大小的变量(由外部传入)
uniform float rainSize;
// 当前像素的纹理坐标(范围0.0~1.0)
varying vec2 v_textureCoordinates;// 生成伪随机数的哈希函数(输入数字返回0~1之间的随机值)
float hash(float x) {return fract(sin(x * 133.3) * 13.13); // 通过正弦函数生成随机数,取小数部分
}// 另一种伪随机数生成方法(不同种子)
float rand(float x) {return fract(sin(x) * 75154.32912); // fract取小数部分保证结果在0~1
}// 三维随机数生成(输入三维坐标返回0~1的随机值)
float rand3d(vec3 x) {return fract(375.10297 * sin(dot(x, vec3(103.0139, 227.0595, 31.05914))));
}// 一维噪声生成(在整数点之间插值)
float noise(float x) {float i = floor(x); // 取整数部分float a = rand(i), b = rand(i + 1.); // 获取相邻整数点的随机值float f = x - i; // 小数部分作为插值系数return mix(a, b, f); // 线性插值得到平滑噪声
}// 一维Perlin噪声(分形噪声叠加)
float perlin(float x) {float r = 0., s = 1., w = 1.;for(int i = 0; i < 6; i++) { // 叠加6层不同频率的噪声s *= 2.0; // 频率倍增(更细的细节)w *= 0.5; // 振幅减半(高层细节影响更小)r += w * noise(s * x); // 累加各层噪声}return r;
}// 三维噪声生成(在3D网格点之间插值)
float noise3d(vec3 x) {vec3 i = floor(x); // 三维网格整数坐标// 获取8个相邻网格点的随机值float i000 = rand3d(i + vec3(0., 0., 0.));float i001 = rand3d(i + vec3(0., 0., 1.));float i010 = rand3d(i + vec3(0., 1., 0.));float i011 = rand3d(i + vec3(0., 1., 1.));float i100 = rand3d(i + vec3(1., 0., 0.));float i101 = rand3d(i + vec3(1., 0., 1.));float i110 = rand3d(i + vec3(1., 1., 0.));float i111 = rand3d(i + vec3(1., 1., 1.));vec3 f = x - i; // 小数部分作为插值系数// 三维线性插值过程return mix(mix(mix(i000, i001, f.z), // Z方向插值mix(i010, i011, f.z),f.y                   // Y方向插值),mix(mix(i100, i101, f.z),mix(i110, i111, f.z),f.y),f.x                       // X方向插值);
}// 三维Perlin噪声(分形叠加)
float perlin3d(vec3 x) {float r = 0.0;float w = 1.0, s = 1.0;for(int i = 0; i < 5; i++) { // 叠加5层噪声w *= 0.5;   // 振幅递减s *= 2.0;   // 频率递增r += w * noise3d(s * x); // 累加各层噪声}return r;
}// 生成闪电路径的形状(基于Perlin噪声)
float f(float y) {float w = 0.4; // 路径基础宽度return w * (perlin(2. * y) - 0.5); // 使用噪声制造路径扭曲
}// 绘制闪电路径的核心函数
float plot(vec2 p, float d, bool thicker) {if(thicker)// 增加路径厚度:计算垂直方向的变化率d += 5. * abs(f(p.y + 0.001) - f(p.y));// 使用smoothstep生成平滑过渡的边缘return smoothstep(d, 0., abs(f(p.y) - p.x));
}// 渲染闪电效果的核心函数
vec3 render(vec2 uv) {// 计算基于帧数的时间(120帧对应1秒)float iTime = czm_frameNumber / 120.;float x = iTime + 0.1; // 时间推进// 闪电参数设置float m = 0.25; // 闪电单次持续时间上限float i = floor(x / m); // 计算当前是第几次闪电float f = x / m - i;    // 当前次闪电的进度(0~1)float k = 0.4;          // 闪电发生频率阈值float n = noise(i);     // 随机决定是否触发闪电float t = ceil(n - k);  // 是否满足触发条件(0或1)float d = max(0., n - k) / (1. - k); // 计算可见持续时间float o = ceil(t - f - (1. - d));    // 判断当前是否在可见时间段// 闪电效果计算float lightning = 0.0;if(o == 1.) { // 如果当前需要显示闪电vec2 uv2 = uv;uv2.y += i * 2.;    // 纵向偏移生成不同形态float p = (noise(i + 10.) - 0.5) * 2.; // 随机横向位置uv2.x -= p;         // 应用横向偏移// 计算三种不同宽度的闪电效果float strike = plot(uv2, 0.01, true);  // 核心闪电float glow = plot(uv2, 0.04, false);   // 内层辉光float glow2 = plot(uv2, 1.5, false);   // 外层辉光// 组合效果lightning = strike * 0.4 + glow * 0.15; lightning += glow2 * 0.3; // 添加外层辉光// 根据高度渐隐float h = noise(i + 5.); // 随机高度参数lightning *= smoothstep(h, h + 0.05, uv.y + perlin(1.2 * uv.x + 4. * h) * 0.03);}return vec3(lightning); // 返回闪电颜色
}void main() {// 计算时间(帧数转秒,并应用雨速系数)float time = (czm_frameNumber / 60.0) * rainSpeed;// 获取屏幕分辨率(czm_viewport.zw存储宽高)vec2 resolution = czm_viewport.zw;// 将像素坐标转换为标准化坐标(-1~1范围)vec2 uv = (gl_FragCoord.xy * 2. - resolution.xy) / min(resolution.x, resolution.y);uv *= rainSize; // 应用雨滴大小参数vec3 c = vec3(.6, .7, .8); // 基础雨滴颜色(青蓝色)// 创建旋转矩阵(使雨滴倾斜)float angle = -0.5; // 倾斜角度float sinA = sin(angle), cosA = cos(angle);uv *= mat2(cosA, -sinA, sinA, cosA); // 应用旋转// 生成雨滴图案float v = 1. - sin(hash(floor(uv.x * 400.)) * 400.); // 纵向条纹float b = clamp(abs(sin(15. * time * v + uv.y * 5.)) - 0.95, 0., 1.) * 4.;c *= v * b; // 组合得到雨滴颜色// 获取原始场景颜色vec4 picCol = texture2D(colorTexture, v_textureCoordinates);// 计算闪电效果vec2 thunderUV = gl_FragCoord.xy / resolution.xy; // 标准化坐标thunderUV.x = 2. * thunderUV.x - 1.;              // 转换到-1~1范围thunderUV.x *= resolution.x / resolution.y;       // 修正宽高比vec3 thunder = render(thunderUV);                 // 生成闪电颜色// 最终颜色混合(50%透明度混合雨幕,叠加闪电)gl_FragColor = mix(picCol, vec4(c, 1.), 0.5) + vec4(thunder, 1.);
}
shader/snow.glsl
// 声明颜色纹理(当前屏幕渲染内容)
uniform sampler2D colorTexture;
// 当前像素的纹理坐标(范围0.0~1.0)
varying vec2 v_textureCoordinates;void main() {float snow = 0.0; // 存储雪花强度的变量// 获取屏幕分辨率(czm_viewport.zw存储画布的像素宽高)vec2 iResolution = czm_viewport.zw;// 计算时间(帧数转秒,60帧对应1秒)float iTime = czm_frameNumber / 60.0;// 创建纵向渐变效果(屏幕上方更亮)float gradient = (1.0 - gl_FragCoord.y / iResolution.x) * 0.4;// 生成基于像素坐标的随机数(用于雪花细节)float random = fract(sin(dot(gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453);// 外层循环:生成6种不同形态的雪花for(int k = 0; k < 6; k++) {// 内层循环:每层生成12组雪花for(int i = 0; i < 12; i++) {// 计算当前雪花的单元格大小(基础2.0,每层增加3.0)float cellSize = 2.0 + float(i) * 3.0;// 计算下落速度(基础0.3,叠加正弦波动)float downSpeed = 0.3 + (sin(iTime*0.4 + float(k+i*20)) + 1.0) * 0.00008;// 计算UV坐标(标准化到0~1范围)vec2 uv = gl_FragCoord.xy / iResolution.x;// 添加横向飘动效果(用正弦函数制造左右摆动)uv.x += 0.01 * sin(iTime*0.6 + float(k*6185) + float(i)) * (5.0/float(i));// 添加纵向下落效果(随时间向下移动)uv.y += downSpeed * (iTime + float(k*1352)) * (1.0/float(i));uv *= 2.0; // 增加UV密度(使雪花更密集)// 将UV坐标离散化为网格(每个雪花对应一个网格)vec2 uvStep = ceil(uv * cellSize - vec2(0.5)) / cellSize;// 生成基于网格坐标的随机偏移量(模拟雪花位置变化)float x = fract(sin(dot(uvStep, vec2(12.9898+float(k)*12.0, 78.233+float(k)*315.156)))* 43758.5453 + float(k)*12.0) - 0.5;float y = fract(sin(dot(uvStep, vec2(62.2364+float(k)*23.0, 94.674+float(k)*95.0)))* 62159.8432 + float(k)*12.0) - 0.5;// 计算随机运动幅度(随时间变化)float randomMagnitude1 = sin(iTime*2.5) * 0.7 / cellSize;float randomMagnitude2 = cos(iTime*2.5) * 0.7 / cellSize;// 计算当前像素到雪花中心的距离vec2 snowPos = uvStep.xy + vec2(x*sin(y), y)*randomMagnitude1 + vec2(y, x)*randomMagnitude2;float d = 5.0 * distance(snowPos, uv.xy);// 生成遮挡判断值(决定是否绘制雪花)float omiVal = fract(sin(dot(uvStep, vec2(32.4691, 94.615))) * 31572.1684);// 仅8%的像素生成雪花(稀疏分布)if(omiVal < 0.08) {// 计算雪花强度(距离越近强度越高)float newd = (x + 1.0) * 0.4 * clamp(1.9 - d*(15.0+x*6.3)*(cellSize/1.4), 0.0, 1.0);snow += newd; // 累加到总雪量}}}// 获取原始场景颜色vec4 picColor = texture2D(colorTexture, v_textureCoordinates);// 生成最终雪颜色(叠加随机噪点)vec4 snowColor = vec4(snow) + random * 0.01;// 混合原始画面和雪效果(50%混合比例)gl_FragColor = mix(picColor, snowColor, 0.5);
}
shader/fog.glsl
// 声明颜色纹理(存储当前屏幕渲染的画面)
uniform sampler2D colorTexture;
// 当前像素的纹理坐标(范围0.0~1.0)
varying vec2 v_textureCoordinates;
// 声明深度纹理(存储每个像素的深度值)
uniform sampler2D depthTexture;
// 雾的颜色(由外部传入,格式RGB)
uniform vec3 u_fogColor;
// 雾效开始的距离(离相机多近开始起雾)
uniform float u_far;
// 雾效结束的距离(离相机多远完全被雾遮盖)
uniform float u_near;// 计算当前像素到相机的距离
float calFragDistance(){// 从深度纹理获取当前像素的深度颜色值(RGBA格式存储的深度信息)vec4 depthColor = texture2D(depthTexture, v_textureCoordinates);// 将深度颜色值转换为实际深度值(0.0~1.0,0=最近,1=最远)float depth = czm_unpackDepth(depthColor); // Cesium内置解压深度方法// 将屏幕坐标转换为相机坐标系坐标(得到三维空间中的位置)// gl_FragCoord.xy是当前像素在屏幕的位置(如(512,512))// 返回的eyeCoordinates是相机坐标系下的坐标(x,y,z,w)vec4 eyeCoordinates = czm_windowToEyeCoordinates(gl_FragCoord.xy, depth);// (注释说明用,实际未使用)将相机坐标转换为世界坐标的示例// vec4 worldPosition = czm_inverseView * eyeCoordinates;// 计算实际距离:相机坐标系中z轴方向的距离(负号因为相机看向-z方向)// eyeCoordinates.w 用于处理透视投影的齐次坐标return -eyeCoordinates.z / eyeCoordinates.w; // 得到实际物理距离
}// 计算雾化强度(0.0=无雾,1.0=完全被雾遮盖)
float calFogRate(float fragDistance){// 线性雾化公式:(当前距离-雾开始距离)/(雾结束距离-雾开始距离)// clamp限制结果在0.0~1.0之间return clamp((fragDistance - u_near) / (u_far - u_near), 0.0, 1.0);
}// 主函数:处理每个像素的颜色
void main(){// 步骤1:计算当前像素到相机的距离float fragDistance = calFragDistance();// 步骤2:计算雾的混合比例(0.0=显示原色,1.0=完全显示雾色)float fogRate = calFogRate(fragDistance);// 获取当前像素的原始颜色(从颜色纹理采样)vec4 picColor = texture2D(colorTexture, v_textureCoordinates);// 步骤3:混合原始颜色和雾色(根据雾化比例)// mix(a,b,ratio) = a*(1-ratio) + b*ratiogl_FragColor = mix(picColor,                // 原始场景颜色vec4(u_fogColor, 1.0),   // 雾的颜色(alpha固定为1)fogRate                  // 混合比例);
}
自定义天气效果.js
// 导入Cesium库(三维地球可视化库)
import * as Cesium from "cesium";
// 导入dat.gui库(用于创建控制面板)
import * as dat from "dat.gui";// 导入腾讯地图服务提供者
import { TencentImageryProvider } from "@cesium-china/cesium-map";
// 导入天气效果着色器代码
import rain from '../shader/rain.glsl'
import snow from '../shader/snow.glsl'
import fog from '../shader/fog.glsl'// 创建调试控制面板
const gui = new dat.GUI();// 设置Cesium的访问令牌(相当于地图服务的密码)
Cesium.Ion.defaultAccessToken = "mytoken"; // 这里简化了长令牌// 创建三维地球视图容器(id为cesiumContainer的HTML元素)
const viewer = new Cesium.Viewer("cesiumContainer", {timeline: true,         // 显示时间轴animation: false,       // 隐藏动画控件baseLayerPicker: false, // 隐藏底图切换按钮homeButton: false,      // 隐藏主页按钮fullscreenButton: false,// 隐藏全屏按钮geocoder: false,        // 隐藏地理搜索框sceneModePicker: false, // 隐藏二三维切换按钮scene3DOnly: true,      // 强制使用3D模式navigationHelpButton: false, // 隐藏导航帮助shouldAnimate: true     // 允许时间流动(云层会动)
});// 腾讯地图服务配置(当前被注释,需要时取消注释)
// const addTecentMap = () => { ... };// 使用腾讯地图服务(卫星影像)
const options = {style: 4,       // 地图样式(4=卫星影像)crs: "WGS84"    // 使用国际通用坐标系
};
viewer.scene.imageryLayers.addImageryProvider(new TencentImageryProvider(options)
);// 加载3D建筑模型(tileset类似乐高积木的组装方式)
const tileset = new Cesium.Cesium3DTileset({url: "http://localhost:666/model/3dtiles/tileset.json" // 模型地址
});
viewer.scene.primitives.add(tileset); // 将模型添加到场景// 模型加载完成后自动定位到模型
tileset.readyPromise.then(() => {viewer.zoomTo(tileset); // 镜头飞向模型
});// 添加河流水域效果
const addRiver = async () => {// 加载水域的GeoJSON数据(类似地图上的多边形)const dataSource = await Cesium.GeoJsonDataSource.load("/src/assets/water.json");// 从数据源获取所有图形要素const entities = dataSource.entities.values;const instances = []; // 存储几何实例的数组// 处理每个水域多边形const getPerInstance = (ent) => {const hierarchy = ent.polygon.hierarchy.getValue(); // 获取多边形顶点数据const geometry = new Cesium.PolygonGeometry({ polygonHierarchy: hierarchy });instances.push(new Cesium.GeometryInstance({ geometry })); // 创建几何实例};entities.forEach(getPerInstance); // 遍历所有要素// 创建水的材质(就像给水面贴上一层会动的贴纸)const material = new Cesium.Material({fabric: {type: Cesium.Material.WaterType, // 使用内置水类型uniforms: {                      // 水的属性设置baseWaterColor: Cesium.Color.SKYBLUE, // 基础颜色blendColor: Cesium.Color.fromCssColorString("#3a96dd"), // 混合颜色normalMap: "/src/assets/waterNormals.jpg", // 法线贴图(制造波浪效果)frequency: 10000.0,   // 波浪密度animationSpeed: 0.1,  // 波浪速度amplitude: 1.0        // 波浪高度}}});// 创建水面外观(控制如何渲染)const appearance = new Cesium.EllipsoidSurfaceAppearance({material,translucent: true // 允许半透明});// 创建水面图元(最终的可视对象)const waterPrimitive = new Cesium.Primitive({appearance,geometryInstances: instances});viewer.scene.primitives.add(waterPrimitive); // 添加到场景
};addRiver(); // 执行添加水域// 开启抗锯齿(让画面边缘更平滑)
viewer.scene.postProcessStages.fxaa.enabled = true;// 天气效果控制参数
let rainStage, snowStage, fogStage; // 三个天气效果处理器
const rainModel = { enabled: false, rainSpeed: 1.2, rainSize: 1.2 }; // 雨参数
const snowModel = { enabled: false }; // 雪参数
const fogModel = { enabled: false, fogColor: '#5b51ec', near: 100, far: 200000 }; // 雾参数// 创建降雨效果
const addRainStage = () => {rainStage = new Cesium.PostProcessStage({name: 'rain',uniforms: { // 传递给着色器的参数rainSpeed: 0.6,   // 初始雨速rainSize: 1.2     // 初始雨滴大小},fragmentShader: rain // 使用雨效果着色器代码});
};// 创建降雪效果(同理)
const addSnowStage = () => {snowStage = new Cesium.PostProcessStage({name: 'snow',fragmentShader: snow});
};// 创建雾效效果
const addFogStage = () => {fogStage = new Cesium.PostProcessStage({name: 'fog',uniforms: {u_fogColor: Cesium.Color.fromCssColorString(fogModel.fogColor), // 雾颜色u_near: fogModel.near, // 雾起始距离u_far: fogModel.far    // 雾最大距离},fragmentShader: fog});
};// 初始化所有天气效果
addRainStage();
addSnowStage();
addFogStage();// 创建雨效控制面板
gui.add(rainModel, 'enabled').onChange(val => {val ? viewer.scene.postProcessStages.add(rainStage) // 开关雨效: viewer.scene.postProcessStages.remove(rainStage);
});
gui.add(rainModel, 'rainSpeed', 0.1, 2, 0.1).onChange(val => { // 雨速滑块rainStage && (rainStage.uniforms.rainSpeed = val);
});
gui.add(rainModel, 'rainSize', 0.1, 2, 0.1).onChange(val => { // 雨滴大小滑块rainStage && (rainStage.uniforms.rainSize = val);
});// 雪效控制面板
const folderSnow = gui.addFolder('雪属性');
folderSnow.add(snowModel, 'enabled').onChange(val => {val ? viewer.scene.postProcessStages.add(snowStage): viewer.scene.postProcessStages.remove(snowStage);
});// 雾效控制面板
const folderFog = gui.addFolder('雾属性');
folderFog.add(fogModel, 'enabled').onChange(val => { // 雾效开关val ? viewer.scene.postProcessStages.add(fogStage): viewer.scene.postProcessStages.remove(fogStage);
});
folderFog.addColor(fogModel, 'fogColor').onChange(val => { // 颜色选择器fogStage && (fogStage.uniforms.u_fogColor = Cesium.Color.fromCssColorString(val));
});
folderFog.add(fogModel, 'near', 0, 100000).onChange(val => { // 起始距离滑块fogStage && (fogStage.uniforms.u_near = val);
});
folderFog.add(fogModel, 'far', 100000, 500000, 3000).onChange(val => { // 最大距离滑块fogStage && (fogStage.uniforms.u_far = val);
});
folderFog.open(); // 默认展开雾效面板

相关文章:

Cesium实现雨、闪电、雪、雾天气效果

基于 Cesium 的三维地理信息场景&#xff0c;集成了天气效果后处理、3D 模型加载、水域渲染等功能。以下是详细功能总结&#xff1a; 1. 场景初始化与基础配置 三维地球初始化 创建 Cesium Viewer 实例&#xff0c;隐藏默认控件&#xff08;时间轴、动画控件等&#xff09;&…...

上门送水小程序区域代理模块框架设计

一、逻辑分析 代理申请流程&#xff1a; 潜在代理商通过小程序提交代理申请&#xff0c;需要填写个人或企业基本信息、联系方式、期望代理区域等。系统收到申请后&#xff0c;进行初步审核&#xff0c;检查信息的完整性和合规性。运营人员进行人工审核&#xff0c;根据公司政策…...

GIS开发笔记(6)结合osg及osgEarth实现半球形区域绘制

一、实现效果 输入中心点坐标及半径&#xff0c;绘制半球形区域&#xff0c;地下部分不显示。 二、实现原理 根据中心点及半径绘制半球形区域&#xff0c;将其挂接到地球节点。 三、参考代码 void GlobeWidget::drawSphericalRegion(osg::Vec3d point,double radius) {// 使…...

UE5在场景3D物体上播放本地视频(带声音)

UE5在场景3D物体上播放本地视频&#xff08;带声音&#xff09; 0.在Map中创建一个立方体,调整大小看起来像屏幕一样 1.创建文件夹Movies在根目录下 2.把准备的视频复制到Movies文件夹下 3.把Movies文件夹下的视频拖入到UE自己创建的文件夹下&#xff0c;此时会有个文件媒体源…...

安装部署RabbitMQ

一、RabbitMQ安装部署 1、下载epel源 2、安装RabbitMQ 3、启动RabbitMQ web管理界面 启用插件 rabbitmq数据目录 创建rabbitmq用户 设置为管理员角色 给用户赋予权限 4、访问rabbitmq...

STM32启动流程详解

STM32启动流程详解 本文档详细介绍STM32微控制器从上电到main函数执行的完整启动流程。 1. 上电与复位过程 当STM32芯片上电或复位时&#xff0c;硬件会执行以下步骤&#xff1a; 上电复位(POR)/低电平复位(PDR): 芯片接通电源或NRST引脚置低时触发初始PC值设置: 程序计数器…...

【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——CPU温度CPU主频

1&#xff09;实验平台&#xff1a;正点原子ATK-DLMP257B开发板 2&#xff09;浏览产品&#xff1a;https://www.alientek.com/Product_Details/135.html 3&#xff09;全套实验源码手册视频下载&#xff1a;正点原子资料下载中心 第四章 ATK-DLMP257B功能测试——CPU主频&…...

LVDS系列8:Xilinx 7系可编程输入延迟(一)

在解析LVDS信号时&#xff0c;十分重要的一环就是LVDS输入信号线在经过PCB输入到FPGA中后&#xff0c;本来该严格对齐的信号线会出现时延&#xff0c;所以需要在FPGA内部对其进行延时对齐后再进行解析。 Xilinx 7系器件中用于输入信号延时的组件为IDELAYE2可编程原语&#xff0…...

iotdb时序数据库使用

iotdb https://github.com/apache/iotdb.git 安装maven3.9.6以上版本执行编译 iotdb启动&#xff0c;使用安装包sbin目录下的start-standalone.bat sbin\start-standalone.bat 执行报错如果是内存问题&#xff0c;可以在对应的node配置中修改&#xff0c;如conf\datanode-ev…...

【Caddy】:现代化、自动 HTTPS 的 Web 服务器新星

&#x1f680; Caddy&#xff1a;现代化、自动 HTTPS 的 Web 服务器新星&#xff01; 在构建和部署 Web 应用时&#xff0c;你可能听说过或用过如 Nginx、Apache 等经典的 Web 服务器。但在今天&#xff0c;有一个越来越受欢迎的新选择——Caddy。 本文将带你认识 Caddy&…...

用 DeepSeek 精准解析,PDF 一键转电子书!

经常需要阅读大量的 PDF 文档&#xff0c;但在移动设备上阅读 PDF 通常体验极差。屏幕小、排版固定&#xff0c;需要不断放大缩小&#xff0c;眼睛容易疲劳&#xff0c;长时间阅读简直是一种折磨。 虽有不少 PDF 转换工具&#xff0c;但对扫描书籍支持不佳&#xff0c;经常丢失…...

【AIoT】智能硬件GPIO通信详解(二)

前言 上一篇我们深入解析了智能硬件GPIO通信原理(传送门:【AIoT】智能硬件GPIO通信详解(一))。接下来,我们将结合无人售货机控制场景,通过具体案例进一步剖析物联网底层通信机制的实际应用。 在智能零售领域,无人售货机通过AI技术升级为智能柜,其设备控制的底层通信…...

Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿

CPU负载突然飙升&#xff0c;如截图&#xff1a; 根本原因&#xff0c;大家从各种博主上已知晓&#xff0c;现在提供自己的解决办法&#xff0c;亲测有效 一、设置开机自动禁用温度管理守护进程 1.创建脚本文件 mkdir -p ~/Scripts touch ~/Scripts/disable_thermald.sh …...

镜舟科技助力某大型电网企业破解数据架构升级难题,打造国产化湖仓标杆

在 “十四五” 规划全面推进国产化替代的背景下&#xff0c;某大型电网企业联合镜舟科技与腾讯云&#xff0c;基于全球领先的开源分析型数据库 StarRocks 及腾讯 TBDS 大数据平台&#xff0c;构建电力行业国产化湖仓一体架构。该项目实现 PB 级电力数据的统一管理&#xff0c;为…...

Linux内核内存管理单元 详解Linux 内核伙伴系统(Buddy System)的快速路径分配函数get_page_from_freelist

一、函数核心作用 get_page_from_freelist 是 Linux 内核伙伴系统&#xff08;Buddy System&#xff09;的快速路径分配函数&#xff0c;负责从指定的内存区域&#xff08;Zone&#xff09;中高效分配连续的物理内存页。其核心逻辑是遍历允许的 Zone 列表&#xff0c;检查水位…...

网络原理 - 初识网络 2

目录 OSI 七层协议 TCP / IP 五层模型 网络设备所在分层 网络分层对应 封装和分用&#xff08;网络传输数据过程中&#xff0c;最核心的流程&#xff09; 用一个具体例子来梳理以下封装和分用的过程 封装 1. 应用层&#xff08;应用程序&#xff09; -- QQ 2. 传输层 …...

如何利用GM DC Monitor快速监控一台网络类设备

GM DC Monitor v2.0在网络类设备监控的效率非常高&#xff01; 如果您需要管理运维大量的网络类设备&#xff0c;GM DC Monitor是个不错的选择。 如果您具备一定的采集脚本编写能力&#xff0c;可以在平台的定制属于自己的监控模板&#xff01; 1&#xff09;首先建立数据中…...

类和对象终

一、初始化列表 再谈构造函数 我们之前实现构造函数的时候&#xff0c;初始化成员变量在函数体内赋值的&#xff0c;构造函数还有一种初始化方式&#xff0c;就是初始化列表 我们先实现一个栈来举例&#xff1a; // 实现一个栈 typedef int DataType; class Stack { public:…...

教程:批量提取图片pdf固定位置文字然后保存为新的文件名,基于Python和阿里云的实现方案

一、项目背景 在实际工作和生活中,存在大量需要对图片或 PDF 进行批量处理的场景。例如,在档案管理中,工作人员可能会扫描大量文件,生成图片或 PDF 格式的档案资料。这些资料通常包含特定位置的关键信息,如文件编号、日期等。通过批量提取这些关键信息并将其作为文件名,…...

JVM:堆、方法区

一、堆 概念&#xff1a;堆用于存储对象和数组&#xff0c;主要分为新生代和老年代&#xff0c;新生代又细分为伊甸园区、幸存者 0 区&#xff08;S0&#xff09;和幸存者 1 区&#xff08;S1&#xff09;内存设置&#xff1a;可用 -Xmx 和 -Xms 设置堆内存大小&#xff0c;-X…...

JVM-基于Hotspot

前言 Java虚拟机&#xff08;Java Virtual Machine简称JVM&#xff09;是运行所有Java程序的抽象计算机&#xff0c;是Java语言的运行环境&#xff0c;其主要任务为将字节码装载到内部&#xff0c;解释/编译为对应平台上的机器指令执行。 Java虚拟机规范定义了一个抽象的——…...

Android 10.0 第三方Launcher设置默认Launcher后导致Recent最近任务键无效

1.前言 在10.0的系统rom定制化开发中,在进入launcher的定制过程中,在某些产品中,需要设置第三方launcher为默认Launcher功能, 所以在设置以后,会发现最近recent键无效,所以接下来需要分析相关流程来实现相关功能的实现 2.第三方Launcher设置默认Launcher后导致Recent最…...

状态模式详解与真实场景案例(Java实现)

模式定义 状态模式&#xff08;State Pattern&#xff09; 允许对象在其内部状态改变时改变它的行为&#xff0c;使对象看起来像是修改了它的类。属于行为型设计模式&#xff0c;核心思想是将状态抽象为独立对象&#xff0c;不同状态下行为封装在不同状态类中。 解决的问题 …...

uniapp-商城-26-vuex 使用流程

为了能在所有的页面都实现状态管理,我们按照前面讲的页面进行状态获取,然后再进行页面设置和布局,那就是重复工作,vuex 就会解决这样的问题,如同类、高度提炼的接口来帮助我们实现这些重复工作的管理。避免一直在造一样的轮子。 https://vuex.vuejs.org/zh/#%E4%BB%80%E4…...

科技快讯 | 智谱开源最新GLM模型系列;“AI 洗头店”现身广州;ChatGPT上线图库功能

智谱开源最新GLM模型系列&#xff0c;启用全球域名“Z.ai” 4月15日&#xff0c;智谱开源最新GLM模型系列&#xff0c;包括32B和9B尺寸&#xff0c;涵盖基座、推理、沉思三类模型&#xff0c;全部遵循MIT开源许可协议。推理模型GLM-Z1-32B-0414实测推理速度达200 tokens/秒&…...

LeetCode 2537.统计好子数组的数目:滑动窗口(双指针)

【LetMeFly】2537.统计好子数组的数目&#xff1a;滑动窗口(双指针) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-the-number-of-good-subarrays/ 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回 nums 中 好 子数组的数目。 一个子数组 arr 如果…...

精益数据分析(1/126):从《精益数据分析》探寻数据驱动增长之道

精益数据分析&#xff08;1/126&#xff09;&#xff1a;从《精益数据分析》探寻数据驱动增长之道 在当今数字化时代&#xff0c;数据无疑是企业发展的关键驱动力&#xff0c;对于竞争激烈的程序化广告行业更是如此。最近我在研读《精益数据分析》这本书&#xff0c;收获颇丰&…...

uniapp-商城-27-vuex 通用方法

1 概述 上节说了vuex 的基本使用方法,分析了基本的使用方法。 在使用中,常见使用,我们要针对状态,购物车,不同类事务的管理,如果按照上节课的通用方法,那么使用和维护是会很大的难度的。 所以这里就必须要进行处理,借助 modules 进行定义不同类事务的处理手段。便于…...

MetaLiveX:用AI重新定义直播互动的边界

“直播的核心价值,在于它能否让观众从‘旁观者’变为‘共創者’。”在近期一场数字技术峰会上,杜子程(Emma Zicheng Du)首次公开阐释了其团队研发的MetaLiveX平台核心理念。这一以AI为驱动的智能直播系统,正通过动态场景生成与情感化交互设计,重新定义虚拟社群的参与逻辑。目前…...

线程安全学习

1 什么是线程 线程是cpu调度的最小单位&#xff0c;在Linux 下 实现线程的方式为轻量级进程&#xff0c;复用进程的结构体&#xff0c;使用clone函数创建 2 线程安全 所谓线程安全&#xff0c;更确切的应该描述为内存安全 #include <stdio.h> #include <pthread.h…...

三层路由器,SSH远程登录访问路由器,通过telnet远程登录访问路由器(不安全),路由器的基本设置之多网络互联解决办法:单臂路由

三层路由器 默认路由器端口关闭&#xff1a;no shutdown &#xff08;开启&#xff09;需进入端口默认路由开启&#xff1a;无需 ip routing路由器充当网关&#xff0c;可以连接不同网络接口种类丰富&#xff0c;数量少 SSH远程登录访问路由器 记得设IP Would you like to e…...

分布式光伏电站运维难?Acrel-1000DP助力安全稳定运行

针对用户新能源接入后存在安全隐患、缺少有效监控、发电效率无法保证、收益计算困难、运行维护效率低等通点&#xff0c;提出的Acrel-1000DP分布式光伏监控系统平台&#xff0c;对整个用户电站全面监控&#xff0c;为用户实现降低能源使用成本、减轻变压器负载、余电上网&#…...

基于sherpa-onnx 安卓语音识别尝鲜

sherpa-onnx简介 Sherpa&#xff1a;是一个由 K2-FSA 团队 开发的 开源语音处理框架&#xff0c;旨在解决传统语音识别工具&#xff08;如 Kaldi&#xff09;在模型部署和跨平台适配中的复杂性问题。它通过整合现代深度学习技术和高效推理引擎&#xff0c;提供了从语音识别、合…...

利用 Python 和 AI 技术创作独特的图像艺术作品

1. 项目目标 生成艺术作品&#xff1a;利用 AI 模型&#xff08;如 Stable Diffusion&#xff09;生成具有艺术风格的图像。自定义风格&#xff1a;通过文本提示&#xff08;prompt&#xff09;控制图像的艺术风格&#xff08;如赛博朋克、印象派、超现实主义等&#xff09;。…...

Web自动化测试的详细流程和步骤

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Web自动化测试是软件测试中非常重要的一种测试方法&#xff0c;它通过编写脚本来模拟人工操作网页&#xff0c;从而实现对Web应用程序进行自动化测试的过程。为了保…...

记录一个坑关于STM32 ARM Compiler Version

在用 Keil 进行 STM32 开发的时候&#xff0c;一开始下载&#xff0c;下载的 ARM 编译器是 Version6&#xff0c;他就不兼容老的代码&#xff0c;就很抽象。 所以必须要更换编译器。 可以去官网下载编译器 Downloads - Arm Developer &#xff0c;也可以自己找资源哈&#xff…...

TCP实现多线程远程命令执行

1.上一篇篇代码改进 bind的绑定第一个是对象&#xff0c;其余的都是参数&#xff0c;传给一个类需要this指针&#xff0c;所以有&r 错误地方是智能指针的参数要加&&#xff0c;thread.name()要删除 2.介绍需要用到函数 popen函数 FILE *popen(const char *command, …...

【MySQL】索引特性

文章目录 &#x1f449;没有索引可能会有什么问题&#x1f448;&#x1f449;认识磁盘&#x1f448;前置知识MySQL 与磁盘磁盘定位扇区结论磁盘随机访问与连续访问MySQL 与磁盘交互基本单位 &#x1f449;MySQL 的整体轮廓&#x1f448;&#x1f449;索引的理解&#x1f448;建…...

红宝书第四十七讲:Node.js服务器框架解析:Express vs Koa 完全指南

红宝书第四十七讲&#xff1a;Node.js服务器框架解析&#xff1a;Express vs Koa 完全指南 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、框架定位&#xff1a;HTTP服务器的工具箱 共同功能&#xff1a; 快…...

SDK游戏盾ip可以破解吗

从技术实现和法律合规性角度&#xff0c;​​不建议也不应尝试破解SDK游戏盾的IP防护机制​​。以下是详细分析&#xff1a; ​​一、法律与道德风险​​ ​​违法行为​​ 破解游戏盾的IP防护属于​​非法侵入计算机信息系统​​或​​破坏网络安全​​的行为&#xff0c;可能…...

​​eBay东南亚爆单密码:72小时交付计划如何重构厦门仓+东南亚供应链?​

2024年东南亚电商市场规模预计突破2340亿美元&#xff0c;年复合增长率达18%。eBay最新战略将厦门纳入海外仓核心节点&#xff0c;推出“72小时交付计划”&#xff0c;通过“仓配转”一体化链路&#xff0c;助力中国卖家实现东南亚市场订单履约率提升10%&#xff0c;退货成本降…...

大语言模型

1.当前有哪些主流AI方向 1.1大语言模型方向 OpenAI的GPT语言模型系列&#xff0c;o3等推理模型系列 综合能力强 anthrotic的claude系列&#xff0c;推理预测混合模型 代码能力强 DeepSeek的V系列&#xff0c;R1推理模型 …...

深入理解Java缓冲输入输出流:性能优化的核心武器

在Java应用程序的IO操作中,频繁的磁盘读写或网络传输往往是性能瓶颈的主要来源。JDK提供的缓冲流(Buffered Streams)通过内存缓冲机制,将零碎的IO操作转化为批量处理,成为提升IO效率的关键技术。本文将从设计原理、核心机制到实战技巧,全面解析缓冲流的技术细节。 一、缓…...

AI 对话高效输入指令攻略(一):了解AI对话指令

目录 引 一.认识 AI 对话中的指令基础​ 1.运行原理​ 2.智能体在 AI 对话中的关键角色与运行机制​ 3.智能体的核心任务​ 4.对不同指令的响应差异​ 5.针对不同指令类型的处理方式​ 6.智能体在底层逻辑中的运作​ 二.高效输入指令的底层逻辑​ 1.语义匹配逻辑​ …...

AI大模型从0到1记录学习 数据结构和算法 day19

常用算法 查找算法 二分查找 算法原理 二分查找又称折半查找&#xff0c;适用于有序列表。其利用数据的有序性&#xff0c;每轮缩小一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空为止。 代码实现 def binary_search(arr, target): left, right 0, len(arr) - 1 w…...

Python + Playwright:使用正则表达式增强自动化测试

Python + Playwright:使用正则表达式增强自动化测试 前言一、 为什么选择正则表达式?二、 Playwright 中集成正则表达式:途径与方法三、 实战应用:正则表达式解决典型测试难题场景 1:定位 ID 或 Class 包含动态部分的元素场景 2:验证包含可变数字或文本的提示信息场景 3:…...

构建用户友好的记账体验 - LedgerX交互设计与性能优化实践

构建用户友好的记账体验 - LedgerX交互设计与性能优化实践 发布日期: 2025-04-16 引言 在财务管理应用领域&#xff0c;技术实力固然重要&#xff0c;但最终决定用户留存的往往是日常使用体验。本文作为LedgerX技术博客的第二篇&#xff0c;将深入探讨我们如何通过精心的交互…...

AI赋能PLC(一):三菱FX-3U编程实战初级篇

前言 在工业自动化领域&#xff0c;三菱PLC以其高可靠性、灵活性和广泛的应用场景&#xff0c;成为众多工程师的首选控制设备。然而&#xff0c;传统的PLC编程往往需要深厚的专业知识和经验积累&#xff0c;开发周期长且调试复杂。随着人工智能技术的快速发展&#xff0c;利用…...

人工智能——梯度提升决策树算法

目录 摘要 14 梯度提升决策树 14.1 本章工作任务 14.2 本章技能目标 14.3 本章简介 14.4 编程实战 14.5 本章总结 14.6 本章作业 本章已完结&#xff01; 摘要 本章实现的工作是&#xff1a;首先采用Python语言读取含有英语成绩、数学成绩以及学生所属类型的样本数据…...

智能家居适老化改造:让科技回归“无感服务”

在老龄化加速与科技飞速发展的当下&#xff0c;智能家居适老化改造成为提升老年人生活品质的关键举措。 理想的适老化智能家居&#xff0c;应实现 “无感服务”&#xff0c;即让老年人在无需刻意操作或复杂学习的情况下&#xff0c;自然、流畅地享受科技带来的便利&#xff0c…...