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

Three.js 快速入门教程【八】常见材质类型

请添加图片描述

系列文章目录

Three.js 快速入门教程【一】开启你的 3D Web 开发之旅
Three.js 快速入门教程【二】透视投影相机
Three.js 快速入门教程【三】渲染器
Three.js 快速入门教程【四】三维坐标系
Three.js 快速入门教程【五】动画渲染循环
Three.js 快速入门教程【六】相机控件 OrbitControls
Three.js 快速入门教程【七】常见几何体类型
Three.js 快速入门教程【八】常见材质类型
Three.js 快速入门教程【九】光源类型


文章目录

  • 系列文章目录
  • 一、前言
  • 二、材质的基本概念
  • 三、光的基本概念
  • 四、常见材质类型
    • 1. MeshBasicMaterial(基础网格材质)
      • 构造函数
      • 属性讲解
      • 示例
    • 2. MeshLambertMaterial(Lambert网格材质)
      • 构造函数
      • 属性讲解
      • 示例
    • 3. MeshPhongMaterial(高光网格材质)
      • 构造函数
      • 属性讲解
      • 示例
    • 4. MeshStandardMaterial(标准网格材质)
      • 构造函数
      • 属性讲解
      • 示例
    • 5. MeshPhysicalMaterial(物理网格材质)
      • 构造函数
      • 属性讲解
      • 示例
  • 五、通用的材质属性
    • 示例:带透明六面不同颜色正方体
  • 六、 材质的高级应用
    • 示例:纹理贴图——自转的地球
  • 五、总结


一、前言

      在 Three.js 的三维世界里,材质(Material)就像是给物体穿上的 “衣服”,它决定了物体如何与光线交互,以及最终呈现出的视觉效果。对于前端开发者来说,掌握材质的使用是构建逼真且富有表现力的 3D 场景的关键。本文将带你深入了解 Three.js 中常见的材质类型及其应用。


二、材质的基本概念

      在 Three.js 中,材质是 Material 类的实例,用于定义物体的外观属性。每个材质都包含了一些属性,如颜色、透明度、反射率等,这些属性会影响物体在场景中的渲染方式。材质与几何形状(Geometry)结合,才能创建出完整的物体。


三、光的基本概念

      在现实世界中,光是一种能量形式,通过照射物体并被物体反射进入我们的眼睛,使我们能够看到物体。在 three.js 的 3D 虚拟场景中,光同样起着类似的作用,它可以照亮场景中的物体,并且可以模拟不同类型的光照效果,如太阳光、点光源、聚光灯等。

ps:尽管光不是构建3D场景必须元素,但想构建逼真炫酷的3D场景是离不开光的,所以光在three.js开发中非常重要,这边只要了解什么是光以及记住光会影响材质就行了,后续有专门篇幅介绍光


四、常见材质类型

在这里插入图片描述

1. MeshBasicMaterial(基础网格材质)

MeshBasicMaterial 是最简单的材质,它不受光照影响,始终以固定颜色显示。常用于调试或创建不需要光照效果的简单物体,适用场景例如:快速原型、辅助线框、UI元素等

如果你有阅读该系列教程前几篇文章,你就会发现示例中几何体粗糙模糊没棱角3d效果比较差,因为都是用了基础网格材质类型,基础材质在实际开发中还是比较少用的,更多用来代码演示和调试使用。

构造函数

 new THREE.MeshBasicMaterial(options)

属性讲解

  • color:材质的颜色,默认值为白色(0xffffff)。
  • wireframe:是否以线框模式显示,默认值为 false。

示例

// 创建场景
const scene = new THREE.Scene();// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建几何体
const geometry = new THREE.BoxGeometry();// 创建 MeshBasicMaterial 材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });// 创建网格对象
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);// 渲染循环
function animate() {requestAnimationFrame(animate);//旋转cube.rotation.x += 0.01;cube.rotation.y += 0.01;renderer.render(scene, camera);
}animate();

请添加图片描述

2. MeshLambertMaterial(Lambert网格材质)

MeshLambertMaterial 是一种基于 Lambert 光照模型的材质,它可以模拟出漫反射的效果,受光照影响,但不产生镜面反射。适合创建具有粗糙表面的物体,像石头、木材等

构造函数

 new THREE.MeshLambertMaterial(options)

属性讲解

  • color:材质的颜色,默认值为白色(0xffffff)。
  • emissive:自发光颜色,默认值为黑色(0x000000),即不发光。

示例

// 创建场景
const scene = new THREE.Scene();// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建几何体
const geometry = new THREE.BoxGeometry(1,1,1);// 创建 MeshLambertMaterial 材质
const material = new THREE.MeshLambertMaterial({ color: 0x8844aa });// 创建网格对象
const sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);// 添加光源
let light = new THREE.DirectionalLight(0xffffff,4);
light.position.set(2, 2, 2);
scene.add(light);// 渲染循环
function animate() {requestAnimationFrame(animate);//旋转sphere.rotation.x += 0.01;sphere.rotation.y += 0.01;renderer.render(scene, camera);
}animate();

请添加图片描述

3. MeshPhongMaterial(高光网格材质)

MeshPhongMaterial 也是一种基于光照模型的材质,它在 MeshLambertMaterial 的基础上增加了镜面反射效果,可以模拟出有光泽的物体表面。适用于金属、玻璃等材质。

构造函数

 new THREE.MeshPhongMaterial(options)

属性讲解

  • color:材质的颜色,默认值为白色(0xffffff)。
  • specular:镜面反射颜色,默认值为灰色(0x111111)。
  • shininess:光泽度,值越大,反射越集中,默认值为 30。

示例

// 创建场景
const scene = new THREE.Scene();// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建几何体
const geometry = new THREE.CylinderGeometry();// 创建 MeshPhongMaterial 材质
const material = new THREE.MeshPhongMaterial({color: 0x0000ff,specular: 0xffffff, //反射颜色shininess: 100 //光泽度
});// 创建网格对象
const cylinder = new THREE.Mesh(geometry, material);
scene.add(cylinder);// 添加光源
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(1, 1, 1);
scene.add(light);// 渲染循环
function animate() {requestAnimationFrame(animate);cylinder.rotation.x += 0.01;cylinder.rotation.y += 0.01;renderer.render(scene, camera);
}animate();

请添加图片描述

4. MeshStandardMaterial(标准网格材质)

MeshPhongMaterial 基于物理的渲染(PBR)材质,更准确地模拟真实世界中物体与光线的交互,考虑了漫反射、镜面反射、环境光遮蔽等因素,可创建逼真效果。它可以通过设置金属度和粗糙度属性来模拟不同的材质,从金属到非金属都能很好地表现。

构造函数

 new THREE.MeshStandardMaterial(options)

属性讲解

  • color:材质的颜色,默认值为白色(0xffffff)。
  • roughness:粗糙度,值越大,表面越粗糙,默认值为 1。
  • metalness:金属度,值越大,表面越像金属,默认值为 0。

示例


// 创建场景
const scene = new THREE.Scene();// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建几何体
const geometry = new THREE.ConeGeometry();// 创建 MeshStandardMaterial 材质
const material = new THREE.MeshStandardMaterial({color: 0xffff00,roughness: 0.5,//粗糙度metalness: 0.8//金属度
});// 创建网格对象
const cylinder = new THREE.Mesh(geometry, material);
scene.add(cylinder);// 添加光源
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(1, 1, 1);
scene.add(light);// 渲染循环
function animate() {requestAnimationFrame(animate);cylinder.rotation.x += 0.01;cylinder.rotation.y += 0.01;renderer.render(scene, camera);
}animate();

请添加图片描述

5. MeshPhysicalMaterial(物理网格材质)

MeshPhysicalMaterial 是 Three.js 里基于物理渲染(PBR,Physically Based Rendering)的一种材质,它在 MeshStandardMaterial 的基础上进行了拓展,提供了更多的参数用于更精细地模拟真实世界中物体的外观和光学特性,从而创建出非常逼真的材质效果。如折射率、透明度等,适用于创建更复杂的材质效果,如液体、半透明物体等

构造函数

 new THREE.MeshPhysicalMaterial(options)

属性讲解

  • clearcoat:清漆层的强度,取值范围是 0 到 1。清漆层可以模拟物体表面的一层透明涂层,如汽车漆、家具表面的清漆等,增加物体表面的光泽感。
  • clearcoatRoughness:清漆层的粗糙程度,取值范围是 0 到 1。控制清漆层表面的光滑程度,影响清漆层反射的清晰度。
  • ior:折射率(Index of Refraction),取值范围通常在 1 到 2.33 之间。用于控制光线在材质内部折射的程度,不同的材质有不同的折射率,例如水的折射率约为 1.33,玻璃的折射率约为 1.5。
  • transmission:透明度(仅适用于透明材质),取值范围是 0 到 1。值为 0 时,材质完全不透明;值为 1 时,材质完全透明,可用于创建玻璃、水等透明物体。
  • specularIntensity:镜面反射强度,控制材质表面镜面反射的亮度。

示例

// 创建场景
const scene = new THREE.Scene();// 创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);
camera.position.z = 5;// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建几何体
const geometry = new THREE.SphereGeometry(1, 32, 32);// 创建 MeshPhysicalMaterial 材质
const material = new THREE.MeshPhysicalMaterial({color: 0x00ffff,roughness: 0.1,//粗糙度metalness: 0.2,//金属度clearcoat: 0.8,//清漆层的强度clearcoatRoughness: 0.2,//清漆层的粗糙程度ior: 1.5,//折射率transmission: 0.5,//透明度specularIntensity: 0.8,//镜面反射强度
});// 创建网格对象
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);// 添加光照
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(1, 1, 1);
scene.add(directionalLight);// 渲染循环
function animate() {requestAnimationFrame(animate);mesh.rotation.x += 0.01;mesh.rotation.y += 0.01;renderer.render(scene, camera);
}animate();

请添加图片描述


五、通用的材质属性

除了上述各个材质特有属性外,在 Three.js 中,许多材质类都继承自 THREE.Material 基类,因此具备一些通用的材质属性。下面介绍一些常用的通用材质属性。

属性名称类型说明默认值
colorTHREE.Color定义材质的基础颜色。可以使用十六进制值、CSS 颜色字符串或者 RGB 值来设置不同材质默认值不同,如 MeshBasicMaterial 默认是 new THREE.Color(0xffffff)(白色)
opacityNumber控制材质的不透明度,取值范围是从 0(完全透明)到 1(完全不透明)。不过,要使 opacity 生效,还需将 transparent 属性设置为 true1
transparentBoolean指示材质是否透明false
fogBoolean决定材质是否受场景中雾效的影响。如果设置为 false,则该材质不会被雾效所模糊或改变颜色true
receiveShadowBoolean指定材质是否接收阴影。如果要让物体表面显示其他物体投射的阴影,需将此属性设置为 true,同时渲染器的 shadowMap.enabled 也必须设置为 truefalse
castShadowBoolean表示材质是否投射阴影。设置为 true 后,该材质对应的物体在光照下会投射阴影到其他接收阴影的物体表面。false
sideNumber定义材质的渲染面。可选值有 THREE.FrontSide(只渲染正面)、THREE.BackSide(只渲染背面)和 THREE.DoubleSide(双面渲染)THREE.FrontSide
mapTHREE.Texture材质的纹理贴图,用于给物体表面添加纹理。可以通过加载图片来创建纹理并赋值给该属性null
wireframeBoolean是否以线框模式渲染物体。设置为 true 后,物体会以线框形式显示false
flatShadingBoolean是否使用平面着色。设为 true 会让物体表面以平面块的形式显示,产生硬边效果,常用于创建低多边形风格的模型false

示例:带透明六面不同颜色正方体

import * as THREE from "three";
//引入相机控制器
import { OrbitControls } from "three/addons/controls/OrbitControls.js";// 创建场景
const scene = new THREE.Scene();// 创建坐标轴辅助器const axesHelper = new THREE.AxesHelper(40);scene.add(axesHelper);// 创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);
camera.position.z = 5;// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建正方体的几何体const geometry = new THREE.BoxGeometry();// 为正方体的每个面创建不同颜色的半透明材质
const materials = [new THREE.MeshLambertMaterial({ color: 0xff0000, transparent: true, opacity: 0.6 }), // 红色new THREE.MeshLambertMaterial({ color: 0x00ff00, transparent: true, opacity: 0.6 }), // 绿色new THREE.MeshLambertMaterial({ color: 0x0000ff, transparent: true, opacity: 0.6 }), // 蓝色new THREE.MeshLambertMaterial({ color: 0xffff00, transparent: true, opacity: 0.6 }), // 黄色new THREE.MeshLambertMaterial({ color: 0xff00ff, transparent: true, opacity: 0.6 }), // 紫色new THREE.MeshLambertMaterial({ color: 0x00ffff, transparent: true, opacity: 0.6 })  // 青色
];// 创建网格对象,将几何体和材质数组传入
const mesh = new THREE.Mesh(geometry, materials);scene.add(mesh);// 添加光照
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);let directionalLight = new THREE.DirectionalLight(0xffffff, 10);
directionalLight.position.set(1, 1, 1);
scene.add(directionalLight);directionalLight = new THREE.DirectionalLight(0xffffff, 10);
directionalLight.position.set(-1, -1, -1);
scene.add(directionalLight);// 创建 OrbitControls 控件
const controls = new OrbitControls(camera, renderer.domElement);// 设置阻尼(惯性),让控件的操作更平滑
controls.enableDamping = true;
controls.dampingFactor = 0.05;// 渲染循环
function animate() {requestAnimationFrame(animate);mesh.rotation.x += 0.01;mesh.rotation.y += 0.01;controls.update();renderer.render(scene, camera);
}animate();

请添加图片描述

通过生成6个不同颜色的材质对象组成数组传递给网格对象构造函数生成6个不同颜色面的立方体

六、 材质的高级应用

纹理映射:除了使用纯色,我们还可以通过纹理(Texture)来为材质添加更丰富的细节。纹理可以是图片、法线贴图、凹凸贴图等。例如,使用 TextureLoader 加载一张图片作为纹理,并应用到 MeshBasicMaterial 上:

核心代码:

//加载纹理
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('texture.jpg');
//创建立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
//创建材质
const material = new THREE.MeshBasicMaterial({ map: texture });
// 创建网格对象,将几何体和材质传入
const mesh= new THREE.Mesh(geometry, material);
scene.add(mesh);

示例:纹理贴图——自转的地球

import * as THREE from "three";
//引入相机控制器
import { OrbitControls } from "three/addons/controls/OrbitControls.js";// 创建场景
const scene = new THREE.Scene();// 创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
);
camera.position.z = 5;// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 创建正方体的几何体const geometry = new THREE.SphereGeometry(1, 32, 32);// 加载纹理const textureLoader = new THREE.TextureLoader();const texture = textureLoader.load('https://pic1.zhimg.com/v2-4f5bc4b2185ff9a57993bca60e6adc90_r.jpg');// 创建材质并应用纹理
const material =new THREE.MeshLambertMaterial({ map: texture })// 创建网格对象,将几何体和材质传入
const mesh = new THREE.Mesh(geometry, material);scene.add(mesh);// 添加环境光
const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);
// 添加平行光
let directionalLight = new THREE.DirectionalLight(0xffffff, 10);
directionalLight.position.set(1, 1, 1);
scene.add(directionalLight);
// 添加平行光2
directionalLight = new THREE.DirectionalLight(0xffffff, 10);
directionalLight.position.set(-1, -1, -1);
scene.add(directionalLight);// 创建 OrbitControls 控件
const controls = new OrbitControls(camera, renderer.domElement);// 设置阻尼(惯性),让控件的操作更平滑
controls.enableDamping = true;
controls.dampingFactor = 0.05;// 渲染循环
function animate() {requestAnimationFrame(animate);mesh.rotation.y += 0.01;controls.update();renderer.render(scene, camera);
}animate();

请添加图片描述

上述代码中我们新建了一个球体几何体和新建一个基础材质并设置纹理属性,纹理对象加载了地球图片,最终呈现一个自转的3D地球效果


五、总结

       通过本文的介绍,我们对 Three.js 中的材质有了更深入的了解。从基础的 MeshBasicMaterial 到基于物理的 MeshStandardMaterial 和 MeshPhysicalMaterial,以及材质的高级应用,这些知识将帮助我们创建出更加逼真和富有表现力的 3D 场景。在实际开发中,我们需要根据具体的需求选择合适的材质类型,并不断调整材质的属性,以达到最佳的视觉效果。

更多three.js入门知识点请关注该系列教程后续的更新。

相关文章:

Three.js 快速入门教程【八】常见材质类型

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...

python~http的请求参数中携带map

背景 调试 http GET请求的 map 参数,链路携带参数一直有问题,最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...

爬虫第九篇-结束爬虫循环

最近在学习Python爬虫的过程中,遇到了一个很有趣的问题:如何优雅地结束爬虫循环?今天,我想和大家分享一下我的发现和心得。 一、爬虫循环结束的常见问题 在写爬虫时,我们经常会遇到这样的情况:当爬取到的…...

考研/保研复试英语问答题库(华工建院)

华南理工大学建筑学院保研/考研 英语复试题库,由华工保研er和学硕笔试第一同学一起整理,覆盖面广,助力考研/保研上岸!需要👇载可到文章末尾见小🍠。 以下是主要内容: Part0 复试英语的方法论 Pa…...

《Effective Objective-C》阅读笔记(中)

目录 接口与API设计 用前缀避免命名空间冲突 提供“全能初始化方法” 实现description方法 尽量使用不可变对象 使用清晰而协调的命名方式 方法命名 ​编辑类与协议命名 为私有方法名加前缀 理解OC错误模型 理解NSCopying协议 协议与分类 通过委托与数据源协议进行…...

前端如何解决跨域

解决前端跨域问题有多种方法 JSONP&#xff1a;利用 <script> 标签的跨域能力&#xff0c;通过动态创建 script 标签并指定回调函数来获取数据。但只能处理 GET 请求&#xff0c;安全性较低。 JSONP 的原理是利用了 <script> 标签的跨域能力。因为浏览器允许 <…...

【HDLbits--Comb组合逻辑】

HDLbits--Comb组合逻辑 1.5 组合逻辑1.5 Demo 在 Verilog 中&#xff0c;组合逻辑&#xff08;Combinational Logic&#xff09;是指输出仅依赖于当前输入的逻辑电路&#xff0c;没有记忆功能&#xff08;即没有状态存储&#xff09;。组合逻辑的特点是&#xff1a; 无时钟信号…...

如何在 Linux 上安装和配置 Zsh

文章目录 如何在 Linux 上安装和配置 Zsh1. 安装 Zsh1.1 在 Ubuntu/Debian 上安装1.2 在 CentOS/RHEL/Fedora 上安装1.3 在 Arch Linux 上安装1.4 验证 Zsh 安装 2. 设置 Zsh 为默认 Shell2.1 验证默认 shell 3. 配置 Zsh3.1 使用 Oh My Zsh3.1.1 安装 Oh My Zsh3.1.2 启用插件…...

Chromedriver与Chrome版本映射表

‌Chromedriver与Chrome版本映射表‌如下&#xff1a; ‌Chrome 71-73版本对应Chromedriver 2.46‌‌Chrome 70-72版本对应Chromedriver 2.45‌‌Chrome 69-71版本对应Chromedriver 2.44‌‌Chrome 68-70版本对应Chromedriver 2.43‌‌Chrome 67-69版本对应Chromedriver 2.42‌…...

HarmonyOS学习第7天: 文本组件点亮界面的文字魔法棒

一、引言 在 HarmonyOS 那丰富多彩的系统界面中&#xff0c;从简洁直观的应用图标&#xff0c;到交互流畅的操作菜单&#xff0c;再到生动形象的图文展示&#xff0c;每一处细节都经过精心雕琢&#xff0c;为用户带来了独特而美妙的视觉与交互体验。而在这琳琅满目的界面元素中…...

06C语言——指针

一、指针入门 (1)、准备知识 0、图解&#xff1a; 1、内存地址 字节&#xff1a;字节是内存的容量单位&#xff0c;英文称为 byte&#xff0c;一个字节有8位&#xff0c;即 1byte(0000 0000 --- 1111 1111) 8bits(0 --- 1) 地址&#xff1a;系统为了便于区分每一个字节而对…...

Ubuntu DeepSeek磁盘空间不够解决办法

标签&#xff1a; Ubuntu&#xff1b; DeepSeek磁盘空间不够解决办法&#xff1b;Ubuntu 22, DeepSeek R1 671 B, solution for Insufficient Disk Space 问题&#xff1a;Ubuntu 22&#xff0c; DeepSeek R1 671B 磁盘空间不够解决办法 Ubuntu 22.04操作系统&#xff0c;台式…...

东信营销科技巨额补贴仍由盈转亏:毛利率大幅下滑,现金流告急

《港湾商业观察》施子夫 近期&#xff0c;东信营销科技有限公司&#xff08;以下简称&#xff0c;东信营销科技&#xff09;递表港交所&#xff0c;联席保荐机构为海通国际和中银国际。 东信营销科技的国内运营主体为深圳市东信时代信息技术有限公司。尽管期内收入规模有所提…...

Qt layout

文章目录 Qt layout**关键机制****验证示例****常见误区****最佳实践****总结**关键点总结&#xff1a;示例代码说明&#xff1a;结论&#xff1a; Qt layout 在 Qt 中&#xff0c;当调用 widget->setLayout(layout) 时&#xff0c;layout 的父对象会被自动设置为该 widget…...

本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程…...

基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

Android MMKV集成指南

首先简单介绍一下MMKV当下Android Studio最版本及Gradle8.7 MMKV集成根据官方文档重新对mmkv重新包了一次(便于开发)总结首先简单介绍一下MMKV MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据…...

React七Formik

Formik是一个专为React构建的开源表单库。它提供了一个易于使用的API来处理表单状态管理&#xff0c;表单验证以及表单提交。Formik支持React中的所有表单元素和事件&#xff0c;可以很好地与React生态系统中的其他库集成。同时&#xff0c;Formik还提供了一些高级功能&#xf…...

5分钟使用Docker部署Paint Board快速打造专属在线画板应用

文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住…...

可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫

一、前言 当重复性的工作频繁发生时&#xff0c;各种奇奇怪怪提高效率的想法就开始萌芽了。当重复代码的模块化封装已经不能满足要求的时候&#xff0c;更高效的方式就被揭开了神秘的面纱。本文基于这样的想法&#xff0c;来和大家探讨如何 10 秒钟编写一个 requests 爬虫程序。…...

【深度学习神经网络学习笔记(三)】向量化编程

向量化编程 向量化编程前言1、向量化编程2、向量化优势3、正向传播和反向传播 向量化编程 前言 向量化编程是一种利用专门的指令集或并行算法来提高数据处理效率的技术&#xff0c;尤其在科学计算、数据分析和机器学习领域中非常常见。它允许通过一次操作处理整个数组或矩阵的…...

PHP入门基础学习四(PHP基本语法)

运算符 运算符&#xff0c;专门用于告诉程序执行特定运算或逻辑操作的符号。根据运算符的作用&#xff0c;可以将PHP语言中常见的运算符分为9类 算数运算符&#xff1a; 是用来处理加减乘除运算的符号 也是最简单和最常用的运算符号 赋值运算符 1. 是一个二元运算符&#x…...

【十二】Golang 映射

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...

简单理解Oracle中的latch

可以用一个小卖部抢购的例子来理解 Oracle 数据库中的 Latch&#xff1a; 1、 什么是 Latch&#xff1f; 打个比方&#xff0c;假设数据库的某个内存区域&#xff08;比如缓存的数据块&#xff09;是小卖部货架上的最后一包辣条&#xff0c;Latch 就像是货架前的一个狭窄通道&a…...

hbase集群部署

1.hbase集群的搭建&#xff08;以及内部逻辑&#xff09; 虽然Hmaster有多个&#xff0c;但是属于热备&#xff0c;起作用的就active上的这个。 部署流程&#xff1a; 因为我配置的hadoop是一个非HA的&#xff0c;所以修改为以下 如果是HA的hadoop一定要做以下这一步。 在启动…...

塔能物联运维保障智慧地下停车场安全与高效

一、智慧地下停车场安全在城市升级改造中的关键地位 随着城市的不断发展和升级改造&#xff0c;智慧地下停车场的重要性日益凸显。在现代城市中&#xff0c;土地资源愈发珍贵&#xff0c;地下停车场成为解决停车难题的关键设施。然而&#xff0c;停车场的安全问题是其正常运行和…...

面试八股文--数据库基础知识总结(2) MySQL

本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库&#xff08;Relational Database&#xff09;是一种基于关系模型的数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它将数据存储在表格&#xff08;表&#xff09;中&#xff0c;并通过表格…...

深入理解指针2

深入理解指针2 数组名的理解 数组名就是首元素的地址 int arr[]{1,3,2}; printf("%p\n",arr); printf("%p\n",&arr[0]);但是有两种情况除外&#xff0c; 1.sizeof(数组名)&#xff0c;sizeof操作符统计的是整个数组的大小&#xff0c;并不是第一个元素…...

QT各种版本下载安装

参考链接&#xff1a; 【Qt】超详细&#xff01;Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去&#xff0c;所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行&#xff0c;现在推荐两种方法 从参考链接中搬过来&#xff1a; 方案一&#xff1a;国内镜…...

java进阶学习脑图

今天开始分享我的第一篇博客&#xff0c;先放上我自己花费一个月完成的java进阶学习脑图吧&#xff01; 谁都想像R大一样对JVM可以知无不言&#xff0c;言无不尽&#xff1b; 谁都想像Doug Lea一样可以参与JUC这种核心模块的开发&#xff1b; 但是&#xff0c;不能只停留在想…...

Spring 原始注解详解与实战指南

&#x1f4dd; 1. 前言 在 Spring 框架的发展过程中&#xff0c;注解的引入大大简化了配置&#xff0c;提升了开发效率 本文将详细介绍 Spring 最初引入的核心注解&#xff0c;包括 Component、Controller、Service、Repository、Autowired、Qualifier 和 Value 等&#xff0c;…...

uniapp封装请求

在uniapp中封装HTTP请求&#xff0c;通常我们会使用uni.request方法。uni.request是uni-app提供的一个网络请求API&#xff0c;可以用来发送各种类型的HTTP请求&#xff08;GET、POST、PUT、DELETE等&#xff09;。下面是如何在uniapp中封装一个通用的HTTP请求方法&#xff0c;…...

YOLOv10 解析与地平线 征程 6 模型量化

一&#xff0c;YOLOv10 解析 1.简介 近些年来&#xff0c;研究人员对 YOLO 的架构设计、优化目标、数据增强策略等进行了探索&#xff0c;取得了显著进展。然而&#xff0c;后处理对非极大值抑制&#xff08;NMS&#xff09;的依赖阻碍了 YOLO 的端到端部署&#xff0c;并对推…...

基本网络安全的实现

基本网络安全的实现 一 &#xff1a;AAA AAA 是Authentication&#xff0c;Authorization and Accounting&#xff08;认证、授权和计费&#xff09;的简 称&#xff0c;它提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架&#xff0c; 它是对网络安全…...

ROS2 强化学习:案例与代码实战

一、引言 在机器人技术不断发展的今天&#xff0c;强化学习&#xff08;RL&#xff09;作为一种强大的机器学习范式&#xff0c;为机器人的智能决策和自主控制提供了新的途径。ROS2&#xff08;Robot Operating System 2&#xff09;作为新一代机器人操作系统&#xff0c;具有…...

Java数据结构第十四期:走进二叉树的奇妙世界(三)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、二叉树OJ练习题 1.1. 相同的树 1.2. 另一棵树的子树 1.3. 翻转二叉树 1.4. 平衡二叉树 1.5. 对称二叉树 一、二叉树OJ练习题 1.1. 相同的树 判断两棵树是否相同&#xff0c;我们是否只能遍历一…...

GO 进行编译时插桩,实现零码注入

Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术&#xff0c;目的是在不修改业务代码的情况下&#xff0c;实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改&#xff0c;将监控代码注入到…...

《炎龙骑士团 1 邪神之封印》游戏信息

发行公司&#xff1a;1994 年由汉堂国际资讯公司发行。 游戏类型&#xff1a;回合制角色扮演游戏 故事背景 远古之战&#xff1a;在远古时代&#xff0c;圣族与魔族爆发大战&#xff0c;魔族领导者大邪神力量强大&#xff0c;圣族处于下风。圣族派出十二战士突袭&#xff0c;虽…...

本地大模型编程实战(23)用智能体(Agent)实现基于SQL数据构建问答系统(2)

本文将用 智能体(Agent) 实现对 SQLite 数据库的查询&#xff1a;用户用自然语言提出问题&#xff0c;智能体也用自然语言根据数据库的查询结果回答问题。 本次将分别在英文、中文环境下&#xff0c;使用 qwen2.5 、 MFDoom/deepseek-r1-tool-calling:7b 以及 llama3.1 做实验。…...

Flash-03

1-问题&#xff1a;Flash软件画两个图形&#xff0c;若有部分重合则变为一个整体 解决方法1&#xff1a;两个图形分属于不同的图层 解决方法2&#xff1a;将每个图形都转化为【元件】 问题2&#xff1a;元件是什么&#xff1f; 在 Adobe Flash&#xff08;现在称为 Adobe Anim…...

防火墙双机热备---VRRP,VGMP,HRP(超详细)

双机热备技术-----VRRP&#xff0c;VGMP&#xff0c;HRP三个组成 注&#xff1a;与路由器VRRP有所不同&#xff0c;路由器是通过控制开销值控制数据包流通方向 防火墙双机热备&#xff1a; 1.主备备份模式 双机热备最大的特点就是防火墙提供了一条专门的备份通道&#xff08;心…...

PC端-发票真伪查验系统-Node.js全国发票查询接口

在现代企业的财务管理中&#xff0c;发票真伪的验证至关重要。随着电子发票的普及&#xff0c;假发票问题日益严峻&#xff0c;如何高效、准确的对发票进行真伪查验&#xff0c;已经成为各类企业在日常运营中必须解决的关键问题。翔云发票查验接口做企业财务管理、税务合规的好…...

3.1部署filebeat:5044

beats是ELK体系中新增的一个工具&#xff0c;, 属于一个轻量的日志采集器。 1.安装&#xff08;每台&#xff09; # tar xf filebeat-6.4.1-linux-x86_64.tar.gz # mv filebeat-6.4.1-linux-x86_64 /usr/local/filebeat #yum -y install httpd #systemctl start httpd 2.测试…...

在 Windows 上配置 Ollama 服务并开放局域网访问

为了在局域网内共享 Ollama 服务&#xff0c;我们需要完成以下两步&#xff1a; 1、设置 Ollama 的环境变量 OLLAMA_HOST&#xff0c;使其监听局域网的 IP 地址。 &#xff08;1&#xff09; 配置 Ollama 服务的监听地址 Ollama 服务使用环境变量 OLLAMA_HOST 来指定监听的地…...

C#快速调用DeepSeek接口,winform接入DeepSeek查询资料 C#零门槛接入DeepSeek C#接入DeepSeek源代码下载

下载地址<------完整源码 在数字化转型加速的背景下&#xff0c;企业应用系统对智能服务的需求日益增长。DeepSeek作为先进的人工智能服务平台&#xff0c;其自然语言处理、图像识别等核心能力可显著提升业务系统的智能化水平。传统开发模式下&#xff0c;C#开发者需要耗费大…...

解决后端跨域问题

目录 一、什么是跨域问题&#xff1f; 1、跨域问题的定义 2、举例 3、为什么会有跨域问题的存在&#xff1f; 二、解决跨域问题 1、新建配置类 2、编写代码 三、结语 一、什么是跨域问题&#xff1f; 1、跨域问题的定义 跨域问题&#xff08;Cross-Origin Resource Sh…...

【教程】使用docker+Dify搭建一个本地知识库

现在AI火的一塌糊涂&#xff0c;再不搭建一个自己的AI知识库就有点落伍了&#xff0c;这里我是自己的windows11电脑。用了dockerdifydeepseek。 一、安装docker 网址&#xff1a;https://www.docker.com/ 什么是docker&#xff1f; Docker 是一种开放源代码的容器化平台&…...

微信小程序数据绑定与事件处理:打造动态交互体验

在上一篇中&#xff0c;我们学习了如何搭建微信小程序的开发环境并创建了一个简单的“Hello World”页面。然而&#xff0c;一个真正的小程序不仅仅是静态内容的展示&#xff0c;它需要与用户进行动态交互。本文将深入探讨微信小程序中的数据绑定和事件处理机制&#xff0c;通过…...

Spring MVC 的执行流程解析:从用户请求到响应返回

Spring MVC 是一种基于 Model-View-Controller 设计模式的 Web 框架&#xff0c;用于处理用户请求、执行相应的业务逻辑并返回响应。它广泛应用于 Java Web 开发&#xff0c;提供了灵活的架构和丰富的功能。 本文将详细介绍 Spring MVC 的执行流程&#xff0c;帮助你理解它是如…...

c++day5

作业&#xff1a; 编写一个如下场景&#xff1a; 有一个英雄Hero类&#xff0c;私有成员&#xff0c;攻击&#xff0c;防御&#xff0c;速度&#xff0c;生命值&#xff0c;以及所有的set get 方法 编写一个 武器 Weapon 类&#xff0c;拥有私有成员攻击力&#xff0c;以及set …...