gpt4 book ai didi

c++ - 将 Eigen 仿射变换转换为 Eigen 等距变换

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:39 29 4
gpt4 key购买 nike

使用 Eigen 将仿射变换转换为等距变换(即仅由旋转和平移组成)的最简单方法是什么? 图书馆?

两种变换都是 3D 的。仿射矩阵在左上象限有一个通用的 3x3 矩阵(即旋转、缩放和剪切),而等轴测在同一象限有一个 3x3 旋转矩阵,因此需要投影。

Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a);

给出编译错误:

error C2338: YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION

同时

Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a.rotation(), a.translation());

给予

(line 2) error C2661: 'Eigen::Transform<_Scalar,_Dim,_Mode>::Transform' : no overloaded function takes 2 arguments

Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.rotation() = a.rotation();

给予

(line 4) error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Eigen::Matrix<_Scalar,_Rows,_Cols>' (or there is no acceptable conversion)

鉴于 rotation() 和 translation() 函数,问题可以改写为“如何最好地设置等距变换的旋转和平移分量?”

最佳答案

.rotation() 提取变换的旋转部分。它涉及一个 SVD,因此它是只读的。在左侧,您必须使用 .linear():

Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.linear() = a.rotation();

如果您知道“a”是一个等距图并且只想将其转换为等距图 3f,您可以简单地执行以下操作:

b = a.matrix();

关于c++ - 将 Eigen 仿射变换转换为 Eigen 等距变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956953/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com