Qt Q3DScatter中元素的移动和旋转


程序运行截图如下:

这里的主要框架为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 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM