简体   繁体   English

vtk 6.x,Qt:3D(线,面,散点)绘图

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

I am working on a Qt (4.7.4) project and need to plot data in 2D and 3D coordinate systems. 我正在做一个Qt(4.7.4)项目,需要在2D和3D坐标系中绘制数据。 I've been looking into vtk 6.1 because it seems very powerful overall and I will also need to visualize image data at a later point. 我一直在研究vtk 6.1,因为它总体上看起来非常强大,并且以后还需要可视化图像数据。 I basically got 2D plots working but am stuck plotting data in 3D. 我基本上可以使用2D图,但是无法在3D模式下绘制数据。

Here's what I tried: I'm using the following piece of code that I took from one of vtk's tests ( Charts / Core / Testing / Cxx / TestSurfacePlot.cxx ). 这是我尝试的方法:我正在使用从vtk的一项测试(图表/核心/测试/ Cxx / TestSurfacePlot.cxx)中获得的以下代码。 The only thing I added is the QVTKWidget that I use in my GUI and its interactor: 我添加的唯一一件事是在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();

Now, this produces a plot but I can neither interact with it not does it look 3D. 现在,这将产生一个绘图,但是我既无法与之交互,也不会看起来像3D。 I would like to do some basic stuff like zoom, pan, or rotate about a pivot. 我想做一些基本的事情,例如缩放,平移或围绕枢轴旋转。 A few questions that come to my mind about this are: 我想到的几个问题是:

  • Is it correct to assign the QVTKWidget interactor to the view in the third line from the bottom? 在底部的第三行中将QVTKWidget交互器分配给视图是否正确?
  • In the test, a vtkChartXYZ is added to the vtkContextView. 在测试中,将vtkChartXYZ添加到vtkContextView。 According to the documentation, the vtkContextView is used to display a 2D scene but here is used with a 3D chart (XYZ). 根据文档,vtkContextView用于显示2D场景,但此处与3D图表(XYZ)一起使用。 How does this fit together? 这如何搭配在一起?

The following piece of code worked for me. 以下代码对我有用。 No need to explicitly assign an interactor because that's already been taken care of by QVTKWidget. 无需显式分配一个交互器,因为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();

You might want read the detailed description in vtkRenderViewBase 您可能需要阅读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