Unreal Engine中FRotator与FQuat在赛车游戏方向盘控制中的协同应用解析
摘要
深入剖析 Unreal Engine 中这两个关键组件在赛车游戏方向盘控制中的协同作用,涵盖全流程与实践技巧。
一、引言
在赛车游戏开发中,实现逼真的方向盘控制是提升玩家体验的关键要素之一。而在 Unreal Engine 里,FRotator 与 FQuat 这两个类在处理三维空间旋转变换时起着至关重要的作用。FRotator 以欧拉角的形式直观地表示旋转,而 FQuat 则基于四元数,能有效避免欧拉角带来的一些问题。本文将详细解析它们在赛车游戏方向盘控制中的协同应用,为开发者提供全面的解决方案。
二、四元数:三维旋转的数学基石
2.1 欧拉角的局限性
在赛车游戏的方向盘控制场景中,左右转向对应 Yaw 轴(水平旋转),上下推拉对应 Pitch 轴(俯仰角)。若直接使用欧拉角(FRotator)进行增量操作,会面临诸多问题。
// 错误案例:欧拉角增量叠加导致万向节锁
AddActorLocalRotation(FRotator(0, InputYaw, 0));
AddActorLocalRotation(FRotator(InputPitch, 0, 0));
- 万向节锁:当 Pitch 接近 ±90° 时,Yaw 与 Roll 轴重合,丢失一个自由度,这会严重影响游戏中车辆的旋转表现,使得车辆的转向变得不自然。
- 旋转顺序依赖:不同的旋转顺序组合会产生不同的结果,在 Unreal Engine 中默认的旋转顺序是 Yaw→Pitch→Roll。这意味着开发者在使用欧拉角时需要格外注意旋转顺序,否则可能导致旋转结果不符合预期。
2.2 四元数的优势
四元数通过四维向量 w + xi + yj + zk
描述绕固定轴的旋转量,具有以下核心优势:
- 无万向节锁:四元数通过单一旋转轴和角度来描述旋转,避免了轴对齐问题,确保在任何情况下都能保持三个自由度,从而实现更稳定的旋转控制。
- 插值平滑:四元数支持球面线性插值(Slerp),能够实现自然过渡的旋转效果。在赛车游戏中,这可以让车辆的转向更加流畅,提升玩家的视觉体验。
- 运算高效:与矩阵运算相比,四元数的运算复杂度更低,更适合实时计算。在游戏这种对性能要求较高的场景中,四元数的高效运算能够确保游戏的流畅运行。
三、FRotator 与 FQuat 协同工作流
3.1 输入映射与欧拉角转换
首先,需要将方向盘的输入事件进行绑定,并计算欧拉角增量。
// 绑定方向盘输入事件(支持键盘/手柄)
void AMyVehicle::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);PlayerInputComponent->BindAxis("Steer", this, &AMyVehicle::OnSteer);PlayerInputComponent->BindAxis("Tilt", this, &AMyVehicle::OnTilt);
}// 计算欧拉角增量(利用FRotator的直观性)
FRotator DeltaRotation;
DeltaRotation.Yaw = SteerValue * MaxSteerAngle; // 方向盘转向
DeltaRotation.Pitch = TiltValue * MaxTiltAngle; // 油门/刹车俯仰
在这个步骤中,利用 FRotator 的直观性,将玩家的输入转换为易于理解的欧拉角增量。
3.2 四元数转换与合成
接下来,将欧拉角增量转换为四元数,并进行旋转合成。
// 转换增量旋转为四元数(关键步骤)
FQuat DeltaQuat = FQuat::MakeFromRotator(DeltaRotation);
FQuat CurrentQuat = GetMesh()->GetComponentQuat(); // 获取网格体当前旋转// 合成目标旋转(注意乘法顺序:局部空间叠加)
FQuat TargetQuat = CurrentQuat * DeltaQuat;// 球面线性插值(平滑过渡)
FQuat NewQuat = FQuat::Slerp(CurrentQuat, TargetQuat, 0.2f);
这里将欧拉角增量转换为四元数,避免了欧拉角可能带来的问题。通过四元数的乘法进行旋转合成,并使用球面线性插值实现平滑过渡。
3.3 坐标系转换与应用
最后,将旋转转换到世界坐标系,并应用到网格体上。
// 转换为世界坐标系旋转(避免父Actor影响)
FQuat WorldQuat = GetComponentTransform().GetRotation() * NewQuat;// 应用最终旋转(优先使用四元数)
GetMesh()->SetWorldRotation(NewQuat); // 避免欧拉角累积误差
在这一步中,将局部空间的旋转转换为世界坐标系的旋转,确保旋转效果不受父 Actor 的影响。同时,优先使用四元数进行旋转应用,避免欧拉角累积误差。
四、方向盘控制全流程实现
4.1 输入校准与映射
为了兼容不同的输入设备,需要对输入值进行标准化和死区处理。
// 输入值标准化(兼容不同设备)
float NormalizedSteer = FMath::Clamp(SteerInput, -1.0f, 1.0f);
float NormalizedTilt = FMath::Clamp(TiltInput, -1.0f, 1.0f);// 死区处理(消除手柄漂移)
if (FMath::Abs(NormalizedSteer) < 0.1f) NormalizedSteer = 0.0f;
通过输入校准和映射,可以确保不同设备的输入都能得到统一的处理,提高游戏的兼容性。
4.2 旋转合成与约束
在进行旋转合成时,需要对角度进行约束,防止过度转向。
// 角度约束(防止过度转向)
float ClampedYaw = FMath::Clamp(DeltaRotation.Yaw, -MaxSteerAngle, MaxSteerAngle);
FQuat YawQuat = FQuat(FVector::UpVector, FMath::DegreesToRadians(ClampedYaw));// 组合旋转(优先处理Yaw轴)
FQuat CombinedQuat = YawQuat * PitchQuat;
角度约束可以保证车辆的旋转在合理范围内,避免出现不合理的旋转情况。
4.3 物理模拟整合
为了避免穿模现象,需要将旋转与物理模拟进行同步。
// 同步物理模拟(避免穿模)
GetMesh()->SetPhysicsAngularVelocity(NewQuat.GetRotationAxis() * RotationSpeed);
GetWorld()->GetPhysicsScene()->AddCustomPhysics(this, &AMyVehicle::CustomPhysics);
通过物理模拟整合,可以让车辆的旋转更加真实,避免出现不自然的穿模现象。
五、工程级解决方案
5.1 万向节锁防御方案
为了防止万向节锁的出现,可以在临界角时切换控制模式。
// 临界角检测(Pitch接近90°时切换控制模式)
if (FMath::Abs(CurrentRotation.Pitch) > 80.0f)
{// 切换为固定轴旋转模式ControlMode = EControlMode::FixedAxis;
}
万向节锁防御方案可以确保在极端情况下,车辆的旋转仍然能够正常进行。
5.2 帧率自适应插值
为了保证在不同帧率下旋转效果的一致性,需要根据 DeltaTime 动态调整插值系数。
// 根据DeltaTime动态调整插值系数
float InterpSpeed = FMath::Clamp(DeltaTime * 10.0f, 0.05f, 0.3f);
FQuat NewQuat = FQuat::Slerp(CurrentQuat, TargetQuat, InterpSpeed);
帧率自适应插值可以让车辆的旋转在不同帧率下都能保持平滑,提升玩家的游戏体验。
5.3 多组件同步方案
为了避免视角错位,需要同步控制器与网格体的方向。
// 同步控制器与网格体方向(避免视角错位)
AController* Controller = GetController();
if (Controller)
{Controller->SetControlRotation(NewQuat.Rotator());
}
多组件同步方案可以确保玩家的视角与车辆的旋转保持一致,避免出现视角错位的问题。
六、实战验证方法
6.1 极限角度测试
- 将 Pitch 设为 ±89°,验证 Yaw 轴是否仍可自由旋转。
- 连续执行 1000 次转向操作,检查旋转是否累积误差。
通过极限角度测试,可以验证旋转系统在极端情况下的稳定性和准确性。
6.2 性能监控
使用 Unreal Insights 监控:
- 每帧旋转计算耗时(应 <0.1ms)。
- 物理模拟同步延迟(建议 <5ms)。
性能监控可以确保旋转系统的性能符合游戏的要求,避免出现性能瓶颈。
6.3 兼容性测试
- 切换键盘/手柄输入设备。
- 测试不同帧率(30FPS/60FPS/120FPS)下的表现一致性。
兼容性测试可以确保游戏在不同设备和帧率下都能正常运行,提升游戏的通用性。
七、核心结论
通过以上的分析和实践,我们可以得出核心结论:“四元数保稳定,欧拉角控直观,输入校准是关键,插值同步防抖动”。在 Unreal Engine 中开发赛车游戏的方向盘控制时,合理利用 FRotator 与 FQuat 的协同作用,结合输入校准、角度约束、物理模拟整合等工程实践,以及万向节锁防御、帧率自适应插值和多组件同步等解决方案,并通过实战验证方法进行测试和优化,能够实现稳定、流畅、逼真的方向盘控制效果,为玩家带来更好的游戏体验。
相关文章:
Unreal Engine中FRotator与FQuat在赛车游戏方向盘控制中的协同应用解析
摘要 深入剖析 Unreal Engine 中这两个关键组件在赛车游戏方向盘控制中的协同作用,涵盖全流程与实践技巧。 一、引言 在赛车游戏开发中,实现逼真的方向盘控制是提升玩家体验的关键要素之一。而在 Unreal Engine 里,FRotator 与 FQuat 这两…...
第十四届蓝桥杯 2023 C/C++组 飞机降落
目录 题目: 题目描述: 编辑题目链接: 思路: 核心思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 洛谷 P9241 [蓝桥杯 20…...
完美解决Microsoft Edge浏览器无法同步/一直在同步中/更新失败等问题
在使用Microsoft Edge浏览器的过程中,我们可能会遇到一些常见的问题,例如无法同步数据或无法更新浏览器。这些问题通常可以归结为以下两个主要原因: 一、网络连接问题 当Edge浏览器无法同步或更新时,首要考虑的是网络连接问题。…...
CSS文本属性
CSS文本属性 在CSS中,可以使用以下属性来设置文本的样式和布局: 1.color : 设置文本颜色。可以使用颜色名称、十六进制值或RGB值来指定颜色: p{color:red; }font-family : 设置文本的字体系列。可以指定一个或多个字…...
思科路由器做DNS服务器
1.实验环境中,常常需要一台DNS服务器来做名称解析,一般会安装一台windows server,启用dns服务,或者安装一台Linux服务器,安装Bind来实现;虽然可以实现你想要的功能,但是费时费力且配置复杂&…...
Windows部署FunASR实时语音听写便捷部署教程
FunASR提供可便捷本地或者云端服务器部署的实时语音听写服务,内核为FunASR已开源的runtime-SDK。 FunASR集成了达摩院语音实验室在Modelscope社区开源的语音端点检测(VAD)、Paraformer-large非流式语音识别(ASR)、Paraformer-large流式语音识别(ASR)、标点预测(PUNC) 等相关能…...
C++之unordered封装
目录 一、哈希表的修改 1.1、哈希表节点结构 1.2、迭代器 1.3、哈希表结构 1.4、完整代码 二、unordered_map的实现 二、unordered_set的实现 一、哈希表的修改 注意:这里我们使用哈希桶来封装unordered_map和unordered_set。 1.1、哈希表节点结构 templa…...
Pycharm(九)函数的闭包、装饰器
目录 一、函数参数 二、闭包 三、装饰器 一、函数参数 def func01():print("func01 shows as follows") func01() # 函数名存放的是函数所在空间的地址 print(func01)#<function func01 at 0x0000023BA9FC04A0> func02func01 print(func02)#<function f…...
7. 栈与队列(随想录)
1.栈实现队列 2.用队列实现栈 3.有效的括号 4.删除字符串中的所有相邻重复项 5.逆波兰表达式 6.滑动窗口最大值 7.前k个高频元素...
GPU软硬件架构协同设计解析
GPU软硬件架构协同设计解析 GPU(图形处理器)的软硬件协同设计是其在通用计算和高性能计算(HPC)领域取得突破的核心原因。以下从硬件架构、软件架构、协同设计的关键技术及典型案例展开深度解析。 一、硬件架构的核心设计原则 流式多处理器(SM)的模块化设计 计算单元…...
【软考】论NoSQL数据库技术及其应用示例
论NoSQL数据库技术及其应用 随着互联网web2.0网站的兴起,传统关系数据库在应对web2.0 网站,特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到…...
特伦斯智慧钢琴评测:如何用科技重塑钢琴学习新体验
对于渴望学习钢琴的爱好者而言,传统钢琴的笨重体积、高昂成本与扰民问题往往成为绊脚石。而智能电钢琴的出现,正以轻量化设计、沉浸式体验与智能化功能打破这些壁垒。特伦斯智慧钢琴凭借其专业级硬件配置与创新教学系统,成为市场中兼具性能与…...
UML 状态图:解锁电子图书馆管理系统的高效设计
目录 一、UML 状态图的核心要素 状态:系统行为的 “栖息地” 转换:连接状态的 “桥梁” 动作:赋予功能的 “实践者” 二、电子图书馆管理系统状态图解析 系统空闲状态:一切的起点 读者登录与身份验证:安全的 “…...
UML 状态图:陪伴机器人系统示例
目录 一、状态图的基本概念 1.1 状态 1.2 转换 1.3 动作 二、陪伴机器人系统状态图解析 2.1 初始与待机状态 2.2 情绪检测中状态 2.3 陪伴模式下的细分 2.4 疏导模式的严谨流程 2.5 安抚模式的关键作用 三、状态图绘画 四、UML 状态图的强大 4.1 直观呈现系统行为…...
超详细实现单链表的基础增删改查——基于C语言实现
文章目录 1、链表的概念与分类1.1 链表的概念1.2 链表的分类 2、单链表的结构和定义2.1 单链表的结构2.2 单链表的定义 3、单链表的实现3.1 创建新节点3.2 头插和尾插的实现3.3 头删和尾删的实现3.4 链表的查找3.5 指定位置之前和之后插入数据3.6 删除指定位置的数据和删除指定…...
分布式光纤测温技术让森林火灾预警快人一步
2025年春季,多地接连发生森林火灾,累计过火面积超 3万公顷。春季历来是森林草原火灾易发、多发期,加之清明节已到来,生产生活用火活跃,民俗祭祀用火集中,森林火灾风险进一步加大。森林防火,人人…...
判断链表是否为环(Java版本自己用)
141. 环形链表 核心代码版本: public class Solution {public boolean hasCycle(ListNode head) {if (head null) {return false;}ListNode slow head;ListNode fast head.next;while (fast ! null && fast.next ! null) {if (slow fast) {return true…...
leetcode 516. Longest Palindromic Subsequence
题目描述: 代码: class Solution { public:int longestPalindromeSubseq(string s) {int n s.size();//i<j,dp[i][j]表示s[i,j]的最长回文子串的长度,按照这个定义dp[0][n-1]就是答案,i>j的dp[i][j]不定义vector<vector<int>> dp(n,…...
关于敏感文件或备份 安全配置错误 禁止通过 URL 访问 Vue 项目打包后的 .gz 压缩文件
要禁止通过 URL 访问 Vue 项目打包后的 .gz 压缩文件(如 sc.6abb69d9.css.gz)或其他敏感文件,可以通过 Nginx 配置和 Tomcat 配置双重防护来实现。以下是具体解决方案: 方法 1:通过 Nginx 配置禁止访问 .gz 文件 在 N…...
Linux系统启动全流程解析:从BIOS到用户登录
摘要 深度解析Linux系统启动五阶段:内核加载→init进程初始化→系统服务启动→终端创建→用户登录,涵盖SysV/Systemd差异及运行级别管理,提供故障排查指南。 一、启动流程全景概览 Linux系统启动过程严格遵循5个阶段顺序执行,每…...
unity动态骨骼架设+常用参数分享(包含部分穿模解决方案)
Unity骨骼物理模拟插件Dynamic Bone Dynamic Bone 可用于对角色的骨骼(bones)或者铰链系统(joints)施加物理效果。 物理效果可以使得游戏角色的头发、衣服、胸部或者是其他的任何部位,都可以以近似真实的状态运动。 …...
【云原生】k8s集群部署最新版ELFK日志采集平台
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Golang开…...
基于瑞芯微RK3576国产ARM八核2.2GHz A72 工业评估板——ROS2系统使用说明
前 言 本文主要介绍创龙科技TL3576-MiniEVM评估板演示基于Ubuntu的ROS系统(版本:ROS2 Foxy)使用说明,包括镜像编译、镜像替换,以及ROS系统测试的方法。适用开发环境如下。 Windows开发环境:Windows 10 64bit Linux虚拟机环境:VMware16.2.5、Ubuntu22.04.5 64bit U-B…...
android studio sdk unavailable和Android 安装时报错:SDK emulator directory is missing
md 网上说的都是更换proxy代理什么的,还有一些二其他乱七八糟的,根本没用,感觉很多就是解决不了问题,还贼多贼一致,同质化,感觉很坑人,让人觉得他们和我的一样的,大家都是按他们说的…...
qemu构建arm环境(AI生成)
要编译 qemu-system-arm,你需要安装一些依赖库,配置编译环境,并执行编译过程。以下是一般步骤,适用于大多数基于Linux的系统。 1. 安装依赖 首先,你需要安装一些必要的开发工具和库。你可以使用包管理器来安装这些依…...
10天学会嵌入式技术之51单片机-day-4
第十二章 中断系统 中断系统是单片机用于处理外部紧急事件的一种机制。中断系统工作的大致流程如下 图所示:当 CPU 正在处理某项任务时,外部发生了某个紧急事件,此时 CPU 会暂停当前 的工作,转而去处理这个紧急事件,处…...
spark—SQL3
连接方式 内嵌Hive: 使用时无需额外操作,但实际生产中很少使用。 外部Hive: 在虚拟机下载相关配置文件,在spark-shell中连接需将hive-site.xml拷贝到conf/目录并修改url、将MySQL驱动copy到jars/目录、把core-site.xml和hdfs-sit…...
CENTOS 7 安装VNC
一、VNC简介 VNC(Virtual Network Computing),为一种使用RFB协议的屏幕画面分享及远程操作软件。此软件借由网络,可发送键盘与鼠标的动作及即时的屏幕画面。 VNC与操作系统无关,因此可跨平台使用,例如可用…...
第42讲:走进智慧农业的“感知神经系统”——农田遥感 + 边缘计算的融合实践
目录 ✨一、为什么要融合遥感与边缘计算? 🧪二、典型应用场景案例 ✅ 案例 1:棉花田的智能水分监测系统 ✅ 案例 2:水稻纹枯病自动识别与预警系统 💻三、关键技术框架与实现思路 🚦 1. 系统架构流程图: 📦 2. 模型部署建议: 💡四、未来发展趋势展望 �…...
Dify忘记管理员密码,重置的问题
今天本地win10电脑,使用源码启动dify,忘记了管理员账号和密码,于是网上查找解决办法。 1.有的网上资料说是去数据库删除用户表,于是进入数据库: docker exec -it docker-db-1 psql -U postgres -d dify 找到postgre…...
C#—Lazy<T> 类型(延迟初始化/懒加载模式)
C# 的 Lazy<T> 类型 Lazy<T> 是 C# 中的一个类,用于实现延迟初始化(懒加载)模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象,直到第一次实际需要时才进行初始化。 主要特点 延迟初始化:…...
unity打包安卓时的签名文件jks转换keystore
前言 unity打包安卓时需要的签名文件格式默认是keystore,而有时我们拿到的是jks格式的签名文件,就需要把jks格式文件转换成keystore格式文件。 其实在windows下也可以不转换,在选择签名文件的文件选择框时,把文件扩展名筛选项&a…...
Android audio_policy_configuration.xml加载流程
目录 一、audio_policy_configuration.xml文件被加载流程 1、AudioPolicyService 创建阶段 2、createAudioPolicyManager 实现 3、AudioPolicyManager 构造 4、配置文件解析 loadConfig 5、核心解析逻辑 PolicySerializer::deserialize 二、AudioPolicyConfig类解析 1、…...
AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解
在 Launcher3 执行涉及其他应用窗口(即“远程窗口”)的动画时,例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画,SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …...
iframe下系统访问跨域问题解决办法
问题描述:iframe下嵌入web页面,访问后端接口跨域,导致接口调不通。 产生原因:iframe下,web端访问后端接口时,会优先向后端发送请求方法为OPTIONS的预检测请求,该请求调用不通,导致真…...
Kafka 如何理解Kafka的高可用
一、Kafka高可用核心思想:备胎的自我修养 核心口诀:“别把鸡蛋放在一个篮子里,除非你他妈有100个篮子!” Kafka的高可用设计,本质上就是一场**“分布式备胎大战”**。它的核心逻辑是: “老子不信任任何单…...
11-DevOps-Jenkins Pipeline流水线作业
前面已经完成了,通过在Jenkins中创建自由风格的工程,在界面上的配置,完成了发布、构建的过程。 这种方式的缺点就是如果要在另一台机器上进行同样的配置,需要一项一项去填写,不方便迁移,操作比较麻烦。 解…...
C++学习之游戏服务器开发十一DOCKER的基本使用
目录 1.多实例部署方案 2.容器的概念 3.docker初识 4.docker仓库 5.docker镜像 6.docker容器 7.docker和虚拟机的区别 8.docker命令解释 9.dockerfile构建镜像 10.离线分发镜像 1.多实例部署方案 redis 命令( redis-cli XXXX ) set key value:…...
docker学习笔记2-最佳实践
一、在容器中启动mysql的最佳实践 (一)查找目录 1、mysql的配置文件路径 /etc/mysql/conf.d 2、mysql的数据目录 /var/lib/mysql 3、环境变量 4、端口 mysql的默认端口3306。 (二)启动命令 docker run -d -p 3306:3306 …...
【TeamFlow】4.2 Yew库详细介绍
Yew 是一个用于构建高效、交互式前端 Web 应用程序的现代 Rust 框架,它借鉴了 React 和 Elm 等框架的设计理念,同时充分利用 Rust 的语言特性。 核心特性 基于组件的架构 Yew 采用组件化开发模式,类似于 React: 组件是可重用的 UI 构建块 …...
第六章.java集合与泛型
文章目录 1.集合框架1. Collection 接口存储一组不唯一,无序的对象2. Set接口存储一组唯一,无序的对象3. Map接口存储一组键值对象,提供key到value的映射 2.封装3.练习题 1.集合框架 java集合框架提供了一套性能优良,使用方便的接口和类,它们位于java.util中 1. Collection 接…...
elastic/go-elasticsearch与olivere/elastic
在 Go 语言中,与 Elasticsearch 交互的客户端库有多种选择,其中 github.com/elastic/go-elasticsearch/v8 和 github.com/olivere/elastic/v7 是两个常用的库。这两个库的功能和用途有一些差异,以下是它们的详细对比: 1. github.c…...
MYSQL之基础认识(卸载安装登录, 基本概念)
一. 卸载安装和登录 卸载 MYSQL 1. 查看有无mysql服务正在运行: ps ajx | grep mysql 2. 查看到 mysql 的服务名称: systemctl list-units --typeservice | grep mysql 3. 关闭 mysql 服务 4. 卸载 dpkg -l | grep mysql | awk {print $2} | xargs sudo apt remove --purg…...
Sentinel源码—7.参数限流和注解的实现一
大纲 1.参数限流的原理和源码 2.SentinelResource注解的使用和实现 1.参数限流的原理和源码 (1)参数限流规则ParamFlowRule的配置Demo (2)ParamFlowSlot根据参数限流规则验证请求 (1)参数限流规则ParamFlowRule的配置Demo 一.参数限流的应用场景 二.参数限流规则的属性 …...
JAVA:利用 Apache Tika 提取文件内容的技术指南
1、简述 Apache Tika 是一个强大的工具,用于从各种文件中提取内容和元数据。📄Tika 支持解析文档、📸图像、🎵音频、🎥视频文件以及其他多种格式,非常适合构建🔍搜索引擎、📂内容管理系统和📊数据分析工具。 样例代码:https://gitee.com/lhdxhl/springboot-…...
SVM(支持向量机)
SVM(支持向量机) 原理 SVM的核心目标是找到一个最大化分类间隔的超平面,将不同类别的样本分隔开。其原理可分为三部分: 线性可分情况 通过硬间隔最大化确定超平面,确保所有样本正确分类且间隔最大间隔定义为超平面到最…...
Spark,hadoop的组成
(一)Hadoop的组成 对普通用户来说, Hadoop就是一个东西,一个整体,它能给我们提供无限的磁盘用来保存文件,可以使用提供强大的计算能力。 在Hadoop3.X中,hadoop一共有三个组成部分&#…...
数据结构中的各种排序
排序之冒泡排序 原理:比较相邻的元素,将大的元素放右边,小的元素放左边。每一趟排的最后的元素一定是最大的元素,所有下一趟需要排列的元素可减少一个 public int[] bubbleSort(int[] attr) {for (int i 0; i < attr.length…...
Android 中实现 GIF 图片动画
在 Android 中,ImageView 从 Android 9.0(API 级别 28) 开始原生支持 GIF 动画,通过 AnimatedImageDrawable 类实现。在之前的版本中,ImageView 并不支持直接播放 GIF 动画,只能显示 GIF 的第一帧。 一、 …...
linux安装mysql数据库
1.判断系统是多少位的 file /sbin/init2.下载linux安装包 5.7.25.64位安装包链接:https://pan.baidu.com/s/13vFuRikwJaI96K0AmUQXzg提取码:ga7h其他版本安装 去官网下载:https://dev.mysql.com/downloads/mysql/3.创建mysql文件夹 mkdir /…...