FBX SDK的使用:基础知识
Windows环境配置
FBX SDK安装后,目录下有三个文件夹:
- include 头文件
- lib 编译的二进制库,根据你项目的配置去包含相应的库
- samples 官方使用案列
动态链接
libfbxsdk.dll, libfbxsdk.lib
是动态库,需要在配置属性->C/C++->预处理器->预处理器定义
中添加FBXSDK_SHARED
;
静态链接
libfbxsdk-md.lib, libfbxsdk-mt.lib
是两种静态库,不同的是运行库选项,在配置属性->C/C++->代码生成->运行库
中设置/MD
或/MT
,/MDd
和/MTd
时debug模式。
mt
编译时,将LIBCMT.lib
编译到obj
文件中,连接器通过它处理外部符号,会将引用的外部库集成到生成的库里面;md
编译时,将MSVCRT.lib
编译到obj
文件中,链接器会链接到MSVCRT.dll
,因此生成的库会比mt
的小;
如果时debug模式的静态链接,还需要在配置属性->链接器->输入->忽略特定默认库
项添加LIBCMT
,配置属性->链接器->输入->附加依赖项
项添加wininet.lib
注意:FBX SDK可以使用多线程,但是不保证线程安全。
FBX SDK基础知识
内存管理
FbxManager
类用来管理FBX SDK对象的创建和销毁,且每一个程序里面只能有一个FbxManager
的实例。
// 创建FbxManager的实例
FbxManager* lSdkManager = FbxManager::Create();
// 使用FbxManager来创建对象
FbxScene* lScene = FbxScene::Create(lSdkManager, "Scene Name");
// 释放所有FbxManager分配的内存
lSdkManager->Destroy();
导入导出设置
FbxIOSettings ioSettings = FbxIOSettings::Create(lSdkManager, IOSROOT); // 创建FbxIOSettings
mFbxSettings->SetBoolProp(IMP_FBX_MATERIAL, true); // 设置材质导入
lSdkManager->SetIOSettings(ioSettings); // 应用设置
设置导入导出对象,所有设置的默认值为true
mFbxSettings->SetBoolProp(IMP_FBX_MATERIAL, true) // 输入设置,以“IMP_”为前缀
mFbxSettings->SetBoolProp(EXP_FBX_MATERIAL, true) // 输出设置,以“EXP_”为前缀
导出文件格式设置
EXP_FBX
导出二进制FBX文件,能嵌入媒体文件
EXP_ASCIIFBX
导出ascii FBX文件
EXP_DXF
导出DXF文件
EXP_COLLADA
导出collada文件
EXP_OBJ
导出OBJ文件
嵌入媒体文件
只有binary fbx文件才能嵌入媒体文件。当导入有媒体文件嵌入的fbx文件(myExportFile.fbx)时,将提取嵌入的媒体文件到当前目录下的myExportFile.fbm/subdirectory文件夹中。
mFbxSettings->SetBoolProp(EXP_FBX_EMBEDDED, true); // 导出Fbx binary文件时,媒体文件嵌入到导出文件中
设置密码保护
导出时设置密码
FbxString lString;// 将密码设置给lStringmFbxSettings->SetStringProp(EXP_FBX_PASSWORD, lString);
mFbxSettings->SetBoolProp(EXP_FBX_PASSWORD_ENABLE, true);
导入时填写密码
FbxString lString;// 将密码设置给lStringmFbxSettings->SetStringProp(IMP_FBX_PASSWORD, lString);
mFbxSettings->SetBoolProp(IMP_FBX_PASSWORD_ENABLE, true);
打印支持的写入和读取文件格式
void PrintWriterFormatAndReaderFormat(FbxManager* fbxManager)
{FbxIOPluginRegistry* ioPlugin = fbxManager->GetIOPluginRegistry();int readerFormatCnt = ioPlugin->GetReaderFormatCount();printf("read format count = %d\n", readerFormatCnt);for (int i = 0; i < readerFormatCnt; i++){const char* extension = ioPlugin->GetReaderFormatExtension(i);const char* desc = ioPlugin->GetReaderFormatDescription(i);printf("extension = %s description = %s\n", extension, desc);}int writerFormatCnt = ioPlugin->GetWriterFormatCount();printf("writer format count = %d\n", writerFormatCnt);for (int i = 0; i < writerFormatCnt; i++){const char* extension = ioPlugin->GetWriterFormatExtension(i);const char* desc = ioPlugin->GetWriterFormatDescription(i);printf("extension = %s description = %s\n", extension, desc);}
}
导入导出场景
导入场景
FbxImporter* lImporter = FbxImporter::Create(lSdkManager, "");
bool lImportStatus = lImporter->Initialize(lFileName, -1, mFbxSettings); // -1 表示让fbxsdk根据文件的扩展名去判断文件的格式
if(!lImportStatus)
{printf("Call to FbxImporter::Initialize() failed.\n");printf("Error returned: %s\n\n", lImporter->GetStatus().GetErrorString());exit(-1);
}// 将文件中的内容导入到scene对象中
FbxScene* scene = FbxScene::Create(lSdkManager, "");
lImporter->Import(scene);// 导入完成后就可以安全销毁,减少内存占用
lImporter->Destroy();
索引非嵌入的多媒体文件
当ASCII FBX或其他不包含嵌入媒体的文件格式定位引用的媒体文件时,遵循下面两个步骤:
-
使用绝对路径来检查引用的多媒体文件是否存在,这个绝对路径是导出场景到Fbx文件时指定的
FbxFileTexture::SetFileName()
// The resource file is in the application's directory. FbxString lTexPath = gAppPath + "\\Crate.jpg";// Create a texture object. FbxFileTexture* lTexture = FbxFileTexture::Create(pScene,"Crate Texture");// Set the texture's absolute file path. lTexture->SetFileName(lTexPath.Buffer())
-
如果绝对路径不存在多媒体文件,则使用相对路径,相对路径在导出场景到FBX文件时会自动保存
获取导入文件的版本
int lFileMajor, lFileMinor, lFileRevision;
lImporter->GetFileVersion(lFileMajor, lFileMinor, lFileRevision);
导出场景
FbxExporter* lExporter = FbxExporter::Create(lSdkmanager, "");
const char* lFilename = "file.fbx";
bool lExportStatus = lExporter->Initialize(lFilename, -1, lSdkManager->GetIOSettings());
if(!lExportStatus) {printf("Call to FbxExporter::Initialize() failed.\n");printf("Error returned: %s\n\n", lExporter->GetStatus().GetErrorString());return false;
}FbxScene* scene = FbxScene::Create(lSdkManager, "myScene");
lExporter->Export(lScene);
lExporter->Destroy();
坐标系和单位转换
我们读取FBX文件的数据到自己的应用中,需要的坐标系和单位可能和FBX文件的不一样,这时需要去修改这些设置。使用FBX SDK创建的对象是右手坐标系,Y轴向上。
// 转换为OpenGL坐标系
FbxGlobalSettings& globalSettings = mScene->GetGlobalSettings();
if (globalSettings.GetAxisSystem() != FbxAxisSystem::OpenGL)
{FbxAxisSystem::OpenGL.ConvertScene(mScene);
}// 转换为m作为单位
FbxSystemUnit systemUnit = globalSettings.GetSystemUnit();
if (globalSettings.GetSystemUnit() != FbxSystemUnit::m)
{const FbxSystemUnit::ConversionOptions options = {false, // mConvertRrsNodestrue, // mConvertLimitstrue, // mConvertClusterstrue, // mConvertLightIntensitytrue, // mConvertPhotometricLPropertiestrue, // mConvertCameraClipPlanes};FbxSystemUnit::m.ConvertScene(mScene, options);
}
注意:坐标系转换只会作用到节点Transform的pre-rotaion和动画,单位转换只会作用到节点Transform的scale和动画,并不会作用到顶点的值,比如位置,法线和UV。因此顶点值的转换需要自己去处理。
OpenGL和DirectX坐标系的转换
OpenGL坐标系是Y轴向上,X轴向右,Z轴向屏幕外,DirectX坐标系是Y轴向上,X轴向右,Z轴向屏幕内。如果将DirectX坐标系的顶点转换为OpenGL坐标系的顶点,我们以OpenGL的坐标系为世界坐标系,三个轴的基向量为 x ⃗ 0 ( 1 , 0 , 0 ) , y ⃗ 0 ( 0 , 1 , 0 ) , z ⃗ 0 ( 0 , 0 , 1 ) \vec x_0(1,0,0),\vec y_0(0,1,0),\vec z_0(0,0,1) x0(1,0,0),y0(0,1,0),z0(0,0,1),则DirectX坐标系的三个轴的基向量为 x ⃗ d ( 1 , 0 , 0 ) , y ⃗ d ( 0 , 1 , 0 ) , z ⃗ d ( 0 , 0 , − 1 ) \vec x_d(1,0,0),\vec y_d(0,1,0),\vec z_d(0,0,-1) xd(1,0,0),yd(0,1,0),zd(0,0,−1)。若点 P ( x p , y p , z p ) P(x_p,y_p,z_p) P(xp,yp,zp)为DirectX坐标系中的一点,将其转换为OpenGL坐标系为 ( ( x p , 0 , 0 ) ⋅ x ⃗ d , ( 0 , y p , 0 ) ⋅ y ⃗ d , ( 0 , 0 , z p ) ⋅ z ⃗ d ) = ( x p , y p , − z p ) ((x_p,0,0) \cdot \vec x_d, (0,y_p,0) \cdot \vec y_d, (0,0,z_p) \cdot \vec z_d)=(x_p,y_p,-z_p) ((xp,0,0)⋅xd,(0,yp,0)⋅yd,(0,0,zp)⋅zd)=(xp,yp,−zp),所以x,y坐标保持不变,z坐标取反。顶点的位置,法线可以按照这个规则处理。
因为OpenGL是右手坐标系,DirectX是左手坐标系,它们三角面的顶点的顺序是相反,所以 ( v 1 , v 2 , v 3 ) (v_1,v_2,v_3) (v1,v2,v3)要变成 ( v 1 , v 3 , v 2 ) (v_1,v_3,v_2) (v1,v3,v2)。
顶点的UV, V n e w = 1 − V V_{new}=1-V Vnew=1−V,怎么得出来的,目前不清楚。
FBX场景
每个FBX文件是一个FbxScene
,FbxScene
由FbxNode
以树状层级结构组成。
一个场景由许多元素组成,包含:meshes, lights, cameras, skeletons, NURBS等,这些元素继承FbxNodeAttribute
,FbxNode
是一个或多个场景元素的容器。
FbxNode* lRootNode = lScene->GetRootNode();
if(lRootNode) {for(int i = 0; i < lRootNode->GetChildCount(); i++)PrintNode(lRootNode->GetChild(i));
}
// Print a node, its attributes, and all its children recursively.
void PrintNode(FbxNode* pNode) {const char* nodeName = pNode->GetName();FbxDouble3 translation = pNode->LclTranslation.Get();FbxDouble3 rotation = pNode->LclRotation.Get();FbxDouble3 scaling = pNode->LclScaling.Get();// Print the node's attributes.for(int i = 0; i < pNode->GetNodeAttributeCount(); i++)PrintAttribute(pNode->GetNodeAttributeByIndex(i));// Recursively print the children.for(int j = 0; j < pNode->GetChildCount(); j++)PrintNode(pNode->GetChild(j));
}
FBX对象,属性,特性
FbxObject
FBX对象都继承于FbxObject
,比如FbxScene
,FbxNode
,FbxImporter
, FbxExporter
, FbxCollection
等。
FbxCollection
是FBX object的容器,FbxAnimLayer
, FbxAnimStack
, FbxScene
都是继承于它。
遍历场景的动画
int numStacks = mScene->GetSrcObjectCount<FbxAnimStack>();
for (int i = 0; i < numStacks; i++)
{FbxAnimStack* animStack = FbxCast<FbxAnimStack>(mScene->GetSrcObject(i));int numAnimLayers = animStack->GetMemberCount<FbxAnimLayer>();for (int layerIdx = 0; layerIdx < numAnimLayers; layerIdx++){FbxAnimLayer* animLayer = animStack->GetMember<FbxAnimLayer>(layerIdx);···}
}
FbxProperty
FbxProperty目前我知道的就是获取FbxNode的变换数据。
FbxDouble* lTranslation = lNode->LclTranslation.Get().mData;
FbxDouble* lRotation = lNode->LclRotation.Get().mData;
FbxDouble* lScaling = lNode->LclScaling.Get().mData;
属性的创建和销毁
// 创建FBX Property
FbxProperty p = FbxProperty::Create(pScene, DTDouble3, "Vector3Property");
FbxSet<FbxDouble3>(p, FbxDouble3(1.1, 2.2, 3.3);// ... initialize FbxNode* lNode ...
FbxDouble3 translation = lNode->LclTranslation.Get();
FbxDouble3 rotation = lNode->LclRotation.Get();
FbxDouble3 scaling = lNode->LclScaling.Get();
FbxNodeAttribute
FbxNodeAttribute定义了一个场景元素,比如FbxMesh,FbxSkeleton。
遍历FbxNode的FbxNodeAttribute
FbxNode* pNode;
int attrCount = pNode->GetNodeAttributeCount();
for (int i = 0; i < attrCount; i++)
{FbxNodeAttribute* attribute = pNode->GetNodeAttributeByIndex(i);FbxNodeAttribute::EType type = attribute->GetAttributeType();switch (type){case fbxsdk::FbxNodeAttribute::eSkeleton:mSkeletonNodes.push_back(pNode);break;case fbxsdk::FbxNodeAttribute::eMesh:mFbxMeshes.push_back((FbxMesh*)attribute);break;default:break;}
}
对象和属性的关系
FbxObjec和FbxObject,FbxProperty和FbxProperty,FbxObject和FbxProperty直接可以建立父子关系,FBX SDK里面叫Connection。
GetSrcXXX
可以理解为获取子对象,GetDstXX
可以理解为获取父对象
- object-property
FbxObject::GetSrcProperty()
获取节点的属性,FbxProperty::GetDstObject()
获取属性绑定的节点 - object-object
FbxObject::GetSrcObject()
获取子节点,FbxProperty::GetDstObject()
获取父节点 - property-property
FbxProperty::GetSrcProperty()
获取子属性,FbxProperty::GetDstObject()
获取父属性
参考:
- FBX SDK文档
- 官方案列
相关文章:
FBX SDK的使用:基础知识
Windows环境配置 FBX SDK安装后,目录下有三个文件夹: include 头文件lib 编译的二进制库,根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库,需要在配置属性->C/C->预…...
爬虫基础(二)Web网页的基本原理
一、网页的组成 网页由三部分构成:HTML、JavaScript、CSS。 (1)HTML HTML 相当于网页的骨架,它通过使用标签来定义网页内容的结构。 举个例子: 它把图片标签为img、把视频标签为video,然后组合到一个界面…...
1.4 Go 数组
一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中,数组的长度是类型的一部分,因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定,且不可更改。 简单来说,数组…...
爬虫基础(三)Session和Cookie讲解
目录 一、前备知识点 (1)静态网页 (2)动态网页 (3)无状态HTTP 二、Session和Cookie 三、Session 四、Cookie (1)维持过程 (2)结构 正式开始说 Sessi…...
hive:基本数据类型,关于表和列语法
基本数据类型 Hive 的数据类型分为基本数据类型和复杂数据类型 加粗的是常用数据类型 BOOLEAN出现ture和false外的其他值会变成NULL值 没有number,decimal类似number 如果输入的数据不符合数据类型, 映射时会变成NULL, 但是数据本身并没有被修改 创建表 创建表的本质其实就是在…...
Maya软件安装步骤与百度网盘链接
软件简介: MAYA软件是Autodesk旗下的著名三维建模和动画软件。maya软件功能更为强大,体系更为完善,因此国内很多的三维动画制作人员都开始转向maya,maya软件已成为三维动画软件的主流。 百度网盘链接: https://pan.baidu.com/s…...
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
Descriptions: Solutions:...
PID算法的数学实现和参数确定方法
目录 概述 1 算法描述 1.1 PID算法模型 1.2 PID离散化的图形描述 1.3 PID算法的特点 2 离散化的PID算法 2.1 位置式PID算法 2.2 增量式PID算法 2.3 位置式PID与增量式PID比较 3 控制器参数整定 3.1 PID参数确定方法 3.1.1 凑试法 3.1.2 临界比例法 3.1.3 经验法…...
【已解决】ECharts 没有在页面生效
元素高度问题: ECharts 需要一个具有明确高度的容器来渲染图表,也就是说 echartsRef 元素需要一个明确的 div 高度。我项目中的问题就是在 .base-echarts(我项目中的最外层元素) 上设置了高度为 300px,但没有为 .echar…...
三角函数正交性应用--以信号分离为例
三角函数的正交性的应用 引言 在信号处理、通信等众多领域中,三角函数的正交性发挥着至关重要的作用。它不仅是理论分析的基础,更是实际应用中解决各种问题的有力工具。本文将详细介绍三角函数正交性的定义、证明,并通过一个具体的信号处理…...
ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务
目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…...
一个数如果恰好等于他的因子之和,这是就成为“完数“,例如6=1+2+3.编程找出1000以内的所有完数
from sys import stdoutfor i in range(2,1001):k[] #用于存储因子si #初始化s为当前数字ifor j in range(1,i):if i%j0: #如果j是i的因子s-j #从s中减去银子jk.append(j) #将因子j加入列表kif s0:#如果s最终为0,说明i是一个完数print(i)for j in range(len(k)): #遍历银子列表…...
理解 InnoDB 如何处理崩溃恢复
在数据库领域,数据的一致性与可靠性至关重要。InnoDB 存储引擎的崩溃恢复机制是保障数据安全的核心,其中 Doublewrite Buffer 和 Redo Log 发挥着关键作用。下面,我们将详细探讨 InnoDB 从写入到崩溃恢复的全过程。 一、写入流程 修改页面&…...
Linux-CentOS的yum源
1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源,163源,sohu源,知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…...
Redis复制
一、Redis复制: 1.为了解决分布式中单点故障问题,通常会把数据复制多个副本部署到其他机器上来解决故障恢复和负载均衡等需求。 2.建立复制 参与复制的redis实例划分为主节点(master)和从节点(slave),每个从…...
小白怎样部署和使用本地大模型DeepSeek ?
1 安装Ollama (1) 下载Ollama 从https://ollama.com/download 下载, 根据你的系统下载对应的版本,支持Win, Mac ,Linux: 如果下载不了,右键复制链接地址,贴到迅雷,指定可以下载下来。 (2) 安…...
ECharts 样式设置
ECharts 样式设置 引言 ECharts 是一款功能强大的可视化库,广泛用于数据可视化。样式设置是 ECharts 中的重要一环,它能够帮助开发者根据需求调整图表的视觉效果,使其更加美观和易于理解。本文将详细介绍 ECharts 的样式设置,包…...
Java synchronized关键字和锁分类
专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 关于synchronized已经有很多博主很细致的讲解了,本文主要是通过代码例子再次理解下,并要求能头脑反射出相关知识点主要是锁分类的知识…...
Vue.js 新的生命周期钩子:`onMounted`, `onUpdated` 等
Vue.js 新的生命周期钩子:onMounted, onUpdated 等 今天我们来聊聊 Vue 3 中的生命周期钩子,特别是 onMounted、onUpdated 等。如果你对如何在 Vue 3 的组合式 API(Composition API)中使用这些钩子感到困惑,那么这篇文…...
OpenCV:闭运算
目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV:图像的腐蚀与膨胀-CSDN博客 OpenCV:开运算-CSDN博客 1. 简述…...
Android 音视频编解码 -- MediaCodec
引言 如果我们只是简单玩一下音频、视频播放,那么使用 MediaPlayer SurfaceView 播放就可以了,但如果想加个水印,加点其他特效什么的,那就不行了; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 Med…...
移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响
一、碎片化时间利用增加 随着生活节奏的加快,移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙,用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求,无需下载安装,随时可用&…...
数据分析系列--②RapidMiner导入数据和存储过程
一、下载数据 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从本地选择.csv或.xlsx 三、界面说明 四、存储过程 1.保存 Congratulations, you are done. 一、下载数据 点击下载AssociationAnalysisData.xlsx数据集 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从…...
Prometheus 中的 Exporter
在 Prometheus 生态系统中,Exporter 扮演着至关重要的角色,它们负责从不同的服务或系统中收集和暴露度量数据。本文将详细介绍 Exporter 的概念、类型以及如何有效使用它们将 Prometheus 集成到各种系统中进行监控。 什么是 Exporter? Exporter 是一段软件,它从应用程序或…...
从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能
一、前言 在最近使用Apipost时,突然注意到了http/1.1和http/2,如下图: 在我根深蒂固的记忆中,对于http的理解还停留在TCP协议、三次握手。由于我的好奇心,于是触发了我被动“开卷”,所以有了这篇文章&…...
GenAI 在金融服务领域的应用:2025 年的重点是什么
作者:来自 Elastic Karen Mcdermott GenAI 不是魔法 我最近参加了 ElasticON,我们与纽约 Elastic 社区一起度过了一天,讨论了使用检索增强生成 (retrieval augmented generation - RAG) 为大型语言模型 (large language models - LLMs) 提供…...
小红书文案生成器(基于openai API和streamlit)
prompt_text.py: # 专门用来放提示文本(系统提示、用户提示)system_prompt_text """ 你是小红书爆款写作专家,请你遵循以下步骤进行创作:首先产出5个标题(包含适当的emoji表情)…...
Spring AOP 入门教程:基础概念与实现
目录 第一章:AOP概念的引入 第二章:AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章:Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…...
力扣面试150 快乐数 循环链表找环 链表抽象 哈希
Problem: 202. 快乐数 👩🏫 参考题解 Code public class Solution {public int squareSum(int n) {int sum 0;while(n > 0){int digit n % 10;sum digit * digit;n / 10;}return sum;}public boolean isHappy(int n) {int slow n, fast squa…...
【实战篇章】深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据
文章目录 深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据一、服务器如何响应前端请求HTTP 请求生命周期全解析1.前端发起 HTTP 请求(关键细节强化版)2. 服务器接收请求(深度优化版) 二、后端如何查看前…...
《AI大模型开发笔记》DeepSeek技术创新点
一、DeepSeek横空出世 DeepSeek V3 以颠覆性技术架构创新强势破局!革命性的上下文处理机制实现长文本推理成本断崖式下降,综合算力需求锐减90%,开启高效 AI 新纪元! 最新开源的 DeepSeek V3模型不仅以顶尖基准测试成绩比肩业界 …...
【大模型LLM面试合集】大语言模型架构_MHA_MQA_GQA
MHA_MQA_GQA 1.总结 在 MHA(Multi Head Attention) 中,每个头有自己单独的 key-value 对;标准的多头注意力机制,h个Query、Key 和 Value 矩阵。在 MQA(Multi Query Attention) 中只会有一组 k…...
实战技巧:如何快速增加网站的收录页面?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/43.html 要快速增加网站的收录页面,可以从以下几个方面进行实战优化: 一、内容优化 高质量原创内容 确保网站内容具备高质量与原创性,满足搜索引擎对独…...
20-30 五子棋游戏
20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图(核心精讲50个案例)2023最新教程的第21集视频,该合集共计53集,视频收藏或关注UP主,及时了解更多相关视频内容。https:…...
PYH与MAC的桥梁MII/MIIM
在学习车载互联网时,看到了一句话,Processor通过DMA直接存储访问与MAC之间进行数据的交互,MAC通过MII介质无关接口与PHY之间进行数据的交互。常见的以太网硬件结构是,将MAC集成进Processor芯片,将PHY留在Processor片外…...
pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)
以下是一个完整的词嵌入(Word Embedding)示例代码,使用 modelscope 下载 tiansz/bert-base-chinese 模型,并通过 transformers 加载模型,获取中文句子的词嵌入。 from modelscope.hub.snapshot_download import snaps…...
探秘 TCP TLP:从背景到实现
回家的路上还讨论了个关于 TCP TLP 的问题,闲着无事缕一缕。本文内容参考自 Tail Loss Probe (TLP): An Algorithm for Fast Recovery of Tail Losses 以及 Linux 内核源码。 TLP,先说缘由。自 TCP 引入 Fast retrans 机制就是为了尽力避免 RTO…...
MCU内部ADC模块误差如何校准
本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、ADC误差校准引言 MCU 片内 ADC 模块的误差总包括了 5 个静态参数 (静态失调,增益误差,微分非线性…...
国产之光DeepSeek架构理解与应用分析
目录 初步探索DeepSeek的设计 一、核心架构设计 二、核心原理与优化 三、关键创新点 四、典型应用场景 五、与同类模型的对比优势 六、未来演进方向 从投入行业生产的角度看 一、DeepSeek的核心功能扩展 二、机械电子工程产业中的具体案例 1. 预测性维护(Predictive…...
群晖NAS安卓Calibre 个人图书馆
docker 下载镜像johngong/calibre-web,安装之 我是本地的/docker/xxx/metadata目录 映射到 /usr/local/calibre-web/app/cps/metadata_provider CALIBREDB_OTHER_OPTION 删除 CALIBRE_SERVER_USER calibre_server_user 缺省用户名口令 admin admin123 另外有个N…...
openRv1126 AI算法部署实战之——Tensorflow模型部署实战
在RV1126开发板上部署Tensorflow算法,实时目标检测RTSP传输。视频演示地址 rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili 一、准备工作 从官网下载tensorflow模型和数据集 手动在线下载: https://github.com/tensorflow/models/b…...
HTML特殊符号的使用示例
目录 一、基本特殊符号的使用 1、空格符号: 2、小于号 和 大于号: 3、引号: 二、版权、注册商标符号的使用 1、版权符号:© 2、注册商标符号: 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…...
如何对系统调用进行扩展?
扩展系统调用是操作系统开发中的一个重要任务。系统调用是用户程序与操作系统内核之间的接口,允许用户程序执行内核级操作(如文件操作、进程管理、内存管理等)。扩展系统调用通常包括以下几个步骤: 一、定义新系统调用 扩展系统调用首先需要定义新的系统调用的功能。系统…...
【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124
MFC界面全自动等比例缩放 1.在初始化里 枚举每个控件记录所有控件rect 2.在OnSize里,根据当前窗口和之前保存的窗口的宽高求比例x、y 3.枚举每个控件,根据比例x、y调整控件上下左右,并移动到新rect struct ControlInfo {CWnd* pControl;CRect original…...
前端 | 深入理解Promise
1. 引言 JavaScript 是一种单线程语言,这意味着它一次仅能执行一个任务。为了处理异步操作,JavaScript 提供了回调函数,但是随着项目处理并发任务的增加,回调地狱 (Callback Hell) 使异步代码很难维护。为此,ES6带来了…...
【视频+图文讲解】HTML基础2-html骨架与基本语法
图文教程 基本骨架 举个例子,下图所展示的为html的源代码 -!DOCTYPE:表示文档类型(后边写的html表示文档类型是html);其中“!”表示声明 只要是加这个声明标签的,浏览器就会把下边的源代码当…...
LabVIEW在电机自动化生产线中的实时数据采集与生产过程监控
在电机自动化生产线中,实时数据采集与生产过程监控是确保生产效率和产品质量的重要环节。LabVIEW作为一种强大的图形化编程平台,可以有效实现数据采集、实时监控和自动化控制。详细探讨如何利用LabVIEW实现这一目标,包括硬件选择、软件架构设…...
《深入理解HTTP交互与数据监控:完整流程与优化实践》
文章目录 🌐 全链路解析:HTTP请求响应与数据可视化监控一、HTTP请求响应全流程解析1. 全链路交互流程图2.关键技术实现2.1 前端请求构造(ES6语法示例)2.2 服务端处理架构(Node.js/Express) 二、数据可视化监…...
pytorch使用SVM实现文本分类
人工智能例子汇总:AI常见的算法和例子-CSDN博客 完整代码: import torch import torch.nn as nn import torch.optim as optim import jieba import numpy as np from sklearn.model_selection import train_test_split from sklearn.feature_extract…...
Recommender Systems with Large Models
一、引言 信息爆炸时代,用户面临信息过载,传统推荐系统依赖经典算法,难以满足需求。大模型基于深度学习,经大规模预训练,具备强大能力,能实现更精准推荐,为推荐系统发展开辟新路径。 二、大模…...