点云学习——创建图形

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点云学习——创建图形相关的知识,希望对你有一定的参考价值。

点云学习——创建图形

创建图形

1.创建线

#include <pcl/visualization/common/shapes.h>

// The following are given (or computed using sample consensus techniques -- see SampleConsensusModelLine)
// Eigen::Vector3f point_on_line, line_direction;
 
pcl::ModelCoefficients line_coeff;
line_coeff.values.resize (6);    // We need 6 values
//起点
line_coeff.values[0] = point_on_line.x ();
line_coeff.values[1] = point_on_line.y ();
line_coeff.values[2] = point_on_line.z ();
//终点
line_coeff.values[3] = line_direction.x ();
line_coeff.values[4] = line_direction.y ();
line_coeff.values[5] = line_direction.z ();
 
viewer->addCube(cube_coeff);

2.创建矩形,使用四元数旋转

Quaternion 四元数

#include <pcl/visualization/common/shapes.h>
#include <QtMath>

void MainWindow::on_actioncreatecube_triggered()

    //创建矩形
    pcl::ModelCoefficients cube_coeff;
    //coefficients	the cube coefficients (Tx, Ty, Tz, Qx, Qy, Qz, Qw, width, height, depth)
    cube_coeff.values.resize(10); 

    //Translation
    //起点
    cube_coeff.values[0] = 0;//Tx
    cube_coeff.values[1] = 0;//Ty
    cube_coeff.values[2] = 0;//Tz

    //Quaternion
    //旋转
    int d[]=0,0,1;//旋转轴方向
    qreal angle = M_PI_4;//旋转角度rad,可使用M_PI、M_PI_4等
    //用四元数表示旋转:某一图形围绕某一向量d旋转了角度angle,其四元数的值如下
    cube_coeff.values[3] = d[0]*qSin(angle/2);//Qx
    cube_coeff.values[4] = d[1]*qSin(angle/2);//Qy
    cube_coeff.values[5] = d[2]*qSin(angle/2);//Qz
    cube_coeff.values[6] = qCos(angle/2);//Qw

    //cube大小
    cube_coeff.values[7] = 1;//width
    cube_coeff.values[8] = 1;//height
    cube_coeff.values[9] = 1;//depth

    viewer->addCube(cube_coeff);

图形的移动

Affine 仿射变换


bool pcl::visualization::PCLVisualizer::updateShapePose	(	const std::string & 	id,
const Eigen::Affine3f & 	pose 
)	

移动方块

void MainWindow::on_actionmove_triggered()

    Eigen::Affine3f aff(2,2,2); //输入要移动到的点
    viewer->updateShapePose("cube",aff);
    viewFresh();

定时器自动移动

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)

    ui->setupUi(this);   
        
	timer = new QTimer(this);
    timer->stop();
    connect(timer,&QTimer::timeout,this,&MainWindow::move);


void MainWindow::move()

    static float i=1;
    ++i;
    Eigen::Affine3f aff(i,i,i);
    viewer->updateShapePose("cube",aff);
    viewFresh();


void MainWindow::on_actionmove_triggered()

    if(timer->isActive())timer->stop();
    else timer->start(1000);

路径移动

沿三维直线移动:辗转相除法求方向向量

int MainWindow::gcd(int a, int b)

    //辗转相除法,求最大公约数
    if(b==0)return a;
    else return gcd(b,a%b);


int MainWindow::gcd3(int a, int b, int c)

    //三个数求最大公约数
    return gcd(gcd(a,b),c);


void MainWindow::on_actionsetpath_triggered()

//p1,p2,p3,cp 都是QVector<float>类型
    p1.resize(3);//路径起点
    p2.resize(3);//路径上某一点
    p3.resize(3);//方向向量
    cp.resize(3);//移动的点
    
    p1=0,0,0;
    p2=12,12,18;
    for (int i=0;i<3 ;++i ) 
        p3[i]=p2[i]-p1[i];
    
    //计算直线的向量
    int c = gcd3(p3[0],p3[1],p3[2]);
    qDebug()<<c;
    for(auto& i : p3)
        i /= c ;
    


//随时间移动
void MainWindow::move()

    static float t=0;
    t+=0.01;

    for (int i=0;i<3 ;++i ) 
        cp[i]=p1[i]+t*p3[i];
    
    qDebug()<<"x:"<<cp[0]<<" y:"<<cp[1]<<" z:"<<cp[2];

    Eigen::Affine3f aff(cp[0],cp[1],cp[2]);
    viewer->updateShapePose("cube",aff);
    ui->widget->update();



以上是关于点云学习——创建图形的主要内容,如果未能解决你的问题,请参考以下文章

matlab对点云旋转平移

QT+PCL 点云学习

QT+PCL 点云学习

从点云创建不规则的 3D 几何图形

点云处理基于深度学习模型的不同处理方式

点云处理基于深度学习模型的不同处理方式