c++ - 如何使用变换通过 Eigen 中的 Matrix3d 旋转矩阵旋转点 MatrixXd

标签 c++ matrix eigen

我有以下 MatrixXd V,代表二维形状的点:

==========================================
Bounding box vertices (AV) (Rows: 8 Cols: 3)
==========================================
[[ 2.367639937564554,  3.100420929531666,                  0]
 [ 2.367639937564554,  3.100420929531666,                  0]
 [ 2.367639937564554, -3.097445263635904,                  0]
 [ 2.367639937564554, -3.097445263635904,                  0]
 [-2.362324650030633,  3.100420929531666,                  0]
 [-2.362324650030633,  3.100420929531666,                  0]
 [-2.362324650030633, -3.097445263635904,                  0]
 [-2.362324650030633, -3.097445263635904,                  0]]

我想通过这个 Matrix3d 旋转矩阵旋转形状:

==========================================
RM: (RM)  (Rows: 3 Cols: 3)
==========================================
[[   0.997496638487424, -0.07071390391068358,                    0]
 [ 0.07071390391068358,    0.997496638487424,                    0]
 [                   0,                    0,                    1]]
==========================================

我想不出正确的方法...我已经检查过转换:

Affine3d tf = RM;
tf.rotate(V);

当然这行不通,因为 Eigen 报告没有从“Eigen::Matrix3d”到“Eigen::Affine3d”的可行转换。

简而言之,如何告诉 Eigen 使用此旋转矩阵 (RM) 作为变换并将其应用于目标矩阵 (V)?

因为我已经有了旋转矩阵,所以我没有理由使用四元数...

谢谢

最佳答案

为什么不直接将坐标矩阵乘以旋转矩阵?

#include <iostream>
#include <Eigen/Core>
#include <Eigen/Geometry>

int main(){

Eigen::MatrixXd AV(8,3);
AV << 
  2.367639937564554,  3.100420929531666,   0, 
  2.367639937564554,  3.100420929531666,   0, 
  2.367639937564554, -3.097445263635904,   0, 
  2.367639937564554, -3.097445263635904,   0, 
 -2.362324650030633,  3.100420929531666,   0, 
 -2.362324650030633,  3.100420929531666,   0, 
 -2.362324650030633, -3.097445263635904,   0, 
 -2.362324650030633, -3.097445263635904,   0; 

Eigen::Matrix3d RM(3,3);
RM <<  0.997496638487424,  -0.07071390391068358,  0,
       0.07071390391068358, 0.997496638487424,    0,
       0,                   0,                    1;


Eigen::AngleAxisd aa(RM);
std::cout << "Axis: " << aa.axis().transpose() << " angle:" << aa.angle() << std::endl;

Eigen::MatrixXd result = AV * RM;
std::cout << "Result:" << std::endl  << result << std::endl;

return 0;
}

产生:

Axis: 0 0 1 angle:0.070773
Result:
 2.58096  2.92523        0
 2.58096  2.92523        0
 2.14268 -3.25712        0
 2.14268 -3.25712        0
-2.13717  3.25971        0
-2.13717  3.25971        0
-2.57544 -2.92264        0
-2.57544 -2.92264        0

关于c++ - 如何使用变换通过 Eigen 中的 Matrix3d 旋转矩阵旋转点 MatrixXd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59398083/

相关文章:

c++ - 如何将循环转换为递归?

c++ - OpenCV 函数来计算类似于 MATLAB 产品的数组元素的乘积?

c++ - 将 Matrix::row() 的返回分配给 Matrix<X,1,Dynamic>

c++ - 为什么特征向量点比手动循环慢

c++ - 在 C++ Map 中返回严格小于给定键的最大键

c++ - = txtSelect->GetValue(); C++,段错误。这很奇怪

c++ - qmake 相当于 cmake execute_process()

python - MPI - 发送和接收矩阵列

java - 假设列大小相同,如何在没有数组复制的情况下在 Java 中追加和前置 2D 数组?

c++ - Eigen - 排序矩阵对角线