vtk 6.x,Qt:3D(线、面、散点图)绘图
Posted
技术标签:
【中文标题】vtk 6.x,Qt:3D(线、面、散点图)绘图【英文标题】:vtk 6.x, Qt: 3D (line, surface, scatter) plotting 【发布时间】:2014-01-27 16:34:02 【问题描述】:我正在从事 Qt (4.7.4) 项目,需要在 2D 和 3D 坐标系中绘制数据。我一直在研究 vtk 6.1,因为它总体上看起来非常强大,而且我还需要在以后可视化图像数据。我基本上得到了 2D 绘图,但在 3D 中绘制数据时卡住了。
这是我尝试过的:我正在使用从 vtk 的一项测试( Charts / 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交互器分配给倒数第三行的视图是否正确? 在测试中,vtkChartXYZ 被添加到 vtkContextView 中。根据文档,vtkContextView 用于显示 2D 场景,但此处与 3D 图表 (XYZ) 一起使用。这如何结合在一起?【问题讨论】:
查看 VTK 示例,例如vtk.org/Wiki/VTK/Examples/Cxx/GeometricObjects/Cube 了解vtkRenderWindowInteractor
。
【参考方案1】:
以下代码对我有用。无需显式分配交互器,因为 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();
【讨论】:
【参考方案2】:您可能需要阅读vtkRenderViewBase中的详细说明
QVTKWidget *widget = new QVTKWidget;
vtkContextView *view = vtkContextView::New();
view->SetInteractor(widget->GetInteractor());
widget->SetRenderWindow(view->GetRenderWindow());
【讨论】:
以上是关于vtk 6.x,Qt:3D(线、面、散点图)绘图的主要内容,如果未能解决你的问题,请参考以下文章