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

探索3D世界:使用 lib3ds 读取和解析 3DS 文件

在3D图形开发中,读取和解析3DS文件是创建和渲染3D场景的第一步。3DS(3D Studio)文件格式是一种广泛使用的3D模型文件格式,它包含了多种类型的数据,用于描述3D场景中的物体、材质、相机、灯光和动画等。lib3ds 是一个开源的C库,专门用于读取和解析 .3ds 文件。本文将详细介绍如何使用 lib3ds 库来读取3DS文件,并理解其组成部分。


一、3DS文件的组成部分

3DS文件包含以下主要组成部分:

  1. 物体(Object)

    • 3DS文件可以包含多个物体,每个物体都是一个复杂的3D模型。
    • 物体包含顶点数据、三角形索引数据、纹理坐标数据和材质列表数据等。
    • 每种数据由一个特定的ID标识,以区分不同类型的数据。
  2. 材质(Material)

    • 材质定义了物体的外观属性,如颜色、透明度、纹理等。
    • 3DS文件可以包含多个材质,也可以不包含材质信息。
  3. 相机(Camera)

    • 相机数据描述了场景中的观察点,包括相机的位置、朝向和焦距等信息。
  4. 灯光(Light)

    • 灯光数据定义了场景中的光源,包括灯光的位置、类型和颜色等信息。
    • 灯光可以是泛光灯、聚光灯等不同类型的光源。
  5. 关键帧(Keyframe)

    • 关键帧用于描述动画,包含了每个物体在每一关键帧处的变换矩阵。
    • 通过在绘制每一帧动画前给物体应用相应的变换矩阵,可以实现动画效果。
    • 需要注意的是,3DS文件只能描述刚体动画,不能描述柔体动画。

二、使用 lib3ds 库读取 3DS 文件

lib3ds 库提供了一个简单的API来读取和解析3DS文件。以下是使用 lib3ds 库读取3DS文件的基本步骤:

1. 包含头文件

在你的代码中包含 lib3ds 的头文件:

#include <lib3ds/lib3ds.h>
2. 加载 3DS 文件

使用 lib3ds_file_load 函数加载3DS文件。这个函数会返回一个 Lib3dsFile 结构体指针,它包含了3DS文件的所有信息。

Lib3dsFile *file = lib3ds_file_load("path/to/your/file.3ds");
if (!file) {fprintf(stderr, "Failed to load 3DS file.\n");return 1;
}
3. 获取模型的包围盒

为了计算场景的中心点和大小,我们需要得到模型的最小边界和最大边界。这可以通过调用 lib3ds_file_bounding_box_of_nodes 函数来实现,它接收一个 Lib3dsFile 指针以及几个布尔参数来指定是否考虑节点、网格、相机和灯光。然后,它会填充两个 Lib3dsVector 类型的变量 bminbmax,分别表示包围盒的最小和最大坐标。

Lib3dsVector bmin, bmax;
lib3ds_file_bounding_box_of_nodes(file, LIB3DS_TRUE, LIB3DS_FALSE, LIB3DS_FALSE, bmin, bmax);float sx = bmax[0] - bmin[0];
float sy = bmax[1] - bmin[1];
float sz = bmax[2] - bmin[2];
// 这里 MAX 是一个宏定义,用来找出两个值中较大的那个。cx, cy, cz 分别是包围盒的中心点坐标,而 size 则是包围盒的最大尺寸。
float size = fmaxf(sx, fmaxf(sy, sz));
float cx = (bmin[0] + bmax[0]) / 2;
float cy = (bmin[1] + bmax[1]) / 2;
float cz = (bmin[2] + bmax[2]) / 2;
4. 添加默认相机

有时 3DS 文件中可能没有定义任何相机,或者我们希望为场景添加额外的视角。为此,我们可以创建多个默认相机,每个相机都位于不同的方向,以便从不同角度查看模型。以下是添加四个标准相机的代码:X 轴方向、Y 轴方向、Z 轴方向和一个等距视图(ISO)。

if (!file->cameras) {// 定义一个辅助函数来简化相机创建过程auto addCamera = [this, &file, cx, cy, cz, size](const char* name, int axis, float offset) {Lib3dsCamera *camera = lib3ds_camera_new(name);camera->target[0] = cx;camera->target[1] = cy;camera->target[2] = cz;memcpy(camera->position, camera->target, sizeof(camera->position));switch(axis) {case 0: // X轴camera->position[0] = bmax[0] + offset * fmaxf(sy, sz);break;case 1: // Y轴camera->position[1] = bmin[1] - offset * fmaxf(sx, sz);break;case 2: // Z轴camera->position[2] = bmax[2] + offset * fmaxf(sx, sy);break;default: // ISOcamera->position[0] = bmax[0] + .75f * size;camera->position[1] = bmin[1] - .75f * size;camera->position[2] = bmax[2] + .75f * size;}camera->near_range = (camera->position[axis % 3] - (axis == 2 ? bmax[axis % 3] : bmin[axis % 3])) * .5f;camera->far_range = (camera->position[axis % 3] - (axis == 2 ? bmin[axis % 3] : bmax[axis % 3])) * 2.0f;lib3ds_file_insert_camera(file, camera);};// 添加四个相机addCamera("Camera_X", 0, 1.5f);addCamera("Camera_Y", 1, 1.5f);addCamera("Camera_Z", 2, 1.5f);addCamera("Camera_ISO", 3, .75f);
}
5. 添加默认灯光

有时3DS文件中可能没有定义任何灯光,或者我们需要为场景添加额外的光源以改善渲染效果。以下是如何添加默认灯光的示例代码:

void addDefaultLights(Lib3dsFile *file, float cx, float cy, float cz, float size) {// 定义一个辅助函数来简化灯光创建过程auto addLight = [file, cx, cy, cz, size](const char* name, int type, float x, float y, float z) {Lib3dsLight *light = lib3ds_light_new(name);light->type = type;light->position[0] = x;light->position[1] = y;light->position[2] = z;// 设置灯光的颜色,默认为白色light->color[0] = 1.0f;light->color[1] = 1.0f;light->color[2] = 1.0f;// 如果是聚光灯,设置目标点if (type == LIB3DS_LIGHT_SPOT) {light->target[0] = cx;light->target[1] = cy;light->target[2] = cz;}// 插入到文件的灯光链表中lib3ds_file_insert_light(file, light);};// 添加一个泛光灯addLight("Default_Omni_Light", LIB3DS_LIGHT_OMNI, cx, cy + size, cz);// 添加一个聚光灯addLight("Default_Spot_Light", LIB3DS_LIGHT_SPOT, cx + size, cy, cz);// 可以根据需要添加更多的灯光
}

在加载完3DS文件之后,你可以检查是否存在灯光,并在必要时调用 addDefaultLights 函数来添加默认灯光:

if (!file->lights) {addDefaultLights(file, cx, cy, cz, size);
}
6. 遍历 3DS 文件

一旦加载了3DS文件,你可以遍历它的内容。lib3ds 库将不同类型的数据组织成以 file 为根节点的树状结构,而同类数据以链表的形式存放。你可以使用以下方式遍历3DS文件中的数据:

  • 遍历物体(Object)file->objects
  • 遍历材质(Material)file->materials
  • 遍历相机(Camera)file->cameras
  • 遍历灯光(Light)file->lights
  • 遍历关键帧(Keyframe):这通常涉及到遍历物体并检查每个物体的关键帧数据。

例如,遍历物体的代码如下所示:

Lib3dsObject *object;
for (object = file->objects; object != NULL; object = object->next) {// 处理物体数据,例如打印物体名称或几何形状printf("Object name: %s\n", object->name);// 这里可以添加更多代码来处理物体的其他属性,例如顶点数据、材质等。
}
7. 释放资源

完成处理后,记得释放 lib3ds 库分配的资源。使用 lib3ds_file_free 函数来释放 Lib3dsFile 结构体。

lib3ds_file_free(file);

三、注意事项

  1. 错误处理

    • 在实际应用中,你应该添加更多的错误处理代码来确保程序的健壮性。例如,检查 lib3ds_file_load 的返回值,并在失败时打印更详细的错误信息。
  2. 内存管理

    • lib3ds 库会为你分配内存来存储3DS文件的内容。确保在完成处理后调用 lib3ds_file_free 来释放这些资源,以避免内存泄漏。
  3. 文件路径

    • 确保你提供的3DS文件路径是正确的,并且文件具有读取权限。
  4. lib3ds 版本

    • 不同版本的 lib3ds 库可能有不同的API和函数签名。确保你使用的代码与你的 lib3ds 库版本兼容。

四、完整示例代码

以下是一个完整的示例代码,展示了如何使用 lib3ds 库读取3DS文件并打印出其中的物体信息:

#include <stdio.h>
#include <lib3ds/lib3ds.h>void traverseObjects(Lib3dsFile *file) {Lib3dsObject *object;for (object = file->objects; object != NULL; object = object->next) {printf("Object name: %s\n", object->name);// 打印顶点数据if (object->mesh) {Lib3dsMesh *mesh = object->mesh;printf("  Vertices: %d\n", mesh->points);for (int i = 0; i < mesh->points; ++i) {printf("    Vertex %d: (%f, %f, %f)\n",i, mesh->pointL[i].v[0], mesh->pointL[i].v[1], mesh->pointL[i].v[2]);}// 打印面片数据printf("  Faces: %d\n", mesh->faces);for (int i = 0; i < mesh->faces; ++i) {Lib3dsFace *face = &mesh->faceL[i];printf("    Face %d: %d, %d, %d\n",i, face->points[0], face->points[1], face->points[2]);}}}
}int main() {const char *filename = "path/to/your/file.3ds";Lib3dsFile *file = lib3ds_file_load(filename);if (!file) {fprintf(stderr, "Failed to load 3DS file: %s\n", filename);return 1;}printf("Loaded 3DS file: %s\n", filename);// 获取模型的包围盒Lib3dsVector bmin, bmax;lib3ds_file_bounding_box_of_nodes(file, LIB3DS_TRUE, LIB3DS_FALSE, LIB3DS_FALSE, bmin, bmax);float sx = bmax[0] - bmin[0];float sy = bmax[1] - bmin[1];float sz = bmax[2] - bmin[2];float size = fmaxf(sx, fmaxf(sy, sz));float cx = (bmin[0] + bmax[0]) / 2;float cy = (bmin[1] + bmax[1]) / 2;float cz = (bmin[2] + bmax[2]) / 2;// 添加默认相机if (!file->cameras) {// 定义一个辅助函数来简化相机创建过程auto addCamera = [file, cx, cy, cz, size](const char* name, int axis, float offset) {Lib3dsCamera *camera = lib3ds_camera_new(name);camera->target[0] = cx;camera->target[1] = cy;camera->target[2] = cz;memcpy(camera->position, camera->target, sizeof(camera->position));switch(axis) {case 0: // X轴camera->position[0] = bmax[0] + offset * fmaxf(sy, sz);break;case 1: // Y轴camera->position[1] = bmin[1] - offset * fmaxf(sx, sz);break;case 2: // Z轴camera->position[2] = bmax[2] + offset * fmaxf(sx, sy);break;default: // ISOcamera->position[0] = bmax[0] + .75f * size;camera->position[1] = bmin[1] - .75f * size;camera->position[2] = bmax[2] + .75f * size;}camera->near_range = (camera->position[axis % 3] - (axis == 2 ? bmax[axis % 3] : bmin[axis % 3])) * .5f;camera->far_range = (camera->position[axis % 3] - (axis == 2 ? bmin[axis % 3] : bmax[axis % 3])) * 2.0f;lib3ds_file_insert_camera(file, camera);};// 添加四个相机addCamera("Camera_X", 0, 1.5f);addCamera("Camera_Y", 1, 1.5f);addCamera("Camera_Z", 2, 1.5f);addCamera("Camera_ISO", 3, .75f);}// 添加默认灯光if (!file->lights) {addDefaultLights(file, cx, cy, cz, size);}// 遍历并打印物体信息traverseObjects(file);// 释放资源lib3ds_file_free(file);return 0;
}

相关文章:

探索3D世界:使用 lib3ds 读取和解析 3DS 文件

在3D图形开发中&#xff0c;读取和解析3DS文件是创建和渲染3D场景的第一步。3DS&#xff08;3D Studio&#xff09;文件格式是一种广泛使用的3D模型文件格式&#xff0c;它包含了多种类型的数据&#xff0c;用于描述3D场景中的物体、材质、相机、灯光和动画等。lib3ds 是一个开…...

【开源免费】基于SpringBoot+Vue.JS服装生产管理系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

计算机技术:冯·诺伊曼架构

冯诺伊曼架构&#xff08;Von Neumann Architecture&#xff09;是由著名数学家和计算机科学家约翰冯诺伊曼&#xff08;John von Neumann&#xff09;在20世纪40年代提出的一种计算机设计模型。它奠定了现代通用计算机设计的基础。 1. 核心思想 冯诺伊曼架构的核心思想是存储…...

在Window10或11系统中同时安装 JDK8 和 JDK11

在Window10或11系统中同时安装 JDK8 和 JDK11 最近写项目&#xff0c;之前的项目是用Java8环境开发的&#xff0c;在二次迭代中&#xff0c;但是新开发的项目采用Java11环境来开发&#xff0c;所以需要同时安装JDK8和JDK11环境&#xff0c;但是两个环境是不能同时使用的&#…...

Hbase2.2.7集群部署

环境说明 准备三台服务器&#xff0c;分别为&#xff1a;bigdata141&#xff08;作为Hbase主节点&#xff09;、bigdata142、bigdata143确保hadoop和zookeeper集群都先启动好我这边的hadoop版本为3.2.0&#xff0c;zookeeper版本为3.5.8 下载安装包 下载链接&#xff1a;In…...

Java学习,数据结构

Java 提供了丰富的数据结构来处理和组织数据&#xff0c;Java的 java.util 包中提供了许多这些数据结构的实现&#xff0c;可以根据需要选择合适的类。 List&#xff08;列表&#xff09; ArrayList&#xff1a;基于动态数组的数据结构&#xff0c;允许包含重复元素和 null。 …...

微众银行前端面试题及参考答案

使用的协议是 HTTP 还是 HTTPS&#xff0c;为什么没用 HTTPS&#xff1f; 在前端开发中&#xff0c;有些网站使用 HTTP 协议&#xff0c;有些使用 HTTPS 协议。 使用 HTTP 协议的情况可能是因为网站对安全性的要求不是极高&#xff0c;或者处于开发的早期阶段&#xff0c;还没有…...

spark同步mysql数据到sqlserver

使用Apache Spark将数据从MySQL同步到SQL Server是一个常见的ETL&#xff08;Extract, Transform, Load&#xff09;任务。这里提供一个基本的步骤指南&#xff0c;以及一些代码示例来帮助你完成这项工作。 ### 前提条件 1. **安装Spark**&#xff1a;确保你的环境中已经安装了…...

使用 useMemo 和 React.memo 优化 React 组件渲染

在 React 中&#xff0c;性能优化是一个重要的主题&#xff0c;特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。 1. 组件结构 创建一个父组件&#xff0c;包含两个子组件&#xff1a; MemoChild&#xff1a;使用 R…...

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…...

Bert+CRF的NER实战

CRF&#xff08;条件随机场-Conditional Random Field&#xff09; 原始本文&#xff1a;我在北京吃炸酱面 标注示例&#xff1a; 我O在O北B-PLA京I-PLA吃O炸B-FOOD酱I-FOOD面I-FOOD CRF&#xff1a; 目的&#xff1a;提出一些不可能出现的预测组合&#xff08;例如I-PLA不能…...

python学习笔记8-函数2

参数传递 传不可变对象 & 传可变对象 def func(b):print(id(a), a) #140737041872600 234print(id(b), b) #140737041872600 234a 234 func(a)def func(b):print(id(a), a) #1413554098560 [343]print(id(b), b) #1413554098560 [343]a [343] func(a)def func(b):b.appe…...

【linux学习指南】详解Linux进程信号保存

文章目录 &#x1f4dd;保存信号&#x1f320; 信号其他相关常⻅概念&#x1f309;在内核中的表⽰ &#x1f320; sigset_t&#x1f320;信号集操作函数&#x1f309;sigprocmask&#x1f309;sigpending &#x1f6a9;总结 &#x1f4dd;保存信号 &#x1f320; 信号其他相关常…...

Postman设置接口关联,实现参数化

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这…...

ORACLE之DBA常用数据库查询

数据库信息 数据库概要select a.name "DB Name", e.global_name "Global Name", c.host_name "Host Name", c.instance_name "Instance Name" , DECODE(c.logins,RESTRICTED,YES,NO) "Restricted Mo…...

C++之C++11新特性(三)--- 智能指针

目录 一、智能指针 1.1 为什么需要智能指针 1.2 内存泄漏 1.2.1 内存泄漏的基本概念 1.2.2 内存泄漏的分类 1.2.3 如何避免内存泄漏 1.3 智能指针的使用及其原理 1.3.1 RAII 1.3.2 智能指针的基本原理 1.3.3 auto_ptr 1.3.4 unique_ptr 1.3.5 shared_ptr 1.3.6 sha…...

12 设计模式之工厂方法模式

一、什么是工厂方法模式&#xff1f; 1.定义 在软件开发中&#xff0c;设计模式 是解决常见软件设计问题的最佳实践。而 工厂方法模式&#xff08;Factory Method Pattern&#xff09; 作为创建型设计模式之一&#xff0c;常常被用来解决对象创建问题。它通过将对象的创建交给…...

Python 自动化办公的 10 大脚本

大家好&#xff0c;我是你们的 Python 讲师&#xff01;今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作&#xff0c;提高效率。无论是处理 Excel 文件、发送邮件&#xff0c;还是自动化网页操作&#xff0c;Python 都能派上用场。 1. 批量…...

十一、快速入门go语言之接口和反射

文章目录 接口:one: 接口基础:two: 接口类型断言和空接口:star2: 空接口实现存储不同数据类型的切片/数组:star2: 复制切片到空接口切片:star2: 类型断言 反射 &#x1f4c5; 2024年5月9日 &#x1f4e6; 使用版本为1.21.5 接口 十、Java类的封装和继承、多态 - 七点半的菜市…...

Python中字符串和正则表达式

Python中字符串和正则表达式 在Python编程中&#xff0c;字符串是最常用的数据类型之一。字符串用于表示文本数据&#xff0c;而正则表达式则是一种强大的工具&#xff0c;用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...

力扣刷题TOP101:8.BM10 两个链表的第一个公共结点

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的 两个无环的单向链表&#xff0c;它们的第一个公共结点{{6,7}。 思路 这个任务是找到两个链表的第一个公共结点。可以看作两个心机boy偷偷补课翻车事件。平时嘴上说自己在家玩游戏&#xff0c;实际上背地里都偷…...

⽂件操作详解

⽬录 一 文件操作的引入 1 为什么使⽤⽂件&#xff1f; 2 什么是⽂件&#xff1f; 3 文件分类&#xff08;1 从⽂件功能的⻆度来分类&#xff1a;程序⽂件/数据⽂件 2根据数据的组织形式&#xff1a;为⽂本⽂件/⼆进制⽂件&#xff09; 二 ⽂件的打开和关闭 1 …...

UR开始打中国牌,重磅发布国产化协作机器人UR7e 和 UR12e

近日&#xff0c;优傲&#xff08;UR&#xff09;机器人公司立足中国市场需求&#xff0c;重磅推出UR7e和UR12e 两款本地化协作机器人。它们延续优傲&#xff08;UR&#xff09;一以贯之的高品质与性能特质&#xff0c;着重优化负载自重比&#xff0c;且在价格层面具竞争力&…...

PostgreSQL实现透视表查询

PostgreSQL 8.3版本发布时&#xff0c;引入了一个名为tablefunc的新扩展。这个扩展提供了一组非常有趣的函数。其中之一是交叉表函数&#xff0c;用于创建数据透视表。这就是我们将在本文中讨论的内容。 需求说明 解释此函数如何工作的最简单方法是使用带有数据透视表的示例…...

C#里怎么样使用Array.BinarySearch函数?

C#里怎么样使用Array.BinarySearch函数? 因为二分算法如此重要,所以要多加练习。 但是它的返回值,也有三种状态,导致很多人使用它的时候, 也感觉到迷惑的。 在这里的例子演示了三种返回值的使用: /** C# Program to Search an element with Array Indices*/ using …...

量化交易系统开发-实时行情自动化交易-8.5.VNPY平台

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于VNPY平台介绍。 VN.PY 是…...

分治算法中的主定理及其应用

引言 学习递归算法的时候&#xff0c;找到了用来计算算法复杂度的主定理。问大语言模型&#xff0c;发现回答的主定理描述有所不同。本文比较了两个不同版本中表述的差异。并给出一些例子用来计算分治递归类算法的复杂度。 主定理的不同版本 版本1 在《算法导论》第三版第四…...

前端的面试题

1.常用的块与行属性内标签有哪些&#xff1f;有什么特征&#xff1f; 块标签&#xff1a;div、h1~h6、ul、li、table、p、br、form。 特征&#xff1a;独占一行&#xff0c;换行显示&#xff0c;可以设置宽高&#xff0c;可以嵌套块和行 行标签&#xff1a;span、a、img、text…...

vue实现excel导出导入

文章目录 安装xlsx依赖和file-saver依赖Excel导出使用element-ui的el-table展示数据定义导出按钮将数据导出 excel导入定义文件导入显示框定义导入按钮解析选择的文件进行导入 安装xlsx依赖和file-saver依赖 npm install xlsx -S npm install file-saver -SExcel导出 使用ele…...

婚纱摄影管理系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】虚拟可复制品不支持退换货 【重要3⃣️】虚拟可复制品不支持退换货 【重要3⃣️】虚拟可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【…...

对拍详细使用方法

对拍的作用 对于我们在学校OJ&#xff0c;cf&#xff0c;牛客…各种只提供少量测试数据的题目&#xff0c;常常交上代码常常超时&#xff0c;能写出正确的暴力代码而题目要求的时间复杂度更低。然而这时你写出了能通过样例且时间复杂度更低的代码&#xff0c;但交上去就是错误…...

Flume 与 Kafka 整合实战

目录 一、Kafka 作为 Source【数据进入到kafka中&#xff0c;抽取出来】 &#xff08;一&#xff09;环境准备与配置文件创建 &#xff08;二&#xff09;创建主题 &#xff08;三&#xff09;测试步骤 二、Kafka 作为 Sink数据从别的地方抽取到kafka里面】 &#xff08;…...

Web开发技术栈选择指南

互联网时代的蓬勃发展&#xff0c;让越来越多人投身软件开发领域。面对前端和后端的选择&#xff0c;很多初学者往往陷入迷茫。让我们一起深入了解这两个领域的特点&#xff0c;帮助你做出最适合自己的选择。 在互联网发展的早期&#xff0c;前端开发主要负责页面布局和简单的…...

社群赋能电商:小程序 AI 智能名片与 S2B2C 商城系统的整合与突破

摘要&#xff1a;本文聚焦于社群在电商领域日益凸显的关键地位&#xff0c;深入探讨在社群粉丝经济迅猛发展背景下&#xff0c;小程序 AI 智能名片与 S2B2C 商城系统如何与社群深度融合&#xff0c;助力电商突破传统运营局限&#xff0c;挖掘新增长点。通过分析社群对电商的价值…...

C++11 http服务端和客户端库cpp-httplib

C11 http服务端和客户端库cpp-httplib 环境&#xff1a; http: yhirose/cpp-httplib v0.18.1 json: nlohmann/json v3.11.31. 简介 cpp-httplib 是一个轻量级且易于使用的 C11 HTTP 库&#xff0c;由 yhirose 开发和维护&#xff0c;开源协议为MIT。它支持 HTTP/HTTPS 协议&…...

spring-boot自定义ApplicationListener及源码分析

ApplicationListener是spring boot应用启动时的事件监听器。监听的事件有&#xff08;包括但不限于&#xff09;&#xff1a; &#xff08;1&#xff09;接下来&#xff0c;我们先通过一个例子实现自定义ApplicationListener&#xff1a; 监听器需要实现ApplicationListener<…...

打造双层环形图:基础与高级渐变效果的应用

在数据可视化领域&#xff0c;环形图因其独特的展示方式而广受欢迎。今天&#xff0c;我们将通过ECharts库来创建一个具有双层渐变效果的高级环形图。本文将详细介绍如何实现这种视觉效果。 1. 环形图基础 首先&#xff0c;我们需要了解环形图的基本构成。环形图由内外两个圆…...

BUGKU printf

整体思路 实现循环-->获取libc版本和system函数地址->将strcpy的got表项修改为system并获得shell 第一步&#xff1a;实现循环 从汇编语句可以看出&#xff0c;在每次循环结束时若0x201700处的值是否大于1则会继续循环。 encode1会将编码后的结果保存至0x2015c0处&am…...

spring boot2.7集成OpenFeign 3.1.7

1.Feign Feign是一个声明式web服务客户端。它使编写web服务客户端更容易。要使用Feign&#xff0c;请创建一个接口并对其进行注释。它具有可插入注释支持&#xff0c;包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持&…...

SSM相关面试题01

目录 1.何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗? 2.Spring IOC 如何理解? 3.Spring DI 如何理解? 4.Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制? 5.Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放…...

Python websocket

router.websocket(/chat/{flow_id}) 接口代码&#xff0c;并了解其工作流程、涉及的组件以及如何基于此实现你的新 WebSocket 接口。以下内容将分为几个部分进行讲解&#xff1a; 接口整体概述代码逐行解析关键组件和依赖关系如何基于此实现新功能示例&#xff1a;创建一个新的…...

正则表达式

正则表达式&#xff1a; 正则表达式区别于通配符&#xff0c;正则表达式是用来匹配文本的内容&#xff0c;命令的输出结果也属于文本内容。也可以使用正则表达式。 通配符用来匹配文件名和目录名。 grep用来过滤文本内容&#xff0c;以匹配要查询的结果。 linux的文本三剑客…...

机器学习——生成对抗网络(GANs):原理、进展与应用前景分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一. 生成对抗网络的基本原理二. 使用步骤2.1 对抗性训练2.2 损失函数 三. GAN的变种和进展四. 生成对抗网络的应用五. 持续挑战与未来发展方向六. 小结 前言 生…...

HTTPS 加密

HTTPS 加密技术 1. HTTPS 概述 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是 HTTP 协议的安全版本&#xff0c;利用 SSL/TLS 协议对通信进行加密&#xff0c;确保数据的机密性、完整性和身份认证。HTTPS 在保护敏感数据的传输&#xff08;如登录凭证、…...

Golang 构建学习

Golang 构建学习 如何搭建Golang开发环境 1. 下载GOlang包 https://golang.google.cn/dl/ 在地址上下载Golang 2. 配置包环境 修改全局环境变量&#xff0c;GOPROXY&#xff0c;GOPATH&#xff0c;GOROOT GOPROXYhttps://goproxy.cn,direct GOROOT"" // go二进…...

OpenCV相机标定与3D重建(7)鱼眼镜头立体校正的函数stereoRectify()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::fisheye::stereoRectify 是 OpenCV 中用于鱼眼镜头立体校正的函数。该函数计算两个相机之间的校正变换&#xff0c;使得从两个相机拍摄的图像…...

JVM_垃圾收集器详解

1、 前言 JVM就是Java虚拟机&#xff0c;说白了就是为了屏蔽底层操作系统的不一致而设计出来的一个虚拟机&#xff0c;让用户更加专注上层&#xff0c;而不用在乎下层的一个产品。这就是JVM的跨平台&#xff0c;一次编译&#xff0c;到处运行。 而JVM中的核心功能其实就是自动…...

数据结构4——栈和队列

目录 1.栈 1.1.栈的概念及结构 1.2栈的实现 2.队列 2.1队列的概念及结构 2.2队列的实现 1.栈 1.1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶&#xff0c;另一端称为…...

【AIGC】大模型面试高频考点-数据清洗篇

【AIGC】大模型面试高频考点-数据清洗篇 &#xff08;一&#xff09;常用文本清洗方法1.去除无用的符号2.去除表情符号3.文本只保留汉字4.中文繁体、简体转换5.删除 HTML 标签和特殊字符6.标记化7.小写8.停用词删除9.词干提取和词形还原10.处理缺失数据11.删除重复文本12.处理嘈…...

Java基于SSM框架的跑腿平台小程序【附源码、文档】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…...