技巧三 点云变换"/>
CloudCompare 技巧三 点云变换
30、点云平移
CloudCompare点云网格处理软件 8——点云网格距离测量_哔哩哔哩_bilibili
恢复到之前的位置:
31、通过矩阵来旋转
32、通过X\Y\Z轴来旋转
恢复后的点云
将Z的哪里改成6:
然后将Z哪里改成2,看看区别:
从上面的结论可以看出:
xyz 旋转:
恢复到前面的状态
33、欧拉角旋转
// 计算两个向量之间的罗德里格斯 矩阵 欧拉角
int Algorithm::getMatrix_2_Vectors(Eigen::Vector3d &v1, Eigen::Vector3d &v2, Eigen::Matrix3d &Matrix3d, Eigen::Vector3d &euler)
{// 计算矩阵Matrix3d = Eigen::Quaterniond::FromTwoVectors(v1, v2).toRotationMatrix();// 两个向量-》矩阵-》欧拉角(x y z )euler = Eigen::Quaterniond::FromTwoVectors(v1, v2).toRotationMatrix().eulerAngles(0,1,2);return 0;
}
34、点云绕任意点旋转
int Algorithm::RotateAnypoint(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud,Eigen::Vector4f ¢er,Eigen::Vector4f & angle,int axis,Eigen::Vector3f &roate_axis,pcl::PointCloud<pcl::PointXYZ>::Ptr &out_cloud)
{if(cloud->size()<1){return EXIT_FAILURE;}Eigen::Matrix4f T0 = Eigen::Matrix4f::Identity();Eigen::Matrix4f T1 = Eigen::Matrix4f::Identity();T0.col(3).head<3>()=-center.head(3);cout<<"T0 "<<T0<<endl;T1.col(3).head<3>()=center.head(3);// 定义旋转矩阵Eigen::Isometry3f T=Eigen::Isometry3f::Identity();if(axis==1) // 1 0 0{Eigen::AngleAxisf M(angle[0], Eigen::Vector3f::UnitX()); // 轴角表达公式T.rotate(M);}else if(axis==2) // 010{Eigen::AngleAxisf M(angle[1], Eigen::Vector3f::UnitY()); // 轴角表达公式T.rotate(M);}else if(axis==3) // 0 0 1{Eigen::AngleAxisf M(angle[2], Eigen::Vector3f::UnitZ()); // 轴角表达公式T.rotate(M);}else if(axis==4) // 任一轴{Eigen::AngleAxisf M(angle[3],Eigen::Vector3f(0, 1, 1));T.rotate(M);}else if(axis==5){Eigen::AngleAxisf m_x(angle[0], Eigen::Vector3f::UnitZ());Eigen::AngleAxisf m_y(angle[1], Eigen::Vector3f::UnitZ());Eigen::AngleAxisf m_z(angle[2], Eigen::Vector3f::UnitZ());T.rotate(m_x*m_y*m_z);}Eigen::Matrix4f finanlTransform=T1*T.matrix()*T0;cout<<"finanlTransform "<<finanlTransform<<endl;pcl::transformPointCloud(*cloud,*out_cloud,finanlTransform);if(out_cloud->size()<1){return EXIT_FAILURE;}return 0;}
35、放缩
更多推荐
CloudCompare 技巧三 点云变换
发布评论