VTK および QT のソース コードのコンパイルと例

1: はじめに

VTK: 3D コンピュータ グラフィックス、画像処理、データ視覚化、科学視覚化のためのオープンソース ソフトウェア ライブラリです。VTK は、ポイント、ライン、ポリゴン、2D および 3D 画像、ボリューム レンダリングなどの基本的なアルゴリズムとデータ構造を豊富に提供するだけでなく、表面再構築、流体力学シミュレーション、フィッティングと補間、画像などの多くの高度なアルゴリズムも提供します。セグメンテーションや画像処理など

QT: デスクトップ、モバイル デバイス、組み込みおよびリアルタイム アプリケーションの作成に使用できる、GUI、ネットワーク、データベース、XML、Bluetooth、マルチメディア、OpenGL などを含むライブラリの完全なセットを提供します。Qt のコードの移植性は非常に優れており、開発者はコードを変更することなく、Windows、Linux、Mac OS などのプラットフォームでコードを作成し、コンパイルして実行できます。Qt は、学習と使用が簡単、豊富なドキュメントとサンプル、豊富なサードパーティ ライブラリのサポート、速い開発速度、効率的なコード生成、美しく使いやすいインターフェイスを特徴としており、非常に人気のあるクロスプラットフォーム開発フレームワークです。

2: 環境

Win10

VS2019

VTK9.0.3 https://vtk.org/files/release/9​​.0/VTK-9.0.3.tar.gz

QT5.14.2 https://download.qt.io/archive/qt/5.14/5.14.2/

b6d5e5343c69c912f6db6829b4437459.png

ダウンロードが完了すると、VTK が解凍され、QT がインストールされます。

3: インストールとコンパイル

1. 最初にフォルダーを作成します

VTK ディレクトリの下に、build と install という 2 つのフォルダーを作成します。build はコンパイル結果と実行可能ファイルを保存し、install はコンパイルされた include と lib を保存します。

56fa0354d9fd79ce7d9126ce6e75c640.png

2.cmake設定

(1) 先ほどvtkを解凍した場所を選択します。(2) 作成したビルドフォルダーを選択します。(3)configure このうちAdvancedにチェックを入れる必要があり、ここではcmakeがデフォルトでチェックされています。

5b0a3ba3b5a82d7fb702b0eeecdec518.png

(1) vs2019 を選択 (2) x64 を選択 (3) 終了

ce6d8ba991ce5ffd37a30dc5182e5144.png

終わるのを待ちます

5129ff53ef6f20039115d73a7a9c9097.png

終了後には赤い警告が大量に表示されます。修正が必要な箇所がいくつかあります。CMAKE_INSTALL_PREFIX は、以前に作成したインストール フォルダーに場所を変更する必要があります。

4bb44b566b41c997226395ae7274bb68.png

VTK_BUILD_EXAMPLES をチェックする必要があります

e05691262e42d06f10a8d09a8516b4fe.png

QTを検索し、すべての値をYESに変更します

483c75218e866a2124124033854b99be.png

次に「設定」を押します。赤い警告も表示され、QT の場所が見つかりません。以下の位置に、以前にインストールした QT 位置を適宜入力します。(QT5.14.2にはVS2019フォルダがないので、VS2017に置き換えても同様です)

175ca7b1ddab0c929c75adf971421ae3.png

もう一度 [設定] を押すと、赤色の警告が表示されずにすべてが成功します。もう一度「生成」を押すと、下図のように生成されます。

500e17bcf5fb69476440d83239024ff7.png

3.コンパイル

以前に構築したビルド フォルダーで VTK.sln を見つけて開きます。

ebb30f711e2be11ab3dacd714e96607c.png

次のようにインターフェースを開き、リリースまたはデバッグを調整します。ALL_BUILD を見つけて右クリックし、ビルドします。

3cd420e730511bbd573b5a865311eb72.png

前の手順が完了したら、「INSTALL」を見つけて右クリックして生成します。

3ed5372063c1575ccf694c8eba690353.png

インストールが完了すると、インストールフォルダーに以下のファイルが生成されます。

afbf3a54662a6b44ddbe01c67d11a7f3.png

4: VS 構成 QT

1. 新しい C++ プロジェクトを作成し、[拡張機能] -- [拡張機能の管理] で QT を検索し、Qt Visual Studio ツールをダウンロードしてインストールします。

e90ced04cf005daf1f261d2ebb6052ff.png

2. インストールが完了したら、拡張機能--Qt VS Tools--Qt Versionsを開きます。

f37a39e7410a57a803da57ce7125c03d.png

3. 以前に Qt がインストールされた場所を入力します

1bfc5b55398d670a664cc1ff580a25ca.png

以上でVS構成QTの操作は完了です。

5: 例

1. 新しい VS プロジェクトを作成する

このとき、「QT」を検索すると、対応するQTプロジェクトがポップアップ表示され、作成できます。

bc9ea438defac7d39d3bdc399db61a7a.png

ここでは、DEBUG を直接選択して入力し、後で VS を通じてリリースするように調整できます。

7c9298c2eda8890b84df0869190e4f1f.png

新しく作成されたプロジェクトが入力されると、直接実行できるいくつかの基本コードがすでに存在します。次のウィンドウが表示されます。

13be305d454dbc38caea5506f97816e6.png

2. VTK環境を構成する

VC++ ディレクトリ -- インクルード ディレクトリ   

db37d8268b6e1ceb9a7e03c0c8ead610.png

VC++ ディレクトリ -- ライブラリ ディレクトリ

d6a40c2d98afbb942200903eb5b01c57.png

linker --input --追加の依存関係

be26b36e72178c92039c01a71a474194.png

デバッグ -- 環境 (ここで追加した環境は何らかの理由で機能しなかったので、ビンの下にあるすべての DLL を新しく作成した QT プロジェクトのリリース フォルダーにコピーしました)。

ebcfd01f697333eeb47018eb84635639.png

VTK環境の設定が完了しました。

3. テスト例

公式ウェブサイトの典型的な例

#include <QVTKOpenGLNativeWidget.h>
#include <vtkActor.h>
#include <vtkDataSetMapper.h>
#include <vtkDoubleArray.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkPointData.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>


#include <QApplication>
#include <QDockWidget>
#include <QGridLayout>
#include <QLabel>
#include <QMainWindow>
#include <QPointer>
#include <QPushButton>
#include <QVBoxLayout>


#include <cmath>
#include <cstdlib>
#include <random>


namespace {
/**
 * Deform the sphere source using a random amplitude and modes and render it in
 * the window
 *
 * @param sphere the original sphere source
 * @param mapper the mapper for the scene
 * @param window the window to render to
 * @param randEng the random number generator engine
 */
void Randomize(vtkSphereSource* sphere, vtkMapper* mapper,
               vtkGenericOpenGLRenderWindow* window, std::mt19937& randEng);
} // namespace


int main(int argc, char* argv[])
{
  QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());


  QApplication app(argc, argv);


  // main window
  QMainWindow mainWindow;
  mainWindow.resize(1200, 900);


  // control area
  QDockWidget controlDock;
  mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &controlDock);


  QLabel controlDockTitle("Control Dock");
  controlDockTitle.setMargin(20);
  controlDock.setTitleBarWidget(&controlDockTitle);


  QPointer<QVBoxLayout> dockLayout = new QVBoxLayout();
  QWidget layoutContainer;
  layoutContainer.setLayout(dockLayout);
  controlDock.setWidget(&layoutContainer);


  QPushButton randomizeButton;
  randomizeButton.setText("Randomize");
  dockLayout->addWidget(&randomizeButton);


  // render area
  QPointer<QVTKOpenGLNativeWidget> vtkRenderWidget =
      new QVTKOpenGLNativeWidget();
  mainWindow.setCentralWidget(vtkRenderWidget);


  // VTK part
  vtkNew<vtkGenericOpenGLRenderWindow> window;
  vtkRenderWidget->setRenderWindow(window.Get());


  vtkNew<vtkSphereSource> sphere;
  sphere->SetRadius(1.0);
  sphere->SetThetaResolution(100);
  sphere->SetPhiResolution(100);


  vtkNew<vtkDataSetMapper> mapper;
  mapper->SetInputConnection(sphere->GetOutputPort());


  vtkNew<vtkActor> actor;
  actor->SetMapper(mapper);
  actor->GetProperty()->SetEdgeVisibility(true);
  actor->GetProperty()->SetRepresentationToSurface();


  vtkNew<vtkRenderer> renderer;
  renderer->AddActor(actor);


  window->AddRenderer(renderer);


  // setup initial status
  std::mt19937 randEng(0);
  ::Randomize(sphere, mapper, window, randEng);


  // connect the buttons
  QObject::connect(&randomizeButton, &QPushButton::released,
                   [&]() { ::Randomize(sphere, mapper, window, randEng); });


  mainWindow.show();


  return app.exec();
}


namespace {
void Randomize(vtkSphereSource* sphere, vtkMapper* mapper,
               vtkGenericOpenGLRenderWindow* window, std::mt19937& randEng)
{
  // generate randomness
  double randAmp = 0.2 + ((randEng() % 1000) / 1000.0) * 0.2;
  double randThetaFreq = 1.0 + (randEng() % 9);
  double randPhiFreq = 1.0 + (randEng() % 9);


  // extract and prepare data
  sphere->Update();
  vtkSmartPointer<vtkPolyData> newSphere;
  newSphere.TakeReference(sphere->GetOutput()->NewInstance());
  newSphere->DeepCopy(sphere->GetOutput());
  vtkNew<vtkDoubleArray> height;
  height->SetName("Height");
  height->SetNumberOfComponents(1);
  height->SetNumberOfTuples(newSphere->GetNumberOfPoints());
  newSphere->GetPointData()->AddArray(height);


  // deform the sphere
  for (int iP = 0; iP < newSphere->GetNumberOfPoints(); iP++)
  {
    double pt[3] = {0.0};
    newSphere->GetPoint(iP, pt);
    double theta = std::atan2(pt[1], pt[0]);
    double phi =
        std::atan2(pt[2], std::sqrt(std::pow(pt[0], 2) + std::pow(pt[1], 2)));
    double thisAmp =
        randAmp * std::cos(randThetaFreq * theta) * std::sin(randPhiFreq * phi);
    height->SetValue(iP, thisAmp);
    pt[0] += thisAmp * std::cos(theta) * std::cos(phi);
    pt[1] += thisAmp * std::sin(theta) * std::cos(phi);
    pt[2] += thisAmp * std::sin(phi);
    newSphere->GetPoints()->SetPoint(iP, pt);
  }
  newSphere->GetPointData()->SetScalars(height);


  // reconfigure the pipeline to take the new deformed sphere
  mapper->SetInputDataObject(newSphere);
  mapper->SetScalarModeToUsePointData();
  mapper->ColorByArrayComponent("Height", 0);
  window->Render();
}
} // namespace

c3fc4b4104e2839df91ae1042c3c198f.png

おすすめ

転載: blog.csdn.net/weixin_41202834/article/details/130920132