• 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 }
  • 相关阅读:
    20170417成员运算符、身份运算符、布尔运算符
    20170417学习find、replace、abs三个函数
    shell 双中括号 双小括号
    man 命令
    awk 命令-对文本和数据进行处理
    shell-1-day
    shell---0-day
    /etc
    Selenium IDE使用
    python 自动化测试框架 pytest 和unittest 的区别
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13396250.html
Copyright © 2020-2023  润新知