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  &center,
                              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、放缩

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值