threejs几何体BufferGeometry顶点
1. 几何体顶点位置数据和点模型
本章节主要目的是给大家讲解几何体geometry的顶点概念,相对偏底层一些,不过掌握以后,你更容易深入理解Threejs的几何体和模型对象。
缓冲类型几何体BufferGeometry
threejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry (opens new window)类构建的,BufferGeometry是一个没有任何形状的空几何体,你可以通过BufferGeometry自定义任何几何形状,具体一点说就是定义顶点数据。
//创建一个空的几何体对象
const geometry = new THREE.BufferGeometry();
BufferAttribute定义几何体顶点数据
通过javascript类型化数组 (opens new window)Float32Array创建一组xyz坐标数据用来表示几何体的顶点坐标。
//类型化数组创建顶点数据
const vertices = new Float32Array([0, 0, 0, //顶点1坐标50, 0, 0, //顶点2坐标0, 100, 0, //顶点3坐标0, 0, 10, //顶点4坐标0, 0, 100, //顶点5坐标50, 0, 10, //顶点6坐标
]);
通过threejs的属性缓冲区对象BufferAttribute (opens new window)表示threejs几何体顶点数据。
// 创建属性缓冲区对象
//3个为一组,表示一个顶点的xyz坐标
const attribue = new THREE.BufferAttribute(vertices, 3);
设置几何体顶点.attributes.position
通过geometry.attributes.position设置几何体顶点位置属性的值BufferAttribute。
// 设置几何体attributes属性的位置属性
geometry.attributes.position = attribue;
点模型Points
点模型Points (opens new window)和网格模型Mesh一样,都是threejs的一种模型对象,只是大部分情况下都是用Mesh表示物体。
网格模型Mesh有自己对应的网格材质,同样点模型Points有自己对应的点材质PointsMaterial
// 点渲染模式
const material = new THREE.PointsMaterial({color: 0xffff00,size: 10.0 //点对象像素尺寸
});
几何体geometry作为点模型Points参数,会把几何体渲染为点,把几何体作为Mesh的参数会把几何体渲染为面。
const points = new THREE.Points(geometry, material); //点模型对象
import * as THREE from 'three'
// 创建一个空的几何体顶对象
const geometry = new THREE.BufferGeometry()
// 添加顶点数据
// 类型化数组定义的一组顶点坐标数据
const vertices = new Float32Array([// 数组里面编写顶点的坐标数据0, 0, 0, //顶点1坐标50, 0, 0, //顶点2坐标0, 100, 0, //顶点3坐标0, 0, 10, //顶点4坐标0, 0, 100, //顶点5坐标50, 0, 10, //顶点6坐标
])
// BufferAttribute属性缓冲对象表示顶点数据
const attribute = new THREE.BufferAttribute(vertices, 3)// 设置几何体的顶点位置属性
geometry.attributes.position = attribute// 点材质
const material = new THREE.PointsMaterial({color: 0xffff00,size: 10
})
// 定义了一个点模型对象
const points = new THREE.Points(geometry,material)
export default points
2. 线模型对象
线模型Line
渲染顶点数据
下面代码是把几何体作为线模型Line (opens new window)的参数,你会发现渲染效果是从第一个点开始到最后一个点,依次连成线。
// 线材质对象
const material = new THREE.LineBasicMaterial({color: 0xff0000 //线条颜色
});
// 创建线模型对象
const line = new THREE.Line(geometry, material);
效果:
线模型LineLoop、LineSegments
threejs线模型除了Line,还提供了LineLoop (opens new window)、LineSegments (opens new window),区别在于绘制线条的规则不同。
// 闭合线条
const line = new THREE.LineLoop(geometry, material);
//非连续的线条
const line = new THREE.LineSegments(geometry, material);
代码:
import * as THREE from 'three'
// 创建一个空的几何体顶对象
const geometry = new THREE.BufferGeometry()
// 添加顶点数据
// 类型化数组定义的一组顶点坐标数据
const vertices = new Float32Array([// 数组里面编写顶点的坐标数据0, 0, 0, //顶点1坐标50, 0, 0, //顶点2坐标0, 100, 0, //顶点3坐标0, 0, 10, //顶点4坐标0, 0, 100, //顶点5坐标50, 0, 10, //顶点6坐标
])
// BufferAttribute属性缓冲对象表示顶点数据
const attribute = new THREE.BufferAttribute(vertices, 3)// 设置几何体的顶点位置属性
geometry.attributes.position = attribute// 点材质
const material = new THREE.LineBasicMaterial({color: 0xffff00, //黄色线条
})// 定义了一个线模型对象
// Line 线条
// LineLoop 闭合线条
// LineSegments 非连续的线条
const line = new THREE.LineSegments(geometry,material)
export default line
3. 网格模型(三角形概念)
本节课给大家演示网格模型Mesh渲染自定义几何体BufferGeometry的顶点坐标,通过这样一个例子帮助大家建立**三角形(面)**的概念
三角形(面)
网格模型Mesh其实就一个一个三角形(面)拼接构成。使用网格模型Mesh渲染几何体geometry,就是几何体所有顶点坐标三个为一组,构成一个三角形,多组顶点构成多个三角形,就可以用来模拟表示物体的表面。
网格模型三角形:正反面
正面:逆时针
反面:顺时针
空间中一个三角形有正反两面,那么Three.js的规则是如何区分正反面的?非常简单,你的眼睛(相机)对着三角形的一个面,如果三个顶点的顺序是逆时针方向,该面视为正面,如果三个顶点的顺序是顺时针方向,该面视为反面。
双面可见
Three.js的材质默认正面可见,反面不可见。
const material = new THREE.MeshBasicMaterial({color: 0x0000ff, //材质颜色side: THREE.FrontSide, //默认只有正面可见
});
const material = new THREE.MeshBasicMaterial({side: THREE.DoubleSide, //两面可见
});
const material = new THREE.MeshBasicMaterial({side: THREE.BackSide, //设置只有背面可见
});
代码:
import * as THREE from 'three'
// 创建一个空的几何体顶对象
const geometry = new THREE.BufferGeometry()
// 添加顶点数据
// 类型化数组定义的一组顶点坐标数据
const vertices = new Float32Array([// 数组里面编写顶点的坐标数据0, 0, 0, //顶点1坐标50, 0, 0, //顶点2坐标0, 100, 0, //顶点3坐标0, 0, 10, //顶点4坐标0, 0, 100, //顶点5坐标50, 0, 10, //顶点6坐标
])
// BufferAttribute属性缓冲对象表示顶点数据
const attribute = new THREE.BufferAttribute(vertices, 3)// 设置几何体的顶点位置属性
geometry.attributes.position = attribute// 用网格模型mesh渲染自定义的几何体BufferGeometry
const material = new THREE.MeshBasicMaterial({color: 0x00ffff, //黄色线条side: THREE.DoubleSide //双面可见 BackSide 背面可见
})const mesh = new THREE.Mesh(geometry,material)
export default mesh
4. 构建一个矩形平面几何体
有了前面几节课,自定义几何体BufferGeometry的基础,你可以尝试自己去构建一个矩形平面几何体。
定义矩形几何体顶点坐标
一个矩形平面,可以至少通过两个三角形拼接而成。而且两个三角形有两个顶点的坐标是重合的。
注意三角形的正反面问题:保证矩形平面两个三角形的正面是一样的,也就是从一个方向观察,两个三角形都是逆时针或顺时针。
const vertices = new Float32Array([0, 0, 0, //顶点1坐标80, 0, 0, //顶点2坐标80, 80, 0, //顶点3坐标0, 0, 0, //顶点4坐标 和顶点1位置相同80, 80, 0, //顶点5坐标 和顶点3位置相同0, 80, 0, //顶点6坐标
]);
效果:
model.js
import * as THREE from 'three'
// 创建一个空的几何体顶对象
const geometry = new THREE.BufferGeometry()
// 添加顶点数据
// 类型化数组定义的一组顶点坐标数据
const vertices = new Float32Array([// 矩形平面的第一个三角形0, 0, 0, //顶点1坐标80, 0, 0, //顶点2坐标80, 80, 0, //顶点3坐标// 矩形平面的第二个三角形0, 0, 0, //顶点4坐标 和顶点1位置相同80, 80, 0, //顶点5坐标 和顶点3位置相同0, 80, 0, //顶点6坐标
])
// BufferAttribute属性缓冲对象表示顶点数据
const attribute = new THREE.BufferAttribute(vertices, 3)// 设置几何体的顶点位置属性
geometry.attributes.position = attribute// 用网格模型mesh渲染自定义的几何体BufferGeometry
const material = new THREE.MeshBasicMaterial({color: 0x00ffff, //黄色线条side: THREE.DoubleSide //双面可见 BackSide 背面可见
})const mesh = new THREE.Mesh(geometry,material)
export default mesh
5. 几何体顶点索引数据
网格模型Mesh对应的几何体BufferGeometry,拆分为多个三角后,很多三角形重合的顶点位置坐标是相同的,这时候如果你想减少顶点坐标数据量,可以借助几何体顶点索引geometry.index来实现。
定义顶点位置坐标数据
每个三角形3个顶点坐标,矩形平面可以拆分为两个三角形,也就是6个顶点坐标。
const vertices = new Float32Array([0, 0, 0, //顶点1坐标80, 0, 0, //顶点2坐标80, 80, 0, //顶点3坐标0, 0, 0, //顶点4坐标 和顶点1位置相同80, 80, 0, //顶点5坐标 和顶点3位置相同0, 80, 0, //顶点6坐标
]);
如果几何体有顶点索引geometry.index,那么你可以吧三角形重复的顶点位置坐标删除。
const vertices = new Float32Array([0, 0, 0, //顶点1坐标80, 0, 0, //顶点2坐标80, 80, 0, //顶点3坐标0, 80, 0, //顶点4坐标
]);
BufferAttribute定义顶点索引.index数据
通过javascript类型化数组Uint16Array创建顶点索引.index数据。
// Uint16Array类型数组创建顶点索引数据
const indexes = new Uint16Array([// 下面索引值对应顶点位置数据中的顶点坐标0, 1, 2, 0, 2, 3,
])
通过threejs的属性缓冲区对象BufferAttribute表示几何体顶点索引.index数据。
// 索引数据赋值给几何体的index属性
geometry.index = new THREE.BufferAttribute(indexes, 1); //1个为一组
代码
import * as THREE from 'three'
// 创建一个空的几何体顶对象
const geometry = new THREE.BufferGeometry()
// 添加顶点数据
// 类型化数组定义的一组顶点坐标数据
const vertices = new Float32Array([// 矩形平面的第一个三角形0, 0, 0, //顶点1坐标 0 索引80, 0, 0, //顶点2坐标 180, 80, 0, //顶点3坐标 2// 矩形平面的第二个三角形// 0, 0, 0, //顶点4坐标 和顶点1位置相同// 80, 80, 0, //顶点5坐标 和顶点3位置相同0, 80, 0, //顶点6坐标 3
])// BufferAttribute属性缓冲对象表示顶点数据
// 这个地方三个表示一个顶点坐标
const attribute = new THREE.BufferAttribute(vertices, 3)// 设置几何体的顶点位置属性
geometry.attributes.position = attribute// 类型化数组创建顶点数据
const indexes = new Uint16Array([0,1,2,0,2,3
])
// 这个地方,一个索引表示一个顶点坐标
// 几何体顶点索引的定义
geometry.index = new THREE.BufferAttribute(indexes,1)// 用网格模型mesh渲染自定义的几何体BufferGeometry
const material = new THREE.MeshBasicMaterial({color: 0x00ffff, //黄色线条side: THREE.DoubleSide //双面可见 BackSide 背面可见
})const mesh = new THREE.Mesh(geometry,material)
export default mesh
6. 顶点法线数据
前面给大家讲解过几何体顶点位置数据geometry.attributes.position
,本节课给大家介绍一种新的顶点数据,就是顶点法线(法向量)数据geometry.attributes.normal
。
测试:Basic材质改为Lambert材质
你可以测试下,把前面两节课的案例源码中MeshBasicMaterial
材质改为MeshLambertMaterial
材质,你会发现原来的矩形平面无法正常渲染,这其实很简单,使用受光照影响的材质,几何体BufferGeometry需要定义顶点法线数据。
// MeshBasicMaterial不受光照影响
// 使用受光照影响的材质,几何体Geometry需要定义顶点法线数据
const material = new THREE.MeshLambertMaterial({color: 0x0000ff, side: THREE.DoubleSide, //两面可见
});
数学上法线概念
先来理解一下数学上的法线概念,比如一个平面,法线的就是该平面的垂线,如果是光滑曲面,一点的法线就是该点切面的法线。
Three.js顶点法线
Three.js中法线和数学中法线概念相似,只是定义的时候更灵活,会根据需要进行调整,作为初学者,只要先有顶点法线的概念就行,下面会举一个简单小例子。
矩形平面几何体法线案例——无顶点索引
Three.js中法线是通过顶点定义,默认情况下,每个顶点都有一个法线数据,就像每一个顶点都有一个位置数据。
// 矩形平面,无索引,两个三角形,6个顶点
// 每个顶点的法线数据和顶点位置数据一一对应
const normals = new Float32Array([0, 0, 1, //顶点1法线( 法向量 )0, 0, 1, //顶点2法线0, 0, 1, //顶点3法线0, 0, 1, //顶点4法线0, 0, 1, //顶点5法线0, 0, 1, //顶点6法线
]);
// 设置几何体的顶点法线属性.attributes.normal
geometry.attributes.normal = new THREE.BufferAttribute(normals, 3);
练习代码:
import * as THREE from 'three'
// 创建一个空的几何体顶对象
const geometry = new THREE.BufferGeometry()
// 添加顶点数据
// 类型化数组定义的一组顶点坐标数据
const vertices = new Float32Array([// 矩形平面的第一个三角形0, 0, 0, //顶点1坐标80, 0, 0, //顶点2坐标80, 80, 0, //顶点3坐标// 矩形平面的第二个三角形0, 0, 0, //顶点4坐标 和顶点1位置相同80, 80, 0, //顶点5坐标 和顶点3位置相同0, 80, 0, //顶点6坐标
])
// BufferAttribute属性缓冲对象表示顶点数据
const attribute = new THREE.BufferAttribute(vertices, 3)// 设置几何体的顶点位置属性
geometry.attributes.position = attributeconst normals = new Float32Array([0, 0, 1, //顶点1法向量0, 0, 1, //顶点2法向量0, 0, 1, //顶点3法向量0, 0, 1, //顶点4法向量 和顶点1位置相同0, 0, 1, //顶点5法向量 和顶点3位置相同0, 0, 1, //顶点6法向量
])
// 定义了顶点法线数据或者说顶点法向量数据
geometry.attributes.normal = new THREE.BufferAttribute(normals, 3)// 用网格模型mesh渲染自定义的几何体BufferGeometry
// MeshBasicMaterial
// 不定义法线数据就会无法显示
const material = new THREE.MeshLambertMaterial({color: 0x00ffff, //黄色线条side: THREE.DoubleSide //双面可见 BackSide 背面可见
})const mesh = new THREE.Mesh(geometry,material)
export default mesh
矩形平面几何体法线案例——有顶点索引
// 矩形平面,有索引,两个三角形,有2个顶点重合,有4个顶点
// 每个顶点的法线数据和顶点位置数据一一对应
const normals = new Float32Array([0, 0, 1, //顶点1法线( 法向量 )0, 0, 1, //顶点2法线0, 0, 1, //顶点3法线0, 0, 1, //顶点4法线
]);
// 设置几何体的顶点法线属性.attributes.normal
geometry.attributes.normal = new THREE.BufferAttribute(normals, 3);
7. 查看threejs自带几何体顶点
查看three.js自带几何体顶点结构,基类(父类)BufferGeometry
three.js提供的矩形平面PlaneGeometry、长方体BoxGeometry、球体SphereGeometry等各种形状的几何体,他们都有一个共同的父类BufferGeometry。这意味着这些几何体有哪些属性或方法,你可以查询文档关于BufferGeometry的介绍。
查看几何体顶点位置和索引数据
可以用顶点索引index数据构建几何体,也可以不用,threejs默认的大部分几何体都有三角形的顶点索引数据,具体可以通过浏览器控制台打印几何体数据查看。
const geometry = new THREE.PlaneGeometry(100,50); //矩形平面几何体
// const geometry = new THREE.BoxGeometry(50,50,50); //长方体console.log('几何体',geometry);
console.log('顶点位置数据',geometry.attributes.position);
console.log('顶点索引数据',geometry.index);
材质属性.wireframe
线条模式渲染,查看几何体三角形结构
const material = new THREE.MeshLambertMaterial({color: 0x00ffff, wireframe:true,//线条模式渲染mesh对应的三角形数据
});
几何体细分数
Three.js很多几何体都提供了细分数相关的参数,这里以矩形平面几何体PlaneGeometry为例介绍。
矩形平面几何体至少需要两个三角形拼接而成。
//矩形几何体PlaneGeometry的参数3,4表示细分数,默认是1,1
const geometry = new THREE.PlaneGeometry(100,50,1,1);
把一个矩形分为2份,每个矩形2个三角形,总共就是4个三角形
const geometry = new THREE.PlaneGeometry(100,50,2,1);
把一个矩形分为4份,每个矩形2个三角形,总共就是8个三角形
const geometry = new THREE.PlaneGeometry(100,50,2,2);
球体SphereGeometry细分数
球体SphereGeometry参数2、3分别代表宽、高度两个方向上的细分数,默认32,16,具体多少以你所用版本为准。
const geometry = new THREE.SphereGeometry( 50, 32, 16 );
如果球体细分数比较低,表面就不会那么光滑。
const geometry = new THREE.SphereGeometry( 15, 8, 8 );
三角形数量与性能
对于一个曲面而言,细分数越大,表面越光滑,但是三角形和顶点数量却越多。
几何体三角形数量或者说顶点数量直接影响Three.js的渲染性能,在不影响渲染效果的情况下,一般尽量越少越好。
代码:
import * as THREE from "three";
// 创建一个空的几何体顶对象
// const geometry = new THREE.BoxGeometry(100,100,100) //长方体
// const geometry = new THREE.PlaneGeometry(100, 100,2,2); //矩形平面
const geometry = new THREE.SphereGeometry(50, 32, 16); //矩形平面
console.log(".position", geometry.attributes.position);
console.log(".index", geometry.index); //36个数据,每个点有三个坐标信息const material = new THREE.MeshLambertMaterial({color: 0x00ffff, //黄色线条wireframe:true,//线条模式渲染mesh对应的三角形数据
});const mesh = new THREE.Mesh(geometry, material);
export default mesh;
8. 旋转、缩放、平移几何体
BufferGeometry通过.scale()、.translate()、.rotateX()、.rotateY()等方法可以对几何体本身进行缩放、平移、旋转,这些方法本质上都是改变几何体的顶点数据。
// 几何体xyz三个方向都放大2倍
geometry.scale(2, 2, 2);
// 几何体沿着x轴平移50
geometry.translate(50, 0, 0);
// 几何体绕着x轴旋转45度
geometry.rotateX(Math.PI / 4);
// 几何体旋转、缩放或平移之后,查看几何体顶点位置坐标的变化
// BufferGeometry的旋转、缩放、平移等方法本质上就是改变顶点的位置坐标
console.log('顶点位置数据', geometry.attributes.position);
缩放.scale()
// 几何体xyz三个方向都放大2倍
geometry.scale(2, 2, 2);// 几何体旋转、缩放或平移之后,查看几何体顶点位置坐标的变化
// BufferGeometry的旋转、缩放、平移等方法本质上就是改变顶点的位置坐标
console.log('顶点位置数据', geometry.attributes.position);
平移.translate()
// 几何体沿着x轴平移50
geometry.translate(50, 0, 0);
旋转.rotateX()、.rotateY()、.rotateZ()
// 几何体绕着x轴旋转45度
geometry.rotateX(Math.PI / 4);
居中.center()
geometry.translate(50, 0, 0);//偏移
// 居中:已经偏移的几何体居中,执行.center(),你可以看到几何体重新与坐标原点重合
geometry.center();
代码:
import * as THREE from "three";
// 创建一个空的几何体顶对象
const geometry = new THREE.PlaneGeometry(100, 100); //矩形平面
// geometry.scale(2, 2, 2); //缩放
geometry.translate(50, 0, 0);
// geometry.rotateX(-Math.PI / 2); //绕x轴旋转90度
// 居中
geometry.center()
console.log(".position", geometry.attributes.position);
// console.log(".index", geometry.index); //36个数据,每个点有三个坐标信息const material = new THREE.MeshLambertMaterial({color: 0x00ffff, //黄色线条// wireframe:true,//线条模式渲染mesh对应的三角形数据side: THREE.DoubleSide, //两面可见
});const mesh = new THREE.Mesh(geometry, material);
export default mesh;
相关文章:

threejs几何体BufferGeometry顶点
1. 几何体顶点位置数据和点模型 本章节主要目的是给大家讲解几何体geometry的顶点概念,相对偏底层一些,不过掌握以后,你更容易深入理解Threejs的几何体和模型对象。 缓冲类型几何体BufferGeometry threejs的长方体BoxGeometry、球体SphereGeometry等几…...

向量数据库选型实战指南:Milvus架构深度解析与技术对比
导读:随着大语言模型和AI应用的快速普及,传统数据库在处理高维向量数据时面临的性能瓶颈日益凸显。当文档经过嵌入模型处理生成768到1536维的向量后,传统B-Tree索引的检索效率会出现显著下降,而现代应用对毫秒级响应的严苛要求使得…...

java方法重写学习笔记
方法重写介绍 子类和父类有两个返回值,参数,名称都一样的方法, 子类的方法会覆盖父类的方法。 调用 public class Overide01 {public static void main(String[] args) {Dog dog new Dog();dog.cry();} }Animal类 public class Animal {…...
解决WPF短暂的白色闪烁(白色闪屏)
在 WPF 应用程序启动时出现 短暂的白色闪烁(白色闪屏),通常是由于以下原因导致的: 主要原因 WPF 默认窗口背景是白色,在加载 UI 之前会短暂显示白色背景。 解决方案 设置窗口背景为透明或黑色(推荐&…...
如何在Java中处理PDF文档(教程)
在开发文档管理系统、自动化工具或商业应用程序时,Java开发者常需处理PDF文档的编辑需求。无论是添加页面、调整内容尺寸、插入水印还是添加注释,选择一套可靠易用的Java PDF开发工具包至关重要。 JPedal(Java PDF开发工具包)的新…...

TensorBoard安装与基本操作指南(PyTorch)
文章目录 什么是TensorBoard?TensorBoardX与TensorBoard的依赖关系易混关系辨析Pytorch安装TensorBoard并验证1. TensorBoard安装和访问2. TensorBoard主要界面介绍实用技巧 什么是TensorBoard? TensorBoard是TensorFlow生态系统中的一款强大的可视化工…...
基于PyTorch的残差网络图像分类实现指南
以下是一份超过6000字的详细技术文档,介绍如何在Python环境下使用PyTorch框架实现ResNet进行图像分类任务,并部署在服务器环境运行。内容包含完整代码实现、原理分析和工程实践细节。 基于PyTorch的残差网络图像分类实现指南 目录 残差网络理论基础服务…...

2025/5/25 学习日记 linux进阶命令学习
tree:以树状结构显示目录下的文件和子目录,方便直观查看文件系统结构。 -d:仅显示目录,不显示文件。-L [层数]:限制显示的目录层级(如 -L 2 表示显示当前目录下 2 层子目录)。-h:以人类可读的格…...

【MPC控制 - 从ACC到自动驾驶】4 MPC的“实战演练”:ACC Simulink仿真与结果深度解读
【MPC控制 - 从ACC到自动驾驶】MPC的“实战演练”:ACC Simulink仿真与结果深度解读 在过去的几天里,我们一起: Day 1: 认识了ACC这位聪明的“跟车小能手”和MPC这位“深谋远虑的棋手”。Day 2: 给汽车“画了像”,建立了它的纵向…...
【时时三省】Python 语言----牛客网刷题笔记
目录 1,常用函数 1,input() 2,map() 3,split() 4,range() 5, 切片 6,列表推导式 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,常用函数 1,input() 该函数遇到 换行停止接收,返回类型为字符串 2,map() 该函数出镜率较高,目的是将一个可迭…...

OPENEULER搭建私有云存储服务器
一、关闭防火墙和selinux 二、下载相关软件 下载nginx,mariadb、php、nextcloud 下载nextcloud: sudo wget https://download.nextcloud.com/server/releases/nextcloud-30.0.1.zip sudo unzip nextcloud-30.0.1.zip -d /var/www/html/ sudo chown -R…...
PyQt学习系列10-性能优化与调试技巧
PyQt学习系列笔记(Python Qt框架) 第十课:PyQt的性能优化与调试技巧 课程目标 掌握 PyQt应用的性能优化策略(内存管理、渲染优化、多线程)学习 调试技巧(日志输出、断点设置、性能分析工具)解…...

卷积神经网络(CNN)深度讲解
卷积神经网络(CNN) 本篇博客参考自大佬的开源书籍,帮助大家从头开始学习卷积神经网络,谢谢各位的支持了,在此期待各位能与我共同进步 卷积神经网络(CNN)是一种特殊的深度学习网络结构&#x…...

Docker部署Zookeeper集群
简介 ZooKeeper 是一个开源的分布式协调服务,由 Apache 软件基金会开发和维护。它主要用于管理和协调分布式系统中的多个节点,以解决分布式环境下的常见问题,如配置管理、服务发现、分布式锁等。ZooKeeper 提供了一种可靠的机制,…...

数据结构—(概述)
目录 一 数据结构,相关概念 1. 数据结构: 2. 数据(Data): 3. 数据元素(Data Element): 4. 数据项: 5. 数据对象(Data Object): 6. 容器(container): 7. 结点(Node)ÿ…...
python打卡day34
GPU训练及类的call方法 知识点回归: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前向传播时可以直接写作…...

华为OD机试真题—— 流水线(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

【数据架构01】数据技术架构篇
✅ 9张高质量数据架构图:大数据平台功能架构、数据全生命周期管理图、AI技术融合架构等; 🚀无论你是数据架构师、治理专家,还是数字化转型负责人,这份资料库都能为你提供体系化参考,高效解决“架构设计难、…...
【安全攻防与漏洞】HTTPS中的常见攻击与防御
HTTPS 中常见攻击与防御策略涵盖中间人攻击(MITM)、SSL剥离、重放攻击等,帮助构建安全的 HTTPS 通信环境: 一、中间人攻击(MITM) 攻击原理 场景:攻击者通过伪造证书或劫持网络流量,…...
esp32cmini SK6812 2个方式
1 #include <SPI.h> // ESP32-C系列的SPI引脚 #define MOSI_PIN 7 // ESP32-C3/C6的SPI MOSI引脚 #define NUM_LEDS 30 // LED灯带实际LED数量 - 确保与实际数量匹配! #define SPI_CLOCK 10000000 // SPI时钟频率 // 颜色结构体 st…...

【数据集】30 m地表温度LST数据集
目录 数据概述🔧研究目标与意义🧠 算法核心组成1. 地表比辐射率(LSE)估算2. 大气校正(Atmospheric Correction)LST反演流程图📊 精度验证与评估结果参考《Generating the 30-m land surface temperature product over continental China and USA from Landsat 5/7/8 …...

【CATIA的二次开发07】草图编辑器对象结构及应用
【CATIA的二次开发07】草图编辑器对象结构及应用 草图编辑器(SketchEditor)是用于创建和编辑2D草图的核心对象。其对象结构遵循CATIA的层级关系,以下是详细说明及代码示例: 一、核心对象结构图 Application │ └─ Documents│└─ Document (.CATPart)│└─ Part│└─…...

IT | 词汇科普手册Ⅱ
目录 1.报文(Message) 2.Token(令牌) Token vs. Cookie Token vs. Key "碰一碰"支付 3.NFC 4.Nginx 5.JSON 6.前置机 前置机vs.Nginx反向代理 以PDA、WMS举例前置机场景 7.RabbitMQ 核心功能 1.报文(Message) 报文(Message)是系统或组件之…...

【 java 基础问题 第一篇 】
目录 1.概念 1.1.java的特定有哪些? 1.2.java有哪些优势哪些劣势? 1.3.java为什么可以跨平台? 1.4JVM,JDK,JRE它们有什么区别? 1.5.编译型语言与解释型语言的区别? 2.数据类型 2.1.long与int类型可以互转吗&…...
以前端的角度理解 Kubernetes(K8s)
作为一名前端开发者,我们每天都在与 React、Vue、Webpack 等工具打交道,而 Kubernetes(K8s)听起来更像是后端或运维的“专属领域”。但实际上,K8s 的核心思想和前端开发中的某些模式高度相似。那么咱们用熟悉的类比帮助…...

自用git记录
像重复做自己在网上找的练习题,这种类型的git仓库管理,一般会用到以下命令: git revert a1b2c3 很复杂的git历史变成简单git历史 能用git rebase -i HEAD~5^这种命令解决,就最好(IDEA还带GUI,很方便&…...
pyhton基础【2】基本语法
一. 注释 单行注释 以#开头,#右边的所有的内容当做说明,起辅助说明作用 # 我是一个单行注释 print(Hello) 多行注释 """ 在三引号中的注释被称之为多行注释 可以写很多行的功能说明 """ 二. 交互模式 终端输入代码…...
python数据结构-列表详解
Python中的列表(List)是一种序列类型的数据结构,它支持元素的动态添加和删除,可以容纳任意类型的数据,包括数字、字符串、甚至是其他列表或其他复杂数据结构。列表因其灵活性和广泛的应用场景,成为Python中最常用的数据结构之一。…...

本地环境下 前端突然端口占用问题 针对vscode
1.问题背景 本地运行前端代码,虚拟机中使用nginx反向代理。两者都使用vscode进行开发。后端使用vscode远程连接。在前端发起一次接口请求后,后端会产生新的监听端口,出现如下图的提示情况。随后前端刷新,甚至无法正常显示界面。 …...
flutter 项目调试、flutter run --debug调试模式 devtools界面说明
Flutter DevTools 网页界面说明 1. 顶部导航栏 Inspector:查看和调试 Widget 树,实时定位 UI 问题。Performance-- 性能分析面板,查看帧率、CPU 和 GPU 使用情况,识别卡顿和性能瓶颈。Memory-- 内存使用和对象分配分析ÿ…...