Three.js 学习笔记之模型(学习中1.20更新) | 组 - 模型 - 几何体 - 材质

文章目录

  • 模型 = 几何体 + 材质
    • 层级模型
      • 组- THREE.Group
      • 递归遍历模型树结构object3D.traverse()
    • 模型
    • 点模型Points - 用于显示点
      • 线模型Line | LineLoop | LineSegments
      • 网格模型mesh - 三角形
        • 网格模型独有的属性与方法
    • 几何体BufferGeometry
      • 缓冲类型几何体BufferGeometry - 基类
        • 创建几何体的方式
        • BufferAttribute Types
          • 定义顶点法线 geometry.attributes.normal
      • BufferGeometry的子类几何体
        • 几何体的分段数 - 将一个大块分成几个小块
        • SphereGeometry 球体
      • 几何体的旋转、缩放与平移
    • 材质 Material
      • 点材质PointsMaterial - Points使用的默认材质
      • 网格材质 Mesh
        • MeshLambertMaterial
        • 高光网格材质 MeshPhongMaterial

模型 = 几何体 + 材质

  • 模型对象的父类都是三维物体Object3D

  • Three.js的材质默认正面可见、背面不可见

    • 解决办法:材质配置对象中设置side属性
    side取值描述
    THREE.FrontSide只有正面可见
    THREE.DoubleSide两面可见
    THREE.BackSide设置只有背面可见
  • 模型position是指模型中心的位置,是一个三维向量。几何体attributes.position是指几何体顶点位置信息,是一个BufferAttribute类型

三维物体Object3D类的属性与方法

属性与方法描述
position : Vector3设置模型中心的位置,默认值THREE.Vector3(0.0,0.0,0.0)
translateX/translateY/translateZ ( distance : Float )沿着X轴将平移distance个单位,本质改变的position 值
translateOnAxis ( axis : Vector3, distance : Float )沿着标准化后的向量axis(归一化后的向量表示方向)移动distance
scale : Vector3各分量按参数缩放
rotation:Euler(欧拉对象) 或quaternion:Quaternion(四元数)模型旋转的角度,单位是火毒
rotateX(rad : Float)、rotateY(rad : Float)、rotateZ(rad : Float)绕局部空间的X/Y/Z轴旋转这个物体。本质是修改模型的角度属性.rotation
rotateOnAxis ( axis : Vector3, angle : Float )绕标准化后的向量(看作轴)旋转angle个弧度
clone ( recursive : Boolean ) : Object3D参数表示是否可以克隆参数的后代,默认为true

克隆的规则暂时还不清楚,但克隆模型,其几何体和材质是共享的(克隆的地址)。
如果几何体和材质单独调用clone克隆出来是独立的。
copy ( object : Object3D, recursive : Boolean )复制参数对象到这个对象中。 事件监听器和用户定义的回调函数不会被复制。
children:Array子对象数组(分组对象的子孩子),调用三维物体实例的add方法时,实际就是将参数加入到该数组中。
add (object: Object3D, …)添加参数对象到这个对象的子级children,可以添加任意数量的对象。 当前传入的对象中的父级将在这里被移除,因为一个对象仅能有一个父级。
name : String对象的名称,可选、不必唯一。默认值是一个空字符串。
getObjectByName (name:String):Object3D从该对象开始,搜索一个对象及其子级,返回第一个带有匹配name的子对象。
const axis = new THREE.Vector3(1, 1, 1);
axis.normalize(); //向量归一化后表示方向,方向不变,大小变为单位向量
//沿着axis轴表示方向平移100
mesh.translateOnAxis(axis, 100);

层级模型

组- THREE.Group

语法:new THREE.Group()
说明:其父类也是三维物体Object3D,基本和三维物体Object3D一致。可以看作一个只用于分组没有实体的模型,可以分组操作模型。
作用:可以看作将模型进行分组,原来是直接将一个一个模型add进场景scene,现在是将所有模型先进行分组,然后将分组后的分组模型group添加进场景scene

受threejs历史原因,有些时候代码中也会直接用Object3D甚至Mesh作为Group使用,可以但不推荐,语义化不够强。

group可以看作mesh1mesh2的父对象,父对象旋转缩放平移变换,子对象跟着变化
在这里插入图片描述

//创建两个网格模型mesh1、mesh2
const geometry = new THREE.BoxGeometry(20, 20, 20);
const material = new THREE.MeshLambertMaterial({color: 0x00ffff});
// 创建一个组
const group = new THREE.Group();
const mesh1 = new THREE.Mesh(geometry, material);
const mesh2 = new THREE.Mesh(geometry, material);
mesh2.translateX(25);
//把mesh1型插入到组group中,mesh1作为group的子对象
group.add(mesh1);
//把mesh2型插入到组group中,mesh2作为group的子对象
group.add(mesh2);
//把group插入到场景中作为场景子对象
scene.add(group);

组对象私有的属性(无私有方法)

属性名描述
isGroup:Boolean判断是否是组对象
type:String不可变的值,组对象的类型Group字符串

递归遍历模型树结构object3D.traverse()

语法:object3D.traverse ( callback : Function ) : undefined
本质:遍历object3D实例的children属性

每个模型可以通过object3D.name属性命名,命名之后可以通过遍历模型树搭配object3D.getObjectByName(name) ,找到具体的模型。

案例:假设有一个小区房子,结构如下
在这里插入图片描述

// 批量创建多个长方体表示高层楼
const group1 = new THREE.Group(); //所有高层楼的父对象
group1.name = "高层";
for (let i = 0; i < 5; i++) {
    const geometry = new THREE.BoxGeometry(20, 60, 10);
    const material = new THREE.MeshLambertMaterial({
        color: 0x00ffff
    });
    const mesh = new THREE.Mesh(geometry, material);
    mesh.position.x = i * 30; // 网格模型mesh沿着x轴方向阵列
    group1.add(mesh); //添加到组对象group1
    mesh.name = i + 1 + '号楼';
    // console.log('mesh.name',mesh.name);
}
group1.position.y = 30;


const group2 = new THREE.Group();
group2.name = "洋房";
// 批量创建多个长方体表示洋房
for (let i = 0; i < 5; i++) {
    const geometry = new THREE.BoxGeometry(20, 30, 10);
    const material = new THREE.MeshLambertMaterial({
        color: 0x00ffff
    });
    const mesh = new THREE.Mesh(geometry, material);
    mesh.position.x = i * 30;
    group2.add(mesh); //添加到组对象group2
    mesh.name = i + 6 + '号楼';
}
group2.position.z = 50;
group2.position.y = 15;

const model = new THREE.Group();
model.name='小区房子';
model.add(group1, group2);
model.position.set(-50,0,-25);


// 递归遍历model包含所有的模型节点
model.traverse(function(obj) {
    console.log('所有模型节点的名称',obj.name);
    // obj.isMesh:if判断模型对象obj是不是网格模型'Mesh'
    if (obj.isMesh) {//判断条件也可以是obj.type === 'Mesh'
        obj.material.color.set(0xffff00);
    }
});

模型

点模型Points - 用于显示点

语法:new Points( geometry : BufferGeometry, material : Material )

  • geometry 几何体对象(可选),BufferGeometry的实例,默认值是一个新的BufferGeometry
  • material 材质对象(可选),默认值为PointsMaterial

描述:一个用于显示点的类,将几何体geometry渲染成点。

线模型Line | LineLoop | LineSegments

语法:new Line( geometry : BufferGeometry, material : Material )

  • geometry 线段的顶点,默认值是一个新的BufferGeometry
  • material 线的材质,默认值是一个新的且随机颜色的LineBasicMaterial
线模型绘制线条的规则
Line从第一个点开始到最后一个点,依次连成线
不闭合
LineLoop从第一个点开始到最后一个点,依次连成线,并将最后一个顶点连回第一个顶点
闭合
LineSegments从第一个点开始,第一个点连接第二个点,第三个点连接第四个点…有n个点,就有n/2条线
间断

网格模型mesh - 三角形

本质:一个一个三角形拼接
说明:几何体所有顶点坐标三个为一组,构成一个三角形,多组顶点构成多个三角形,用来模拟物体的表面。
在这里插入图片描述
三角形的正反面
三个点可以构成一个三角形,从第一个点往第三个点连接

  • 正面:相机对着面,连接的顺序是逆时针
  • 反面:相机对着面,连接的顺序是顺时针
网格模型独有的属性与方法
字段描述
isMesh : Boolean当前对象是否时网格模型
geometry : BufferGeometry物体的结构
material : Material物体的外观,默认值是一个MeshBasicMaterial
const mesh = new THREE.Mesh(geometry, material);
// 获取模型的几何体
console.log('mesh.geometry',mesh.geometry);
// 获取模型的材质
console.log('mesh.material',mesh.material);

几何体BufferGeometry

常见几何体可以看成是封装后的BufferGeometry

缓冲类型几何体BufferGeometry - 基类

描述:BufferGeometry是一个没有任何形状的空几何体,通过定义顶点数据将BufferGeometry自定义为任何几何形状。每个几何体可以看作是由多个顶点构成的图案。

BufferGeometry实例的属性与方法

属性名/方法描述
index:BufferAttribute绑定几何体的顶点索引,每个三角形都绑定了三个顶点的索引。
允许顶点坐标在三角形中复用。
attributes : Object存储该几何体相关属性的hashmap (这里直接打印看不见里面的属性),每个value的类型都是BufferAttribute
可以通过 几何体.setAttribute几何体.getAttribute 添加和访问与当前几何体相关的属性。

案例
1.使用 THREE.BufferGeometry创建一个空的几何体对象

const geometry = new THREE.BufferGeometry(); 

2.利用Float32Array定义顶点数据,使用属性缓冲区对象BufferAttribute表示threejs几何体顶点数据。

通过javascript类型化数组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坐标
]);
// 创建属性缓冲区对象,3个为一组,表示一个顶点的xyz坐标
const attribue = new THREE.BufferAttribute(vertices, 3);

3.设置几何体的定点.attributes.position

// 设置几何体attributes属性的位置属性
geometry.attributes.position = attribue;

在这里插入图片描述

4.渲染顶点

4.1使用点模型渲染顶点数据,会把几何体渲染为点,网格模型Mesh会把几何体渲染为面。

// 点渲染模式
const material = new THREE.PointsMaterial({
    color: 0xffff00,
    size: 10.0 //点对象像素尺寸
}); 
const points = new THREE.Points(geometry, material); //点模型对象

在这里插入图片描述

4.2使用线模型渲染顶点数据,从第一个点开始到最后一个点,依次连成线。

// 线材质对象
const material = new THREE.LineBasicMaterial({
    color: 0xff0000 //线条颜色
}); 
// 创建线模型对象
const line = new THREE.Line(geometry, material);

在这里插入图片描述
4.3用网格模型渲染顶点

const material = new THREE.MeshBasicMaterial({
    side: THREE.DoubleSide, //两面可见
});

在这里插入图片描述

创建几何体的方式
  • 直接利用顶点数据,每一个点对应一个坐标
    • new Float32Array构造坐标数组 | 32位的浮点数型数组
    • THREE.BufferAttribute(坐标数组,3) 每三个坐标为一组,构建顶点坐标。顶点的个数等于组数
    • 赋值给geometry.attributes.position
  • 利用顶点索引,多个顶点可以利用同一个坐标
    • new Float32Array构造坐标数组
    • THREE.BufferAttribute(坐标数组,3) 每三个坐标为一组,构建顶点坐标。
    • new Uint16Array 构造索引顶点数组,顶点的个数需要和索引的个数一样 | 16 位无符号整数
    • geometry.index = new THREE.BufferAttribute(indexes, 1) 通过索引去坐标数组中取顶点坐标

案例: 构建一个矩形平面几何体 - 通过顶点数据
顶点坐标:一个矩形平面,可以至少通过两个三角形拼接而成。
三角形方向:两个三角形的正面需要保持一致
在这里插入图片描述

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坐标
]);
const attribue = new THREE.BufferAttribute(vertices, 3);
geometry.attributes.position = attribue;

几何体顶点索引数据 - 通过顶点索引
在上述案例中,坐标4和坐标5其实是重复的坐标,重复的坐标可以复用吗?

// 删除重复的坐标
const vertices = new Float32Array([
    0, 0, 0, //顶点1坐标 | 索引0
    80, 0, 0, //顶点2坐标 4坐标 | 索引1
    80, 80, 0, //顶点3坐标 5坐标 | 索引2
    0, 80, 0, //顶点6坐标 | 索引3
]);

// Uint16Array类型数组创建顶点索引数据
const indexs = new Uint16Array([
    // 下面索引值对应顶点位置数据中的顶点坐标
    0, 1, 2, 0, 2, 3,
])

// 索引数据赋值给几何体的index属性 1个为1组
geometry.index = new THREE.BufferAttribute(indexs, 1); 
BufferAttribute Types

three.js 中一共有 9 种 BufferAttribute,每种和 JavaScript 中的类型相对应Typed Arrays使用new创建BufferAttribute对象时,传入数组是什么内省,生成的BufferAttribute就是什么类型

BufferAttribute 类型对应的JS数组类型
THREE.Float64BufferAttributeFloat64Array
THREE.Uint32BufferAttributeUint32Array
THREE.Int32BufferAttributeInt32Array
THREE.Uint16BufferAttributeUint16Array
THREE.Int16BufferAttributeInt16Array
THREE.Uint8ClampedBufferAttributeUint8ClampedArray
THREE.Uint8BufferAttributeUint8Array
THREE.Int8BufferAttributeInt8Array
定义顶点法线 geometry.attributes.normal

数学上法线的概念
一个平面,法线的就是改平面的垂线,如果是光滑曲面,一点的法线就是该点切面的法线。

Three.js中法线是通过顶点定义,默认情况下,每个顶点都有一个法线数据。

无顶点索引的使用方式

const vertices = new Float32Array([
    0, 0, 0, //顶点1坐标
    80, 0, 0, //顶点2坐标
    80, 80, 0, //顶点3坐标
    0, 0, 0, //顶点4坐标
    80, 80, 0, //顶点5坐标
    0, 80, 0, //顶点6坐标
]);
geometry.attributes.position =new THREE.BufferAttribute(vertices, 3);
const material = new THREE.MeshLambertMaterial({
    color: 0xff0000, //线条颜色
    side: THREE.DoubleSide
}); 
// 矩形平面,无索引,两个三角形,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); 

有顶点索引的使用方式

const vertices = new Float32Array([
    0, 0, 0, //顶点1坐标 顶点4坐标
    80, 0, 0, //顶点2坐标
    80, 80, 0, //顶点3坐标 顶点5坐标
    0, 80, 0, //顶点6坐标
]);
geometry.attributes.position =new THREE.BufferAttribute(vertices, 3);
// 矩形平面,有索引,两个三角形,有2个顶点重合,有4个顶点
// Uint16Array类型数组创建顶点索引数据
const indexs = new Uint16Array([
    // 下面索引值对应顶点位置数据中的顶点坐标
    0, 1, 2, 0, 2, 3,
])
geometry.index = new THREE.BufferAttribute(indexs, 1); 
// 每个顶点的法线数据和顶点位置数据一一对应
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);

BufferGeometry的子类几何体

在这里插入图片描述

几何体的分段数 - 将一个大块分成几个小块

很多几何体构造函数提供了分段数,其默认值为1。除去必要参数之外的第一个参数表示x轴分成几段,第二个参数表示y轴分成几段。

PlaneGeometry矩形平面案例

// 把一个矩形x轴方向分为两段,每份2个三角形,一共4个三角形
const geometry = new THREE.PlaneGeometry(50,50,2,1);

在这里插入图片描述
SphereGeometry球体平面案例

// 参数2表示水平方向(经线方向)  参数3表示垂直方向(维度)
// 绿色框为一块,每个水平方向有4块,每一块由两个三角形组成
const geometry = new THREE.SphereGeometry( 50, 4, 16 );

在这里插入图片描述

SphereGeometry 球体

语法:new SphereGeometry(radius : Float,可选参数)

由于所有几何体都是由一个一个三角形组成,所以如果球体细分数比较低,表面就不会那么光滑,分段数越大越接近一个球。

可选参数描述
widthSegments水平分段数(沿着经线分段),最小值为3,默认值为32。
heightSegments垂直分段数(沿着纬线分段),最小值为2,默认值为16。

几何体的旋转、缩放与平移

本质:几何变换的本质是改变几何体的顶点数据
在这里插入图片描述

方法描述
scale ( x : Float, y : Float, z : Float )从几何体原始位置开始缩放几何体
translate ( x : Float, y : Float, z : Float )从几何体原始位置开始移动几何体
rotateX/rotateY/rotateZ( radians : Float )沿着主轴旋转几何体,参数是弧度
center()几何体中心与坐标原点重合
// 几何体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);

材质 Material

材质Material是所有材质的父类。

创建材质:new 材质(配置对象)
说明:材质描述了物体的外观,定义方式与渲染器无关

配置对象里可配置的属性其实就是返回的材质实例拥有的属性

/* 案例 */
const material = new THREE.MeshLambertMaterial({
  color:0xff0000,
  wireframe:true,
});
console.log("material.wireframe:",material.wireframe)
方法与属性描述
transparent : Boolean定义此材质是否透明,默认为false。对渲染有影响,透明对象需要特殊处理,并在非透明对象之后渲染。设置为true之后可以使用opacity调整透明度。
opacity:Float范围是0.0 - 1.0,表明材质的透明度。值0.0表示完全透明,1.0表示完全不透明(默认)。如果transparent属性未设置为true,则材质将保持完全不透明,此值仅影响其颜色。
side:Integer定义将要渲染哪一面,默认是正面(相机照着那面,连接的顺序是逆时针)

点材质PointsMaterial - Points使用的默认材质

语法:new PointsMaterial( parameters : Object )

实例的属性和方法

属性/方法描述
size:Number设置点的大小,默认值为1.0。
color:Color材质的颜色,默认值为白色 (0xffffff)。

网格材质 Mesh

在这里插入图片描述
使用收光照影响的材质时,如果没有光照默认是黑色的(renderer画布设置了颜色可以看出)

MeshLambertMaterial

语法:new MeshLambertMaterial( parameters : Object )
对光照的反射为漫反射:光线向四周反射。
在这里插入图片描述

Lambert网格材质的属性与方法

属性和方法描述
wireframe : Boolean将几何体渲染为线框,默认值为false,渲染为平面多边形。
高光网格材质 MeshPhongMaterial
  • 语法:new MeshPhongMaterial( parameters : Object )
    参数对象的属性 = 自有属性 + Material基类继承的属性
  • 对光照的反射为镜面反射:想象一面镜子的反射,如果刚好反射光对眼睛,会非常刺眼(某个局部区域高亮,像擦了高光)

注意:AmbientLight环境光没有方向,整体改变场景的光照。所以只有环境光的,高光效果会失效。

MeshPhongMaterial高光网格材质配置参数的自有属性

属性名属性描述
color : Color材质的颜色,默认值为白色(0xffffff)
shininess高亮的程度,越高的值越闪亮,默认30
specular高光颜色,默认为0x111111灰色

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

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

相关文章

位运算的奇技淫巧

常见位运算总结&#xff1a; 1、基础位运算 左移<<运算 将二进制数向左移位操作&#xff0c;高位溢出则丢弃&#xff0c;低位补0。 右移>>运算 右移位运算中&#xff0c;无符号数和有符号数的运算并不相同。对于无符号数&#xff0c;右移之后高位补0&#xff…

SpringCloud Aliba-Sentinel【中篇】-从入门到学废【5】

&#x1f3b5;歌词分享&#x1f3b5; 岁月在墙上剥落看见小时候。 ——《东风破》 目录 &#x1f953;1.流控规则 &#x1f32d;2. 熔断规则 &#x1f9c8;3.热点规则 &#x1f9c2;4.系统规则 1.流控规则 1.资源名&#xff1a;唯一名称&#xff0c;默认请求路径 2.针对来…

【开源】基于JAVA语言的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

[AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

SpringBoot项目中简单使用虚拟机Redis

目录 步骤大致如下&#xff1a; 一.在pom文件中加入redis依赖 二.在虚拟机上打开我们下载好的Redis。开启服务器端并获取虚拟机ip地址 三.在项目配置。 四&#xff1a;使用redis 测试 redis是一个以键值对存储的NoSQL。被数百万开发人员用作缓存、矢量数据库、文档数据库、…

beego项目部署与热更新

1.开发自己的第一个项目 这里我引用的是在线聊天室&#xff0c;参考源码是https://github.com/beego/samples/tree/master/WebIM 在源码的基础上重新开发&#xff0c;整理项目发布到了liu289747235/WebIM 推荐下载源码&#xff1a;https://gitee.com/myselfyou/web-im 在线…

kafka参数配置参考和优化建议 —— 筑梦之路

对于Kafka的优化&#xff0c;可以从以下几个方面进行思考和优化&#xff1a; 硬件优化&#xff1a;使用高性能的硬件设备&#xff0c;包括高速磁盘、大内存和高性能网络设备&#xff0c;以提高Kafka集群的整体性能。 配置优化&#xff1a;调整Kafka的配置参数&#xff0c;包括…

go语言(七)----slice的声明方式

1、声明方式一 //声明一个slice1是一个切片&#xff0c;但是并没有给slice分配空间var slice1 []intslice1 make([]int,3)2、声明方式二 声明一个slice切片&#xff0c;同时给slice分配空间&#xff0c;3个空间&#xff0c;初始化值是0var slice1 []int make([]int,3)3、声…

Docker:6种网络配置详解浅介

在Docker中&#xff0c;网络配置是一个重要的主题&#xff0c;因为容器需要与其他容器或外部网络进行通信。Docker提供了多种网络模式和配置选项&#xff0c;以便在不同的场景下满足用户的需求。 本文介绍这些网络模式的区别以及配置&#xff0c;相信看完以后你能够掌握Docker网…

基于springboot+vue养老院管理系统

摘要 这是一个基于Spring Boot 和 Vue.js 的养老院管理系统的项目。该系统旨在提供一套全面的解决方案&#xff0c;以简化养老院的日常管理任务&#xff0c;包括居民信息管理、员工调度、医疗服务追踪、财务管理等。通过结合后端的Spring Boot框架和前端的Vue.js框架&#xff0…

【LeetCode】每日一题 2024_1_20 按分隔符拆分字符串(模拟/库函数)

文章目录 随便聊聊时间题目&#xff1a;按分隔符拆分字符串题目描述代码与解题思路 随便聊聊时间 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 时隔半个月&#xff0c;LeetCode 每日一题重新开张&#xff0c;寒假学习&#xff0c;正式开始 题目&#xff1…

算法笔记(动态规划入门题)

1.找零钱 int coinChange(int* coins, int coinsSize, int amount) {int dp[amount 1];memset(dp,-1,sizeof(dp));dp[0] 0;for (int i 1; i < amount; i)for (int j 0; j < coinsSize; j)if (coins[j] < i && dp[i - coins[j]] ! -1)if (dp[i] -1 || dp[…

calloc与realloc和malloc的区别以及new

目录 calloc、realloc 和 malloc 三个函数的区别在于 更详细的示例代码 交叉使用 内存泄漏 悬空指针 内存重叠 new 的语法 使用 new 运算符在堆上创建学生对象的示例 new和malloc都可以用于在堆上分配内存 calloc、realloc 和 malloc 是 C/C 中用于动态内存分配的函…

链表的相交

链表的相交 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/intersection-of-tw…

【NVIDIA】Jetson Orin Nano系列:安装 Qt6、firefox、jtop、flameshot

1、使用命令安装 sudo apt install qtcreator sudo apt install qt6-* sudo apt install libqt6* sudo apt install qml-qt6 sudo apt install qmlscene-qt6 sudo apt install assistant-qt6 sudo apt install designer-qt62、启动 qtcreator 3、常用工具安装 sudo apt in…

ros2学习笔记-CLI工具,记录命令对应操作。

目录 环境变量turtlesim和rqt以初始状态打开rqt node启动节点查看节点列表查看节点更多信息命令行参数 --ros-args topic话题列表话题类型话题列表&#xff0c;附加话题类型根据类型查找话题名查看话题发布的数据查看话题的详细信息查看类型的详细信息给话题发布消息&#xff0…

线程状态转换

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程⛺️稳中求进&#xff0c;晒太阳 程状态转换 假设有线程Thread t 情况1 new-->RUNNABLE 当调用t.start()方法时&#xff0c;由new ->RUNNABLE 情况2 RUNNABLE WAITING t…

无/自监督去噪(1)——一个变迁:N2N→N2V→HQ-SSL

目录 1. 前沿2. N2N3. N2V——盲点网络&#xff08;BSNs&#xff0c;Blind Spot Networks&#xff09;开创者3.1. N2V实际是如何训练的&#xff1f; 4. HQ-SSL——认为N2V效率不够高4.1. HQ-SSL的理论架构4.1.1. 对卷积的改进4.1.2. 对下采样的改进4.1.3. 比N2V好在哪&#xff…

c++基础2

一、c的引用 引用和指针的的区别&#xff1f; 引用是一种更安全的指针&#xff1a; 1. 引用必须初始化&#xff0c;指针可以不用初始化 int a 10; int *p; // 指针可能是野指针 int &b a;//引用赋值"&#xff0c;通常指的是直接修改引用所引用的对象的值&#xff0…

Three.JS教程1 环境搭建、场景与相机

Three.JS教程1 环境搭建、场景与相机 一、Three.JS简介二、环境搭建1. 开发准备2. 安装 three.js3. 新建文件index.htmlmain.js 4. 关于附加组件5. 启动 三、创建场景1. 场景的概念2. 相机的概念3. 相机的几个相关概念&#xff08;1&#xff09;视点&#xff08;Position&#…