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;
}