Eigen几何变换类 (Transform, Quaternion等)

1. Transform 类:仿射/射影变换

模板参数

cpp

Transform<Scalar, Dim, Mode, Options>
  • Scalar:数据类型(如 floatdouble)。

  • Dim:维度(2 或 3)。

  • Mode:变换类型:

    • Affine(默认):仿射变换(平移+旋转+缩放)。

    • AffineCompact:无缩放项的仿射变换。

    • Projective:射影变换(含透视效果)。

  • Options:存储顺序(ColMajor 或 RowMajor)。

核心属性与方法
方法/属性参数说明返回值/功能示例
matrix()返回底层 4x4 变换矩阵Matrix4f m = t.matrix();
translate(Vector3f)平移向量应用平移(修改自身)t.translate(Vector3f(1, 0, 0));
rotate(Quaternionf)四元数或旋转矩阵应用旋转t.rotate(AngleAxisf(M_PI/2, Vector3f::UnitZ()));
scale(Scalar) 或 scale(Vector3f)统一缩放因子或各轴独立缩放应用缩放t.scale(2.0);
prescale()prerotate()pretranslate()类似上述方法,但右乘(先执行新变换)链式变换t.pretranslate(Vector3f(0, 1, 0));
inverse()返回逆变换Transform3f inv_t = t.inverse();
linear()返回线性部分(旋转+缩放,3x3矩阵)Matrix3f R = t.linear();
translation()返回平移部分(向量)Vector3f pos = t.translation();
初始化方式
方法示例说明
单位变换Transform3f t = Transform3f::Identity();初始化为单位变换
从旋转矩阵构造t.linear() = AngleAxisf(θ, axis).toRotationMatrix();设置旋转部分

2. Quaternion 类:三维旋转

模板参数

cpp

Quaternion<Scalar, Options>
  • Scalar:数据类型(如 floatdouble)。

  • Options:存储顺序(AutoAlign 或 DontAlign)。

核心属性与方法
方法/属性参数说明返回值/功能示例
w()x()y()z()访问四元数分量(实部 w,虚部 x,y,zfloat qw = q.w();
coeffs()返回向量格式 [x, y, z, w]Vector4f coeff = q.coeffs();
normalize()归一化四元数(修改自身)q.normalize();
conjugate()返回共轭四元数Quaternionf q_conj = q.conjugate();
toRotationMatrix()转换为 3x3 旋转矩阵Matrix3f R = q.toRotationMatrix();
AngleAxis(angle, axis)angle:弧度,axis:旋转轴(需归一化)从轴角构造四元数Quaternionf q = AngleAxisf(M_PI/2, Vector3f::UnitZ());
slerp(Scalar t, Quaternion other)t:插值因子(0~1),other:目标四元数球面线性插值Quaternionf q_interp = q1.slerp(0.5, q2);
初始化方式
方法示例说明
直接构造Quaternionf q(w, x, y, z);注意参数顺序(w在前)
从旋转矩阵构造Quaternionf q(rotation_matrix);需矩阵正交

3. 其他几何类

(1) AngleAxis(轴角表示)
方法/属性参数说明示例
angle()返回旋转角度(弧度)float θ = aa.angle();
axis()返回旋转轴(需归一化)Vector3f axis = aa.axis();
toRotationMatrix()转换为 3x3 旋转矩阵Matrix3f R = aa.toRotationMatrix();
(2) Rotation2D(二维旋转)
方法参数说明示例
angle()返回旋转角度(弧度)Rotation2Df rot(M_PI/4);
toRotationMatrix()转换为 2x2 旋转矩阵Matrix2f R = rot.toRotationMatrix();

4. 代码示例

组合变换(平移+旋转+缩放)

cpp

#include <Eigen/Geometry>
using namespace Eigen;// 初始化变换
Transform<float, 3, Affine> t = Transform<float, 3, Affine>::Identity();
t.translate(Vector3f(1, 2, 3));                      // 平移
t.rotate(Quaternionf(AngleAxisf(M_PI/2, Vector3f::UnitX()))); // 绕 X 轴旋转 90°
t.scale(0.5);                                        // 缩放// 应用变换到点
Vector3f p(0, 1, 0);
Vector3f p_transformed = t * p;  // 结果: (1, 2.5, 3)
四元数插值

cpp

Quaternionf q1 = Quaternionf::Identity();
Quaternionf q2(AngleAxisf(M_PI/2, Vector3f::UnitZ()));
Quaternionf q_mid = q1.slerp(0.5, q2);  // 中间旋转

5. 关键注意事项

  1. 变换顺序:Eigen 默认左乘(即 t.rotate() 是相对于局部坐标系)。

    • 使用 prerotate()/pretranslate() 可切换为右乘(相对于世界坐标系)。

  2. 性能优化

    • 对于纯旋转,直接使用 Quaternion 或 AngleAxis 比 Transform 更高效。

    • 频繁变换组合时,优先复用 Transform 对象。

  3. 归一化:四元数和旋转轴需手动归一化(normalize())。

6. 几何类对比

类名最佳用途内存占用计算效率
Transform复合变换(平移+旋转+缩放)16 floats (3D)中等
Quaternion纯旋转/插值4 floats
AngleAxis轴角表示旋转4 floats (3+1)低(需转换)
Rotation2D二维旋转1 float

掌握这些类后,可高效处理 2D/3D 空间中的几何变换!更多细节见 Eigen Geometry 文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openGauss手工配置主备

1、初始化 创建一个操作系统用户&#xff0c;例如postgres&#xff0c;为这个用户设置PATH和LD_LIBRARY_PATH环境变量&#xff0c;指向opengauss/bin和opengauss/lib export GAUSSHOME/mnt/disk01/opengauss export PATH$GAUSSHOME/bin:$PATH export LD_LIBRARY_PATH$GAUSS…

CSS预处理器对比:Sass、Less与Stylus如何选择

引言 CSS预处理器已成为现代前端开发的标准工具&#xff0c;它们通过添加编程特性来增强纯CSS的功能&#xff0c;使样式表更加模块化、可维护且高效。在众多预处理器中&#xff0c;Sass、Less和Stylus是三个最流行的选择&#xff0c;它们各自拥有独特的语法和功能特点。本文将深…

基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述

以下是基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述,使用文本和Mermaid语法表示: 架构图(Mermaid语法) #mermaid-svg-WWCAqL1oWjvRywVJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WWCAq…

js中get,set用法

1、作为对象的访问器属性 //使用Object.definePropertylet obj {_a:123};Object.defineProperty(obj, "a", {get() {return this._a;},set(val) {this._aval},});console.log(obj.a); //123obj.a456console.log(obj.a) // 456 //使用对象字面量let obj {_a:123,ge…

Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?

Steam游戏服务器的DDoS攻防体系设计&#xff0c;从协议层漏洞利用到业务连续性保障&#xff0c;深度拆解反射型攻击、TCP状态耗尽等7类威胁场景。基于全球15个游戏厂商攻防实战数据&#xff0c;提供包含边缘节点调度、AI流量指纹识别、SteamCMD加固配置的三维防护方案&#xff…

【AI】SpringAI 第四弹:接入本地大模型 Ollama

Ollama 是一个开源的大型语言模型服务工具。它的主要作用是帮助用户快速在本地运行大模型&#xff0c; 简化了在 Docker 容器内部署和管理大语言模型&#xff08;LLM&#xff09;的过程。 1. 确保Ollama 已经启动 # 查看帮助文档 ollama -h# 自动下载并启动 ollama run deeps…

大语言模型的评估指标

目录 一、混淆矩阵 1. 混淆矩阵的结构&#xff08;二分类为例&#xff09; 2.从混淆矩阵衍生的核心指标 3.多分类任务的扩展 4. 混淆矩阵的实战应用 二、分类任务核心指标 1. Accuracy&#xff08;准确率&#xff09; 2. Precision&#xff08;精确率&#xff09; 3. …

SpringBoot Gradle插件:构建与打包配置

文章目录 引言一、Spring Boot Gradle插件基础二、依赖管理与配置三、应用打包配置四、启动脚本与运行配置五、多环境构建与配置六、集成Docker与云原生支持七、实践案例&#xff1a;自定义Spring Boot应用构建总结 引言 在Java生态系统中&#xff0c;Gradle作为一种灵活且强大…

Vue3 组件通信与插槽

Vue3 组件通信方式全解&#xff08;10种方案&#xff09; 一、组件通信方式概览 通信方式适用场景数据流向复杂度Props/自定义事件父子组件简单通信父 ↔ 子⭐v-model 双向绑定父子表单组件父 ↔ 子⭐⭐Provide/Inject跨层级组件通信祖先 → 后代⭐⭐事件总线任意组件间通信任…

【KWDB 创作者计划】_嵌入式硬件篇---数字电子器件

文章目录 前言一、系列前缀(如 "74" 或 "54")74(商用级)54(工业级)二、逻辑家族(如 "LS"、"HC"、"HCT" 等)TTL(晶体管-晶体管逻辑)家族CMOS(互补金属氧化物半导体)家族BiCMOS(双极 CMOS)家族三、功能编号(如…

黄勇的《架构探险:从Java到大数据》内容详解

《架构探险&#xff1a;从Java到大数据》内容详解 1. 书籍核心主题 黄勇的《架构探险&#xff1a;从Java到大数据》是一本系统性探讨架构设计演进的著作&#xff0c;结合Java技术栈和大数据场景&#xff0c;深入分析了从单体架构到分布式、微服务、云原生的演进路径&#xff0…

【动手学强化学习】番外8-IPPO应用框架学习与复现

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明&#xff08;1&#xff09;MAPPO 与 IPPO 算法的区别在于什么地方&#xff1f;&#xff08;2&#xff09;IPPO 算法应用框架主要参考来源 2.2 应用步骤2.2.1 搭建基础环境2.2.2 IPPO 算法实例复现&am…

驱动开发硬核特训 · Day 17:深入掌握中断机制与驱动开发中的应用实战

&#x1f3a5; 视频教程请关注 B 站&#xff1a;“嵌入式 Jerry” 一、前言 在嵌入式驱动开发中&#xff0c;“中断”几乎无处不在。无论是 GPIO 按键、串口通信、网络设备&#xff0c;还是 SoC 上的各种控制器&#xff0c;中断都扮演着核心触发机制的角色。对中断机制掌握程度…

通过门店销售明细表用PySpark得到每月每个门店的销冠和按月的同比环比数据

假设我在Amazon S3上有销售表的Parquet数据文件的路径&#xff0c;包含ID主键、门店ID、日期、销售员姓名和销售额&#xff0c;需要分别用PySpark的SparkSQL和Dataframe API统计出每个月所有门店和各门店销售额最高的人&#xff0c;不一定是一个人&#xff0c;以及他所在的门店…

PostgreSQL 常用日志

PostgreSQL 常用日志详解 PostgreSQL 提供了多种日志类型&#xff0c;用于监控数据库活动、排查问题和优化性能。以下是 PostgreSQL 中最常用的日志类型及其配置和使用方法。 一、主要日志类型 日志类型文件位置主要内容用途服务器日志postgresql-<日期>.log服务器运行…

MySQL 存储过程:解锁数据库编程的高效密码

目录 一、什么是存储过程?二、创建存储过程示例 1:创建一个简单的存储过程示例 2:创建带输入参数的存储过程示例 3:创建带输出参数的存储过程三、调用存储过程调用无参数存储过程调用带输入参数的存储过程调用带输出参数的存储过程四、存储过程中的流控制语句示例 1:使用 …

基于STM32的物流搬运机器人

功能&#xff1a;智能循迹、定距夹取、颜色切换、自动跟随、自动避障、声音夹取、蓝牙遥控、手柄遥控、颜色识别夹取、循迹避障、循迹定距…… 包含内容&#xff1a;完整源码、使用手册、原理图、视频演示、PPT、论文参考、其余资料 资料只私聊

pg_jieba 中文分词

os: centos 7.9.2009 pg: 14.7 pg_jieba 依赖 cppjieba、limonp pg_jieba 下载 su - postgreswget https://github.com/jaiminpan/pg_jieba/archive/refs/tags/vmaster.tar.gzunzip ./pg_jieba-master cd ~/pg_jieba-mastercppjieba、limonp 下载 su - postgrescd ~/pg_jie…

基于Python+Flask的MCP SDK响应式文档展示系统设计与实现

以下是使用Python Flask HTML实现的MCP文档展示系统&#xff1a; # app.py from flask import Flask, render_templateapp Flask(__name__)app.route(/) def index():return render_template(index.html)app.route(/installation) def installation():return render_templa…

【“星睿O6”AI PC开发套件评测】GPU矩阵指令算力,GPU带宽和NPU算力测试

【“星睿O6”AI PC开发套件评测】GPU矩阵指令算力&#xff0c;GPU带宽和NPU算力测试 安谋科技、此芯科技与瑞莎计算机联合打造了面向AI PC、边缘、机器人等不同场景的“星睿O6”开发套件 该套件异构集成了Armv9 CPU核心、Arm Immortalis™ GPU以及安谋科技“周易”NPU 开箱和…