Qt C++ 3Dグラフ表示 QtDataVisualization


実行サンプル

x, y, z の3次元座標のテキストファイルを読み込み
3Dグラフ 散布図(scatter)として表示する。

※マウス操作でズームのみ可能。
※視点移動(=グラフ回転)はスライダーでする。(マウス操作はできない。)
※今時点のソースコードでは、スライダーを動かすと先にズームしていたのものが
 初期の位置に戻ってしまう。
 これから調べて、方法がわかれば修正するが
 それまでは、まず回転をスライダーでする→ズームするの順番で見たい位置を見る操作になる。

実行環境

windows10
Qt5.9
VisualStudio2019

実行手順

通常通り QtCreatorでコード作成して、実行する。

ソースコード

コード作成手順ポイント

■ Qt project 作成は通常通り (Qt Widget)

■ .proファイルに下記記述が必要

QT       += core gui datavisualization qml quick

■ MainWindow.cpp / h ファイルどちらも下記記述を記述する。
※記述する位置は 
・#includeの後 
・MainWindow::MainWindow(QWidget *parent)の手前

using namespace QtDataVisualization;

■ Mainwindow.h ファイルに下記記述が必要

#include <QtDataVisualization/q3dscatter.h>

■ Mainwindow.cpp ファイルに下記記述が必要

#include <QtDataVisualization/QScatter3DSeries>

■ MainWindow.cpp 散布図グラフ表示のため下記記述が必要だった。

    //初期設定 
    QScatter3DSeries *series = new QScatter3DSeries;
    series->setItemLabelFormat(QStringLiteral("@xLabel, @yLabel, @zLabel"));
    series->setMesh(QAbstract3DSeries::MeshCube);
    series->setItemSize(0.15f);
    m_graph->addSeries(series);
    // Add data from the QVector to datamodel 行、データを生成する
    QScatterDataArray *dataArray = new QScatterDataArray;
    dataArray->resize(itemList.count());
    QScatterDataItem *ptrToDataArray = &dataArray->first();
    for (int i = 0; i < itemList.count(); i++) {
        ptrToDataArray->setPosition(itemList.at(i));
        ptrToDataArray++;
    }

    m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray);

参考資料

参考:
■ 3D 立方体の自動回転表示 (マウス操作:ズームあり、視点移動なし)
https://github.com/fengfanchen/Qt/tree/master/3D%20move%20rotation

■ 3D objファイルから散布図でデータ表示(マウス操作:ズームあり、視点移動なし)
https://blog.csdn.net/qq78442761/article/details/103678544
https://github.com/fengfanchen/Qt/tree/master/3DScatter%20Demo

■ 参考:Qt付属のExampleコード
 ・サンプル customplot (マウス操作:ズームあり、視点移動なし?)
 ・サンプル bars (視点移動=グラフ回転)
  ↑スライダーで視点移動(マウス操作ではない。)

今後の参考予定

・マウス操作での視点移動のサンプルは、見つかっていない。
 これから調べる。

・Qt公式 サンプル surface (グラフ表示を参考にする)

・1つのグラフ領域(Axis)に2つ以上のグラフを描く
 →https://forum.qt.io/topic/92510/overlapped-surface3d-and-scatter3d/8
→Qt公式サンプルcustomitems 
 https://doc.qt.io/archives/qt-5.9/qtdatavisualization-customitems-example.html
→Qt公式サンプルrotation も参考になるかもしれない。 

・散布図表示 各座標点で色変更
https://stackoverflow.com/questions/44329125/q3dscatter-how-to-add-a-point-with-a-different-color-to-a-point-cloud