CloudCompare 技巧三 点云变换

 30、点云平移

CloudCompare点云网格处理软件 8——点云网格距离测量_哔哩哔哩_bilibili

CloudCompare 技巧三 点云变换_第1张图片

CloudCompare 技巧三 点云变换_第2张图片

CloudCompare 技巧三 点云变换_第3张图片

恢复到之前的位置:

 CloudCompare 技巧三 点云变换_第4张图片

CloudCompare 技巧三 点云变换_第5张图片

 31、通过矩阵来旋转 

 CloudCompare 技巧三 点云变换_第6张图片

 32、通过X\Y\Z轴来旋转 

CloudCompare 技巧三 点云变换_第7张图片

 CloudCompare 技巧三 点云变换_第8张图片

恢复后的点云

CloudCompare 技巧三 点云变换_第9张图片

 将Z的哪里改成6:

CloudCompare 技巧三 点云变换_第10张图片

 然后将Z哪里改成2,看看区别:

CloudCompare 技巧三 点云变换_第11张图片

从上面的结论可以看出: 

 CloudCompare 技巧三 点云变换_第12张图片

xyz 旋转:

CloudCompare 技巧三 点云变换_第13张图片

恢复到前面的状态

 CloudCompare 技巧三 点云变换_第14张图片

 33、欧拉角旋转
CloudCompare 技巧三 点云变换_第15张图片

// 计算两个向量之间的罗德里格斯 矩阵 欧拉角
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、点云绕任意点旋转

CloudCompare 技巧三 点云变换_第16张图片


int Algorithm::RotateAnypoint(pcl::PointCloud::Ptr &cloud,
                              Eigen::Vector4f  ¢er,
                              Eigen::Vector4f & angle,
                              int axis,
                              Eigen::Vector3f &roate_axis,
                              pcl::PointCloud::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     "<()=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     "<size()<1)
    {
        return EXIT_FAILURE;
    }

    return  0;

}

35、放缩

CloudCompare 技巧三 点云变换_第17张图片

CloudCompare 技巧三 点云变换_第18张图片

你可能感兴趣的:(cloudcompare,3D,3d,算法)