VTK 6.x,QT:3D(线,表面,散射)绘图



我正在从事QT(4.7.4)项目,需要在2D和3D坐标系统中绘制数据。我一直在研究VTK 6.1,因为它总体上似乎非常强大,我还需要在以后可视化图像数据。我基本上有2D图可行,但绘制数据绘制3D。

这是我尝试的:我正在使用以下我从VTK的测试之一中获取的代码(图表/core/testing/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 Interactor分配到第三行中的视图是正确的吗?
  • 在测试中,将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());

最新更新