- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
使用 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/
我是一名优秀的程序员,十分优秀!