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

Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~

AI 驱动 3D 动画

大家好,我是石小石!随着 Web 技术的发展,Three.js 成为构建 3D 图形和动画的主流工具。与此同时,人工智能(AI)在图像处理、动作生成等领域表现出强大能力。将 AI 与 Three.js 结合,可以创造更加智能、动态和个性化的 3D 动画体验。

在传统的 3D 动画中,我们需要通过手动编码或关键帧技术定义每一帧动画。然而,AI 可以帮助我们:

  • 动作生成:通过神经网络生成复杂的人体动作(如走路、跳跃)。
  • 路径优化:使用 AI 规划摄像机路径或物体运动轨迹。
  • 实时反应:通过用户输入或传感器数据,动态生成响应动画。
  • 纹理与场景生成:利用生成对抗网络(GAN)实时生成纹理或场景内容。

本文将带你探讨如何使用 AI 算法驱动 3D 动画的生成,实现一个简单的案例:萤火虫飞舞效果。

前置知识及目标

核心目标

本文将借助Threejs生成一组粒子系统,用于模拟场景中的萤火虫,并借助Threejs的效果合成器模拟萤火虫的发光效果。最后,我们将通过 AI 算法(如噪声函数或简单的强化学习策略),生成一组动态轨迹,控制萤火虫在 3D 空间中的运动,呈现自然且流畅的效果。

必备知识

本文核心是探讨AI算法在Threejs中的应用,不会着重介绍Threejs的使用。如果你对Threejs不熟悉或者有遗忘,可以参考我的其他文章复习threejs的基础知识。

一个案例带你从零入门Three.js,深度好文!

threejs专栏

技术方案

项目及场景搭建

我们采用vite的vue脚手架搭建此项目,此处为语雀卡片,点击链接查看

先安装threejs的依赖,然后搭建最基本的Threejs场景

npm i three --save
// App.vue
<template><div ref="threeContainer" class="three-container"></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import * as THREE from 'three';// 用于渲染的 DOM 容器
const threeContainer = ref(null); let scene, camera, renderer;// 初始化 Three.js 场景
const initScene = () => {// 创建场景scene = new THREE.Scene();// 创建摄像机camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 20, 1000);camera.position.set(0, 150, 500); // 设置相机位置camera.lookAt(0, 0, 0); // 看向原点// 创建渲染器renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(window.innerWidth, window.innerHeight);renderer.setPixelRatio(window.devicePixelRatio);threeContainer.value.appendChild(renderer.domElement);
};// 生命周期钩子
onMounted(() => {initScene();
});</script><style>
.three-container {position: fixed;left: 0;right: 0;bottom: 0;top: 0;overflow: hidden;
}
</style>

现在,我们就得到了一个没有任何内容的黑色场景。

创建粒子系统(萤火虫)

我们可以将萤火虫理解为一个个位置不一样的自发光球体,那么萤火虫的实现就非常简单。

let scene, camera, renderer, particles;const initScene = () => {// ...// 创建粒子系统(球体粒子-萤火虫)particles = new THREE.Group();const particlesCount = 200;for (let i = 0; i < particlesCount; i++) {const geometry = new THREE.SphereGeometry(5, 5, 5); // 创建球体const material = new THREE.MeshStandardMaterial({emissive: new THREE.Color("#CCFF00"), // 自发光颜色emissiveIntensity: 1.5, // 自发光强度});const particle = new THREE.Mesh(geometry, material);// 设置萤火虫的随机位置particle.position.x = Math.random() * 1000 - 500; // Xparticle.position.y = Math.random() * 1000 - 500; // Yparticle.position.z = Math.random() * 1000 - 500; // Zparticles.add(particle);}scene.add(particles);
};// 动画循环
const animate = () => {requestAnimationFrame(animate);renderer.render(scene, camera);
};// 生命周期钩子
onMounted(() => {initScene();animate();
});

上述代码中,particles用于储存粒子系统对象,方便后期更改参数。particlesCount代表的是萤火虫的数量,由于萤火虫的光一般是黄绿色,所以我们将其自发光颜色设置为"#CCFF00"。

实现萤火虫的发光效果

要实现萤火虫的发光效果,可以借助Threejs的EffectComposer效果合成器。EffectComposer的知识点可以参考我的其他文章:

threejs做特效:实现物体的发光效果-EffectComposer详解!

我们先引入效果合成器的一些threejs依赖项

import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';

然后创建一个处理发光效果的函数

let scene, camera, renderer, composer, particles;// 初始化 Three.js 场景
const initScene = () => {// ....initPostProcessing()
};// 初始化后期处理
const initPostProcessing = () => {composer = new EffectComposer(renderer);// 场景渲染 Passconst renderPass = new RenderPass(scene, camera);composer.addPass(renderPass);// 光晕效果 Passconst bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight),1.5, // 强度0.3, // 半径0.25 // 阈值);composer.addPass(bloomPass);
};// 动画循环
const animate = () => {animationFrameId = requestAnimationFrame(animate);// 渲染场景(使用后期处理)composer.render();
};// 生命周期钩子
onMounted(() => {initScene();animate();
});</script>

借助AI实现萤火虫的飞舞

要实现萤火虫的运动效果,我们手写运动轨迹太复杂了,我们可以借助AI算法来实现其无规则或者规则的运动轨迹。

Simplex Noise

**simplex-noise** 是一种改良的噪声算法,由 Perlin 噪声的发明者 Ken Perlin 提出。它适合用于生成平滑的伪随机数据,在许多场景中(如自然模拟、动画、程序化生成纹理等)都有应用。

官方传送门:https://www.npmjs.com/package/simplex-noise

萤火虫飞舞的效果应该满足以下特点:

  1. 运动是平滑的:不能有突兀的跳跃和不规则的抖动。
  2. 运动轨迹是自然的:看起来像随机飞舞,但又遵循某种自然规律。
  3. 可控性强:可以基于噪声的值控制位置、发光强度等。

Simplex Noise 的平滑、自然和伪随机特性,特别适合这种需求

simplex-noise 库中,可以用 createNoise2DcreateNoise3D 创建 2D 或 3D 噪声生成器,用于生成平滑的、随时间变化的伪随机数据。可以看出,用Simplex Noise的AI算法数据模拟萤火虫的飞舞效果是非常合适的。

使用simplex-noise模拟运动轨迹

更改萤火虫的运动轨迹其实非常容易,我们只需要用simplex-noise的AI数据,改变每一个萤火虫在场景中的x,y,z轴位置即可。它的核心伪代码应该如下:

// 更新粒子位置
const updateParticles = () => {particles.children.forEach((particle) => {const { x, y, z } = particle.position;// 使用噪声来更新粒子的位置particle.position.x += AI位置; // Xparticle.position.y += AI位置; // Yparticle.position.z += AI位置; // Z});
};

完成的代码如下

npm i simplex-noise
<template><div ref="threeContainer" class="three-container"></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import * as THREE from 'three';
import { createNoise2D } from 'simplex-noise';
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';// 设置引用和变量
const threeContainer = ref(null); // 用于渲染的 DOM 容器let scene, camera, renderer, composer, particles;const noise = createNoise2D(); // 使用 SimplexNoise 创建噪声生成器
let time = 0; // 时间变量,用于驱动噪声的变化// 初始化 Three.js 场景
const initScene = () => {// 创建场景scene = new THREE.Scene();// 创建摄像机camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 20, 1000);camera.position.set(0, 150, 500); // 设置相机位置camera.lookAt(0, 0, 0); // 看向原点// 创建渲染器renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(window.innerWidth, window.innerHeight);renderer.setPixelRatio(window.devicePixelRatio);threeContainer.value.appendChild(renderer.domElement);// 创建粒子系统(球体粒子)particles = new THREE.Group();const particlesCount = 200;for (let i = 0; i < particlesCount; i++) {const geometry = new THREE.SphereGeometry(5, 5, 5); // 创建球体const material = new THREE.MeshStandardMaterial({emissive: new THREE.Color("#CCFF00"), // 自发光颜色emissiveIntensity: 1.5, // 自发光强度});const particle = new THREE.Mesh(geometry, material);particle.position.x = Math.random() * 1000 - 500; // Xparticle.position.y = Math.random() * 1000 - 500; // Yparticle.position.z = Math.random() * 1000 - 500; // Zparticles.add(particle);}scene.add(particles);// 初始化后期处理initPostProcessing();};// 初始化后期处理
const initPostProcessing = () => {composer = new EffectComposer(renderer);// 场景渲染 Passconst renderPass = new RenderPass(scene, camera);composer.addPass(renderPass);// 光晕效果 Passconst bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight),1.5, // 强度0.3, // 半径0.25 // 阈值);composer.addPass(bloomPass);
};// 更新粒子位置
const updateParticles = () => {particles.children.forEach((particle) => {const { x, y, z } = particle.position;// 使用噪声来更新粒子的位置particle.position.x += noise(x, time) * 3; // Xparticle.position.y += noise(y, time) * 3; // Yparticle.position.z += noise(z, time) * 3; // Z});time += 0.1; // 增加时间,控制噪声变化
};// 动画循环
const animate = () => {requestAnimationFrame(animate);updateParticles(); // 更新粒子的位置// 渲染场景(使用后期处理)composer.render();
};// 生命周期钩子
onMounted(() => {initScene();animate();
});</script><style>
.three-container {position: fixed;left: 0;right: 0;bottom: 0;top: 0;overflow: hidden;
}
</style>

上述代码中,Simplex Noise 通过 createNoise2D 生成的一个二维噪声生成器,作为驱动萤火虫位置变化的核心工具。它为每个粒子生成平滑且自然的随机运动,使粒子看起来像真实的萤火虫飞舞。

代码中的粒子更新函数:

particle.position.x += noise(x, time) * 3; // X
particle.position.y += noise(y, time) * 3; // Y
particle.position.z += noise(z, time) * 3; // Z
  • **noise(x, time)**
    • 生成一个基于粒子当前位置 x 和时间 time 的噪声值。
    • xtime 作为输入,确保噪声在空间和时间上的连续性。
  • **乘以一个因子 ****3**
    • 噪声的值通常在 [-1, 1],通过乘以 3 将其映射到更大的运动幅度。
  • 时间 **time** 控制动态变化
    • 时间的推进使得噪声生成的值不断变化,从而推动粒子的位置变化。

场景优化

为了让场景更加真实,我们可以给场景添加背景图片,模拟更好的夜晚效果

    // 创建场景scene = new THREE.Scene();new THREE.CubeTextureLoader().setPath("/sky/").load(["posx.jpg","negx.jpg","posy.jpg","negy.jpg","posz.jpg","negz.jpg",],(texture) => {scene.background = texture;});

注意,贴图需要自己准备

我们还可以添加轨道控制器,让场景支持旋转移动,以更丰富的视角观察萤火虫效果。

import { OrbitControls } from 'three/addons/controls/OrbitControls.js';// 初始化 Three.js 场景
const initScene = () => {// ....// 添加相机控制器const controls = new OrbitControls(camera, renderer.domElement);controls.enabled = true;controls.update();// 初始化后期处理initPostProcessing();
};

此外,我们也可以添加场景的尺寸动态变化、注销等等其他优化逻辑。

// 初始化 Three.js 场景
const initScene = () => {// ...// 处理窗口大小变化window.addEventListener('resize', onWindowResize);
};// 窗口大小变化时更新渲染器和相机
const onWindowResize = () => {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);composer.setSize(window.innerWidth, window.innerHeight);
};// 销毁场景
const destroyScene = () => {cancelAnimationFrame(animationFrameId);composer.dispose();renderer.dispose();window.removeEventListener('resize', onWindowResize);
};onUnmounted(() => {destroyScene();
});

可运行的完整代码

<template><div ref="threeContainer" class="three-container"></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import * as THREE from 'three';
import { createNoise2D } from 'simplex-noise';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';// 设置引用和变量
const threeContainer = ref(null); // 用于渲染的 DOM 容器let scene, camera, renderer, composer, particles, animationFrameId;
const noise = createNoise2D(); // 使用 SimplexNoise 创建噪声生成器
let time = 0; // 时间变量,用于驱动噪声的变化// 初始化 Three.js 场景
const initScene = () => {// 创建场景scene = new THREE.Scene();// 创建摄像机camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 20, 1000);camera.position.set(0, 150, 500); // 设置相机位置camera.lookAt(0, 0, 0); // 看向原点// 创建渲染器renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(window.innerWidth, window.innerHeight);renderer.setPixelRatio(window.devicePixelRatio);threeContainer.value.appendChild(renderer.domElement);// 创建粒子系统(球体粒子)particles = new THREE.Group();const particlesCount = 200;for (let i = 0; i < particlesCount; i++) {const geometry = new THREE.SphereGeometry(5, 5, 5); // 创建球体const material = new THREE.MeshStandardMaterial({emissive: new THREE.Color("#CCFF00"), // 自发光颜色emissiveIntensity: 1.5, // 自发光强度// color: new THREE.Color(Math.random(), Math.random(), Math.random()), // 随机颜色});const particle = new THREE.Mesh(geometry, material);particle.position.x = Math.random() * 1000 - 500; // Xparticle.position.y = Math.random() * 1000 - 500; // Yparticle.position.z = Math.random() * 1000 - 500; // Zparticles.add(particle);}scene.add(particles);// 添加光源const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);scene.add(ambientLight);const pointLight = new THREE.PointLight(0xffffff, 1.5, 1000);pointLight.position.set(200, 300, 400);scene.add(pointLight);// 添加相机控制器const controls = new OrbitControls(camera, renderer.domElement);controls.enabled = true;controls.update();// 初始化后期处理initPostProcessing();// 处理窗口大小变化window.addEventListener('resize', onWindowResize);
};// 初始化后期处理
const initPostProcessing = () => {composer = new EffectComposer(renderer);// 场景渲染 Passconst renderPass = new RenderPass(scene, camera);composer.addPass(renderPass);// 光晕效果 Passconst bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight),1.5, // 强度0.3, // 半径0.25 // 阈值);composer.addPass(bloomPass);
};// 窗口大小变化时更新渲染器和相机
const onWindowResize = () => {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);composer.setSize(window.innerWidth, window.innerHeight);
};// 更新粒子位置
const updateParticles = () => {particles.children.forEach((particle) => {const { x, y, z } = particle.position;// 使用噪声来更新粒子的位置particle.position.x += noise(x, time) * 3; // Xparticle.position.y += noise(y, time) * 3; // Yparticle.position.z += noise(z, time) * 3; // Z});time += 0.1; // 增加时间,控制噪声变化
};// 动画循环
const animate = () => {animationFrameId = requestAnimationFrame(animate);updateParticles(); // 更新粒子的位置// 渲染场景(使用后期处理)composer.render();
};// 销毁场景
const destroyScene = () => {cancelAnimationFrame(animationFrameId);composer.dispose();renderer.dispose();window.removeEventListener('resize', onWindowResize);
};// 生命周期钩子
onMounted(() => {initScene();animate();
});onUnmounted(() => {destroyScene();
});
</script><style>
.three-container {position: fixed;left: 0;right: 0;bottom: 0;top: 0;overflow: hidden;
}
</style>

总结

本文使用 Three.js 创建一个 3D 场景,生成粒子(代表萤火虫),并使用 AI 算法(如 Simplex Noise噪声算法)来模拟萤火虫的动态运动轨迹。

它的核心步骤如下:

  1. 创建 3D 场景和渲染器:通过 Three.js 创建了一个基本的场景和渲染器,摄像机的位置设置使其可以从远处观察场景中的粒子。
  2. 生成粒子(萤火虫):使用 THREE.SphereGeometry 创建球体作为粒子,并设置自发光材质,模拟萤火虫的发光效果。
  3. 后期处理(发光效果):利用 Three.js 的 EffectComposerUnrealBloomPass 实现了萤火虫的光晕发光效果,使其看起来更自然。
  4. 使用 AI(Simplex Noise)模拟萤火虫飞舞:通过 simplex-noise 库生成的噪声数据,控制每个粒子的运动轨迹,产生平滑且自然的飞舞效果。
  5. 场景优化:添加了背景图片,模拟夜空效果;并通过 OrbitControls 实现了场景的交互式旋转和缩放。

如果本文对大家有帮助,欢迎点赞收藏~关注我,学习前端不迷路!

相关文章:

Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~

AI 驱动 3D 动画 大家好&#xff0c;我是石小石&#xff01;随着 Web 技术的发展&#xff0c;Three.js 成为构建 3D 图形和动画的主流工具。与此同时&#xff0c;人工智能&#xff08;AI&#xff09;在图像处理、动作生成等领域表现出强大能力。将 AI 与 Three.js 结合&#x…...

VScode clangd插件安装

前提 在VScode中写C代码时&#xff0c;总会用到 C/C 这个插件&#xff0c;也就自然而然地使用了这个插件带来的代码跳转和代码提示功能。但是当代码变地很多时&#xff0c;就会变得非常慢。所以经过调查后弃用C/C 插件的这个功能&#xff0c;使用 clangd 这个插件来提示C代码和…...

Swift从0开始学习 对象和类 day3

类&#xff08;Class&#xff09; 是一种类型或模板&#xff0c;描述了对象的特征和行为。对象&#xff08;Object&#xff09; 是类的实例&#xff0c;实际的实体&#xff0c;拥有自己的数据。 新入门的教学都喜欢用“人”来举例为类&#xff0c;在这里我也用“人”吧 //&…...

Linux——从命令行配置网络

1.使用nmcli添加静态网络连接 nmcli con add con-name static-addr \ ifname eth0 type ethernet ipv4.method manual ipv4.dns 172.25.250.220 \ ipv4.addresses 172.25.250.10/24 ipv4.gateway 172.25.250.254 命令概述 这是一条使用 nmcli&#xff08;NetworkManager 命令…...

RabbitMQ实现异步下单与退单

前言&#xff1a; 在电商项目中的支付模块也是一个很重要的模块&#xff0c;其中下订操作以及退订操作就是主要的操作。其次的下单是同步下单&#xff0c;也就是第三方支付、数据库扣减、积分增加、等等其他业务操作&#xff0c;等待全部执行完毕后向用户返回成功响应请求。对…...

[Python] 编程入门:理解变量类型

文章目录 [toc] 整数常见操作 浮点数字符串字符串中混用引号问题字符串长度计算字符串拼接 布尔类型动态类型特性类型转换结语 收录专栏&#xff1a;[Python] 在编程中&#xff0c;变量是用于存储数据的容器&#xff0c;而不同的变量类型则用来存储不同种类的数据。Python 与 C…...

C++ —— 剑斩旧我 破茧成蝶—C++11

江河入海&#xff0c;知识涌动&#xff0c;这是我参与江海计划的第2篇。 目录 1. C11的发展历史 2. 列表初始化 2.1 C98传统的{} 2.2 C11中的{} 2.3 C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期…...

Perl 简介

Perl 简介 Perl 是一种高级、通用、解释型、动态编程语言。由 Larry Wall 于 1987 年首次发布&#xff0c;它结合了 C、sed、awk 和 shell 脚本语言的特性。Perl 最初被设计用于文本处理&#xff0c;如报告生成和文件转换&#xff0c;但随着时间的推移&#xff0c;它已经发展成…...

Transformer中的Self-Attention机制如何自然地适应于目标检测任务

Transformer中的Self-Attention机制如何自然地适应于目标检测任务&#xff1a; 特征图的降维与重塑 首先&#xff0c;Backbone&#xff08;如ResNet、VGG等&#xff09;会输出一个特征图&#xff0c;这个特征图通常具有较高的通道数、高度和宽度&#xff08;例如CHW&#xff…...

【Linux篇】初学Linux,如何快速搭建Linux开发环境

文章目录 前言1. Linux背景介绍1.1 UNIX的发展历史1.2 Linux的发展历史 2. 企业应用现状3. 开源3.1 探索Linux源代码3.2 开源 VS 闭源 4. Linux的版本4.1 技术线4.2 商业产品线 5. os概念&#xff0c;定位6. 搭建Linux环境6.1 Linux环境的搭建方式6.2 购买云服务器 7. 使用XShe…...

竞赛思享会 | 2024年第十届数维杯国际数学建模挑战赛D题【代码+演示】

Hello&#xff0c;这里是Easy数模&#xff01;以下idea仅供参考&#xff0c;无偿分享&#xff01; 题目背景 本题旨在通过对中国特定城市的房产、人口、经济、服务设施等数据进行分析&#xff0c;评估其在应对人口老龄化、负增长趋势和极端气候事件中的韧性与可持续发展能力。…...

vim 使用技巧

使用技巧 正常模式&#xff08;Normal Mode&#xff09;插入模式&#xff08;Insert Mode&#xff09;命令模式&#xff08;Command Mode&#xff09; vim常用三种模式包括正常模式&#xff0c;插入模式&#xff0c;命令模式。 正常模式&#xff08;Normal Mode&#xff09; 进…...

CSS-flex布局

flex常用语法 display: flex 父级元素相关 flex-direction 主轴方向【水平方向&#xff08;默认&#xff09;、垂直方向】justify-content 主轴上的对齐方式【flex-end结束对齐、space-between两端对齐、center】align-items 交叉轴的对齐方式【center、flex-end】flex-wrap…...

小R的随机播放顺序

问题描述 小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌&#xff0c;播放后将其从歌单中移除。如果歌单中还有歌曲&#xff0c;则会将当前第一首歌移到最后一首。这个过程会一直重复&#xff0c;直到歌单中没有任何歌曲。 例如&#xff0c;给定歌单 [5, 3, 2, 1,…...

docker常见命令

1.启动容器 docker run 运行容器 docker run -d 守护线程运行容器 docker run -p 80:80 指定端口运行容器&#xff0c;左侧为服务器端口&#xff0c;右侧为容器端口 docker run --rm 停止容器后销毁 docker --name 指定容器名称 2.停止容器 docker stop (id/name) …...

C语言-指针作为函数返回值及二级指针

1、指针作为函数返回值 c语言允许函数的返回值是一个指针&#xff08;地址&#xff09;我们将这样的函数称为指针函数&#xff0c;下面的例子定义一了一个函数strlong&#xff08;&#xff09;&#xff0c;用来返回两个字符串中较长的一个&#xff1a; 1. #include <stdio…...

kotlin

参考资料&#xff1a; 参考资料 1、kotlin编译原理是先编译为class文件&#xff0c;再在java 虚拟机上执行2、变量 var 1 变量 val 2 常量 kotlin存在类型推导机制 var c:Int 1kotlin不存在基本类型&#xff0c;将全部使用对象类型3、函数 fun test(){}fun add(a:Int,b Int…...

【STM32】USART串口数据包

数据包的作用是将一个个单独的数据打包起来&#xff0c;方便进行多字节的数据通信 数据包格式 HEX数据包 文本数据包 数据包接收 HEX数据包接收&#xff08;固定包长&#xff09; 文本数据包接收&#xff08;可变包长&#xff09; 串口收发HEX数据包 接线图 Serial模块 se…...

开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 本文主要介绍如何在Windows系统电脑使用整合包一键部署开源TTS语音克隆神器GPT-SoVITS&#xff0c;并结合cpolar内网穿透工…...

echarts 图表resize() 报错Cannot read properties of undefined (reading ‘type‘)

原因是我使用了this.trainChart来接收数据&#xff0c;应该使用let或者var定义trainChart&#xff0c;就不会出现错误了。 错误代码如下&#xff1a; 原本 定义的echarts export default {data() {return {: null}} }现在 var trainChart null export default { }...

寻的制导律:从理论到应用的全景展示(下)

寻的制导律&#xff1a;从理论到应用的全景展示&#xff08;下&#xff09; 第六章 制导系统设计与实现 在制导系统的设计与实现过程中&#xff0c;系统需求分析、硬件与软件架构设计以及实现与测试方法是关键的三个环节。通过系统化的方法论&#xff0c;可以确保制导系统在复…...

ChatGPT 与其他 AI 技术在短视频营销中的技术应用与协同策略

摘要&#xff1a; 本文深入探讨了 ChatGPT 及其他 AI 技术在短视频营销中的应用。从技术层面剖析了这些技术如何助力短视频内容创作、个性化推荐、用户互动以及营销效果评估等多方面&#xff0c;通过具体方法分析、数据引用与大模型工具介绍&#xff0c;旨在为短视频营销领域提…...

使用PSpice进行第一个电路的仿真

1、单击【开始】菜单&#xff0c;选择【OrCAD Capture CIS Lite】。 2、单击【File】>【New】>【Project】。 3、①填入Name下面的文本框&#xff08;提示&#xff1a;项目名称不要出现汉字&#xff09;&#xff1b; ②选择【Analog or Mixed A/D】&#xff1b; ③单击【…...

SparkSQL 对 SQL 查询的优化静态优化和动态优化两大部分介绍

SparkSQL 对 SQL 查询的优化主要分为 静态优化 和 动态优化 两大部分&#xff0c;其中静态优化主要在查询编译时进行&#xff0c;而动态优化则是在查询执行过程中进行。SparkSQL 的优化包括了多种技术&#xff0c;例如 RBO&#xff08;基于规则的优化&#xff09;、CBO&#xf…...

Android 网络请求(二)OKHttp网络通信

学习笔记 OkHttp 是一个非常强大且流行的 HTTP 客户端库&#xff0c;广泛用于 Android 开发中进行网络请求。与 HttpURLConnection 相比&#xff0c;OkHttp 提供了更简单、更高效的 API&#xff0c;特别是在处理复杂的 HTTP 请求时。 如何使用 OkHttp 进行网络请求 以下是使…...

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出&#xff08;IO&#xff09;操作的讨论。主要分为两类&#xff1a; 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源&#xff0c;例如音乐、音效、美术资源&#xff08;如 3D 模型和…...

【机器学习】聚类算法原理详解

聚类算法 性能度量&#xff1a; 外部指标 jaccard系数&#xff08;简称JC&#xff09;FM指数&#xff08;简称FMI&#xff09;Rand指数&#xff08;简称RI&#xff09; 内部指标 DB指数&#xff08;简称DBI&#xff09;Dunn指数&#xff08;简称DI&#xff09; 距离计算&am…...

android 使用MediaPlayer实现音乐播放--基础介绍

Android 多媒体框架支持播放各种常见媒体类型&#xff0c;因此 可轻松地将音频、视频和图片集成到您的应用中。你可以播放音频或 从存储在应用资源&#xff08;原始资源&#xff09;的媒体文件&#xff08;原始资源&#xff09;中获取独立文件 或从通过网络连接到达的数据流中&…...

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…...

transformer.js(二):关于pipe管道的一切

前面的章节 transformer.js&#xff08;一&#xff09;&#xff1a;这个前端大模型运行框架的可运行环境、使用方式、代码示例以及适合与不适合的场景介绍了transformer.js的应用场景。 pipe 管道&#xff08;Pipeline&#xff09; 作为 Transformer.js 的核心功能之一&#xf…...

django宠物服务管理系统

摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商&#xff0c;并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统&#xff0c;用户可以更加方便…...

设计模式的学习思路

学习设计模式确实需要一定的时间和实践&#xff0c;尤其是对于刚入门的人来说&#xff0c;因为一开始可能会感到有些混淆&#xff0c;尤其是当多个设计模式看起来有相似之处时。本博客是博主学习设计模式的思路历程&#xff0c;大家可以一起学习进步。设计模式学习-CSDN博客 1…...

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写&#xff0c;也就是说程序在执行的时候生成可以执行的代码&#xff0c;然后执行它。在介绍JIT之前&#xff0c;需要说下两种执行方式&#xff1a;解释执行和编译执行。其中解释执行是通过解释器&#xff0c;将代码逐…...

比rsync更强大的文件同步工具rclone

背景 多个复制&#xff0c;拷贝&#xff0c;同步文件场景&#xff0c;最大规模的是每次几千万规模的小文件需要从云上对象存储中拉取到本地。其他的诸如定期数据备份&#xff0c;单次性数据备份。 rsync是单线程的&#xff0c;开源的mrsync是多线程的&#xff0c;但适用范围没…...

【eNSP】OSPF、RIP与静态路由互通实验(四)

OSPF、RIP与静态路由互通实验 实验目的实验要求实验步骤步骤 1&#xff1a;配置R1、R2、R3、R4、R5、R6、R7的端口ip步骤 2&#xff1a;配置R1、R2、R3的OSPF动态路由协议步骤 3&#xff1a;配置R3、R4、R5的RIP动态路由协议步骤 4&#xff1a;配置R3作为边界路由器&#xff0c…...

MODBUS TCP转CANOpen网关

Modbus TCP转CANopen网关 型号&#xff1a;SG-TCP-COE-210 产品用途 本网关可以实现将CANOpen接口设备连接到MODBUS TCP网络中&#xff1b;并且用户不需要了解具体的CANOpen和Modbus TCP 协议即可实现将CANOpen设备挂载到MODBUS TCP接口的 PLC上&#xff0c;并和CANOpen设备…...

Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速

11月19日知名人形机器人独角兽公司【Figure AI】发布公司汽车巨头【宝马】最新合作进展&#xff0c;旗下人形机器人Figure 02在生产线上的性能得到了显著提升&#xff0c;机器人组成自主舰队&#xff0c;依托端到端技术&#xff0c;速度提高了400%&#xff0c;执行任务成功率提…...

Linux tcpdump 详解教程

简介 tcpdump 是一款在 Linux 平台上广泛使用的网络抓包工具。它可以捕获整个 TCP/IP 协议族的数据包&#xff0c;并支持对网络层、协议、主机、端口等进行过滤。tcpdump 提供了强大的过滤功能&#xff0c;允许使用 and、or、not 等逻辑语句来筛选数据包&#xff0c;非常适合用…...

o1的风又吹到多模态,直接吹翻了GPT-4o-mini

开源LLaVA-o1&#xff1a;一个设计用于进行自主多阶段推理的新型VLM。与思维链提示不同&#xff0c;LLaVA-o1独立地参与到总结、视觉解释、逻辑推理和结论生成的顺序阶段。 LLaVA-o1超过了一些更大甚至是闭源模型的性能&#xff0c;例如Gemini-1.5-pro、GPT-4o-mini和Llama-3.…...

记录下,用油猴Tampermonkey监听所有请求,绕过seesion

油猴Tampermonkey监听所有请求&#xff0c;绕过seesion 前因后果脚本编写 前因后果 原因是要白嫖一个网站的接口&#xff0c;这个接口的页面入口被隐藏掉了&#xff0c;不能通过页面调用&#xff0c;幸好之前有想过逆向破解通过账号密码模拟登录后拿到token&#xff0c;请求该…...

Golang语言整合jwt+gin框架实现token

1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…...

SpringBootTest启动时出现循环依赖问题

在公司项目开发中由于SpringBoot启动类配置了setAllowCircularReferences为true在特定的业务逻辑下需要该配置&#xff0c;但我们需要使用SpringBootTest单元测试的时候引入我们开发的配置文件发现不生效&#xff0c; 解决方法&#xff1a; SpringBootTest(properties "…...

微信小程序——01开发前的准备和开发工具

一、踏上小程序开发之旅前的准备 &#xff08;一&#xff09;小程序账号注册 开启注册流程 首先&#xff0c;在浏览器中打开 “微信公众平台”&#xff08;微信公众平台&#xff09;。进入平台后&#xff0c;你会看到右上角有一个 “立即注册” 按钮&#xff0c;点击它&#x…...

华为欧拉系统使用U盘制作引导安装华为欧拉操作系统

今天记录一下通过U盘来安装华为欧拉操作系统 华为欧拉操作系统是国产的一个类似于Centos的Linus系统 具体实现操作步骤&#xff1a; 先在官网下载欧拉系统镜像点击跳转到下载 准备好一个大于16g的U盘 &#xff0c;用于制作U盘启动 下载一个引导程序制作工具&#xff0c;我使用…...

【Java 集合】Collections 空列表细节处理

问题 如下代码&#xff0c;虽然定义为非空 NonNull&#xff0c;但依然会返回空对象&#xff0c;导致调用侧被检测为空引用。 实际上不是Collections的问题是三目运算符返回了null对象。 import java.util.Collections;NonNullprivate List<String> getInfo() {IccReco…...

2021 年 3 月青少年软编等考 C 语言三级真题解析

目录 T1. 找和为 K 的两个元素思路分析T2. Minecraft思路分析T3. 踩方格思路分析T4. 苹果消消乐思路分析T5. 流感传染思路分析T1. 找和为 K 的两个元素 在一个长度为 n ( n < 1000 ) n\ (n < 1000) n (n<1000) 的整数序列中,判断是否存在某两个元素之和为 k k k…...

【PyTorch】Pytorch中torch.nn.Conv1d函数详解

1. 函数定义 torch.nn.Conv1d 是 PyTorch 中用于一维卷积操作的类。定义如下&#xff1a; 官方文档&#xff1a;https://pytorch.ac.cn/docs/stable/generated/torch.nn.Conv1d.html#torch.nn.Conv1d torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride1,paddi…...

Linux运维篇-iscsi存储搭建

目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上&#xff0c;特别是以太网上进行数据块传输的标准&#xff0c;它是一种基于IP Storage理论的存储技术&#xff0c;该技术是将存储行业广泛…...

通过shell脚本分析部署nginx网络服务

题目&#xff1a; 1.接收用户部署的服务名称 2.判断服务是否安装 ​ 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&#xff1b;重启服务 ​ 没有安装&#xff1b;安装对应的软件包 3.测试 判断服务是否成功运行&#xff1b; ​ 已运行&am…...

Cyberchef使用功能之-多种压缩/解压缩操作对比

cyberchef的compression操作大类中有大量的压缩和解压缩操作&#xff0c;每种操作的功能和区别是什么&#xff0c;本章将进行讲解&#xff0c;作为我的专栏《Cyberchef 从入门到精通教程》中的一篇&#xff0c;详见这里。 关于文件格式和压缩算法的理论部分在之前的文章《压缩…...