Eigen库:(三)空间变换
生活随笔
收集整理的這篇文章主要介紹了
Eigen库:(三)空间变换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們將介紹幾何模塊提供的處理2D和3D旋轉以及投影或仿射變換的方法。
1. 變換類型
// 下面的類型將d換成f就可以得到單精度的數據結構 Eigen::Matrix3d; //旋轉矩陣3*3 Eigen::AngleAxisd; //旋轉向量3*1 Eigen::Vector3d; //歐拉角3*1 Eigen::Quaterniond; //四元數4*1 Eigen::Isometry3d; //歐氏變換矩陣4*4 Eigen::Affine3d; //仿射變換4*4 Eigen::Projective3d; //射影變換2. 旋轉定義
//旋轉向量 AngleAxisd rotation_vector(M_PI / 4,Vector3d(0,0,1)); //沿Z軸旋轉45度 //旋轉矩陣 Matrix3d rotation_matrix = Matrix3d::Identity(); rotation_matrix = rotation_vector.toRotationMatrix(); //用旋轉向量給旋轉矩陣賦值 rotation_matrix = rotation_vector.matrix(); //和toRotationMatrix()等價 //歐拉角 Vector3d euler_angles = rotation_matrix.eulerAngles(2,1,0); //ZYX順序,將旋轉矩陣直接轉化為歐拉角 //四元數 Quaterniond q = Quaterniond(rotation_vector); //用旋轉向量來初始化,反過來也行 q = Quaterniond(rotation_matrix); //用旋轉矩陣來初始化 //Quaterniond q(0.35,0.2,0.3,0.1); //直接用構造器定義也行3. 歐氏變換定義
//歐氏變換 Isometry3d T = Isometry3d::Identity(); T.rotate(AngleAxisd(M_PI / 4,Vector3d(0,0,1))); // 按照旋轉向量進行旋轉 T.pretranslate(Vector3d(1,3,4)); //pretranslate是加上t, translate是加上Rt cout<<"T(pretranslate) = \n"<<T.matrix()<<endl;T = Isometry3d::Identity(); T.rotate(AngleAxisd(M_PI / 4,Vector3d(0,0,1))); // 按照旋轉向量進行旋轉 //T = Isometry3d(AngleAxisd(M_PI / 4,Vector3d(0,0,1))); //直接用構造器定義旋轉變換也行 T.translate(Vector3d(1,3,4)); //pretranslate是加上t, translate是加上Rt cout<<"T(translate) = \n"<<T.matrix()<<endl;結果: T(pretranslate) = 0.707107 -0.707107 0 10.707107 0.707107 0 30 0 1 40 0 0 1 T(translate) = 0.707107 -0.707107 0 -1.414210.707107 0.707107 0 2.828430 0 1 40 0 0 14. 旋轉變換
//用AngleAxis進行坐標變換 Vector3d v(1,0,0); Vector3d v_rotated = rotation_vector * v; //用旋轉矩陣進行坐標變換 v_rotated = rotation_matrix * v; //用四元數進行坐標變換,使用重載的乘法即可 v_rotated = q * v; //注意數學上是qvq^{-1}//這里沒用歐拉角進行坐標變換,應該也能用的,可以自己搜一下5. 歐氏變換
Vector3d v(1,0,0); Vector3d v_transformed = T * v;總結
以上是生活随笔為你收集整理的Eigen库:(三)空间变换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 武汉大学计算机学院考研心得,武汉大学计算
- 下一篇: 职场任我行——软件测试工程师