簡體   English   中英

vtk 6.x,Qt:3D(線,面,散點)繪圖

[英]vtk 6.x, Qt: 3D (line, surface, scatter) plotting

我正在做一個Qt(4.7.4)項目,需要在2D和3D坐標系中繪制數據。 我一直在研究vtk 6.1,因為它總體上看起來非常強大,並且以后還需要可視化圖像數據。 我基本上可以使用2D圖,但是無法在3D模式下繪制數據。

這是我嘗試的方法:我正在使用從vtk的一項測試(圖表/核心/測試/ Cxx / TestSurfacePlot.cxx)中獲得的以下代碼。 我添加的唯一一件事是在GUI及其交互器中使用的QVTKWidget:

QVTKWidget vtkWidget;
vtkNew<vtkChartXYZ> chart;
vtkNew<vtkPlotSurface> plot;
vtkNew<vtkContextView> view;
view->GetRenderWindow()->SetSize(400, 300);
vtkWidget.SetRenderWindow(view->GetRenderWindow());

view->GetScene()->AddItem(chart.GetPointer());

chart->SetGeometry(vtkRectf(75.0, 20.0, 250, 260));

// Create a surface
vtkNew<vtkTable> table;
float numPoints = 70;
float inc = 9.424778 / (numPoints - 1);
for (float i = 0; i < numPoints; ++i)
{
    vtkNew<vtkFloatArray> arr;
    table->AddColumn(arr.GetPointer());
}
table->SetNumberOfRows(numPoints);
for (float i = 0; i < numPoints; ++i)
{
    float x = i * inc;
    for (float j = 0; j < numPoints; ++j)
    {
        float y  = j * inc;
        table->SetValue(i, j, sin(sqrt(x*x + y*y)));
    }
}

// Set up the surface plot we wish to visualize and add it to the chart.
plot->SetXRange(0, 9.424778);
plot->SetYRange(0, 9.424778);
plot->SetInputData(table.GetPointer());
chart->AddPlot(plot.GetPointer());

view->GetRenderWindow()->SetMultiSamples(0);
view->SetInteractor(vtkWidget.GetInteractor());
view->GetInteractor()->Initialize();
view->GetRenderWindow()->Render();

現在,這將產生一個繪圖,但是我既無法與之交互,也不會看起來像3D。 我想做一些基本的事情,例如縮放,平移或圍繞樞軸旋轉。 我想到的幾個問題是:

  • 在底部的第三行中將QVTKWidget交互器分配給視圖是否正確?
  • 在測試中,將vtkChartXYZ添加到vtkContextView。 根據文檔,vtkContextView用於顯示2D場景,但此處與3D圖表(XYZ)一起使用。 這如何搭配在一起?

以下代碼對我有用。 無需顯式分配一個交互器,因為QVTKWidget已經解決了該交互器。

QVTKWidget vtkWidget;
vtkSmartPointer<vtkContextView> view  = vtkSmartPointer<vtkContextView>::New();
vtkSmartPointer<vtkChartXYZ>    chart = vtkSmartPointer<vtkChartXYZ>::New();

// Create a surface
vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
float numPoints = 70;
float inc = 9.424778 / (numPoints - 1);
for (float i = 0; i < numPoints; ++i)
{
   vtkSmartPointer<vtkFloatArray> arr = vtkSmartPointer<vtkFloatArray>::New();
   table->AddColumn(arr.GetPointer());
}
table->SetNumberOfRows(numPoints);
for (float i = 0; i < numPoints; ++i)
{
    float x = i * inc;
    for (float j = 0; j < numPoints; ++j)
    {
        float y  = j * inc;
        table->SetValue(i, j, sin(sqrt(x*x + y*y)));
    }
}

view->SetRenderWindow(vtkWidget.GetRenderWindow());
chart->SetGeometry(vtkRectf(200.0, 200.0, 300, 300));
view->GetScene()->AddItem(chart.GetPointer());

vtkSmartPointer<vtkPlotSurface> plot = vtkSmartPointer<vtkPlotSurface>::New();

// Set up the surface plot we wish to visualize and add it to the chart.
plot->SetXRange(0, 10.0);
plot->SetYRange(0, 10.0);
plot->SetInputData(table.GetPointer());
chart->AddPlot(plot.GetPointer());

view->GetRenderWindow()->SetMultiSamples(0);
view->GetRenderWindow()->Render();

您可能需要閱讀vtkRenderViewBase中的詳細說明

QVTKWidget *widget = new QVTKWidget;
vtkContextView *view = vtkContextView::New();
view->SetInteractor(widget->GetInteractor());
widget->SetRenderWindow(view->GetRenderWindow());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM