2014-01-27 32 views
1

我正在开发一个Qt(4.7.4)项目,需要绘制二维和三维坐标系统中的数据。我一直在研究vtk 6.1,因为它看起来非常强大,而且我还需要在稍后的时间将图像数据可视化。我基本上得到了二维地块的工作,但我卡在三维数据绘图。vtk 6.x,Qt: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)。这是如何融合在一起的?
+0

详细描述看一看在VTK例子如http://www.vtk.org/Wiki/VTK/Examples/Cxx/GeometricObjects/Cube了解'vtkRenderWindowInteractor'。 – Jakob

回答

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(); 
0

你可能想阅读vtkRenderViewBase

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