首页 > 技术文章 > Qt Q3DScatter中元素的移动和旋转

ybqjymy 2020-07-29 11:49 原文

程序运行截图如下:

这里的主要框架为Q3DScatter

首先是设置范围,免得随机生成坐标时,坐标系不停的变:

使用QScatter3DSeries生成一串的item。方便显示在m_graph中

使用QScatterDataItem进行元素的操作。

逻辑很简单把

旋转

关键代码

  1 #include "widget.h"
  2 #include "ui_widget.h"
  3 #include <QtDataVisualization/QScatter3DSeries>
  4 #include <QDebug>
  5 #include <QThread>
  6 #include <QTime>
  7 #include <QTimer>
  8 #include <QMessageBox>
  9  
 10  
 11 Widget::Widget(QWidget *parent) :
 12     QWidget(parent),
 13     ui(new Ui::Widget)
 14 {
 15     ui->setupUi(this);
 16     this->setWindowTitle("CSDN IT1995");
 17     m_graph = new Q3DScatter();
 18     m_graph->axisX()->setRange(-10, 10);
 19     m_graph->axisY()->setRange(-10, 10);
 20     m_graph->axisZ()->setRange(-10, 10);
 21     QWidget *container = QWidget::createWindowContainer(m_graph);
 22  
 23     qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
 24  
 25     if (!m_graph->hasContext()) {
 26  
 27         QMessageBox msgBox;
 28         msgBox.setText("Couldn't initialize the OpenGL context.");
 29         msgBox.exec();
 30         return;
 31     }
 32  
 33  
 34  
 35     //添加数据
 36     QScatter3DSeries *item = new QScatter3DSeries();
 37     item->setMesh(QAbstract3DSeries::MeshUserDefined);
 38     item->setUserDefinedMesh(":/img/1cube.obj");
 39  
 40     m_graph->addSeries(item);
 41  
 42  
 43     //设置到控件上
 44     QHBoxLayout *hLayout = new QHBoxLayout();
 45     hLayout->addWidget(container, 1);
 46     ui->widget->setLayout(hLayout);
 47  
 48     //生成线,数据:
 49     QScatterDataArray *dataArray = new QScatterDataArray;
 50     dataArray->resize(5);
 51     QScatterDataItem *ptrToDataArray = &dataArray->first();
 52  
 53     for(int i = 0; i <= dataArray->size(); i++){
 54  
 55         ptrToDataArray->setPosition(QVector3D(0, i, 0));
 56         ptrToDataArray++;
 57     }
 58  
 59     item->dataProxy()->resetArray(dataArray);
 60  
 61     //让其随机移动
 62     m_timer = new QTimer(this);
 63     connect(m_timer, &QTimer::timeout, [=](){
 64  
 65         QScatterDataItem *ptr = &dataArray->first();
 66  
 67         for(int i = 0; i < dataArray->size(); i++){
 68  
 69             ptr->setPosition(QVector3D(qrand()%8 > 4 ? qrand()%8 : -qrand()%8, 
 70                                        qrand()%8 > 4 ? qrand()%8 : -qrand()%8, 
 71                                        qrand()%8 > 4 ? qrand()%8 : -qrand()%8));
 72             ptr++;
 73         }
 74         item->dataProxy()->resetArray(dataArray);
 75     });
 76     m_timer->start(2000);
 77  
 78     //让其自身旋转
 79     m_rotationTimer = new QTimer(this);
 80     connect(m_rotationTimer, &QTimer::timeout, [=]() mutable{
 81  
 82         QScatterDataItem *ptr = &dataArray->first();
 83  
 84         for(int i = 0; i < dataArray->size(); i++){
 85  
 86             QQuaternion ruaternion = QQuaternion::fromAxisAndAngle(QVector3D(0.0f, 0.0f, 1.0f), 
 87                                                                    qrand()%600);
 88             ptr->setRotation(ruaternion);
 89             ptr++;
 90         }
 91         item->dataProxy()->resetArray(dataArray);
 92     });
 93     m_rotationTimer->start(100);
 94 }
 95  
 96 Widget::~Widget()
 97 {
 98     qDebug() << "Widget::~Widget()";
 99     delete m_graph;
100     delete ui;
101 }

 

推荐阅读