C++ 如何使用vtkStreamTracer类使用非结构化网格数据(vtu)生成流线

C++ 如何使用vtkStreamTracer类使用非结构化网格数据(vtu)生成流线,c++,vtk,C++,Vtk,我正在使用VTK和C++来可视化来自vtu中xflow的数据。当我使用Paraview时,它可以生成正确的流线型,但当我使用VTK可视化数据时,它只显示轮廓和飞机模型。没有生成流线 vtkSmartPointer<vtkNamedColors> namedColors = vtkSmartPointer<vtkNamedColors>::New(); //The AirplaneModel file std::string meshfilename = "K:/Proj

我正在使用
VTK
C++
来可视化来自vtu中xflow的数据。当我使用Paraview时,它可以生成正确的流线型,但当我使用
VTK
可视化数据时,它只显示轮廓和飞机模型。没有生成流线

vtkSmartPointer<vtkNamedColors> namedColors = vtkSmartPointer<vtkNamedColors>::New();

//The AirplaneModel file
std::string meshfilename = "K:/Project/VTKproject/Airplane_Process/data/Mesh.vtp";
vtkSmartPointer<vtkXMLPolyDataReader> meshreader = vtkSmartPointer<vtkXMLPolyDataReader>::New();
meshreader->SetFileName(meshfilename.c_str());
meshreader->Update();

//The data file
std::string datafilename ="K:/Project/VTKproject/Airplane_Process/data/data.vtu";
vtkSmartPointer<vtkXMLUnstructuredGridReader> datareader = vtkSmartPointer<vtkXMLUnstructuredGridReader>::New();
datareader->SetFileName(datafilename.c_str());
datareader->Update();

//The seed points
vtkSmartPointer<vtkPointSource> seeds = vtkSmartPointer<vtkPointSource>::New();
seeds->SetCenter(0,0,0);
seeds->SetRadius(0.05);
seeds->SetNumberOfPoints(100);


//streamline generate

vtkSmartPointer<vtkStreamTracer> streamline = vtkSmartPointer<vtkStreamTracer>::New();
datareader->Update();
streamline->SetInputConnection(datareader->GetOutputPort());
streamline->SetSourceConnection(seeds->GetOutputPort());
//streamline->SetIntegrationStepUnit(vtkStreamTracer::CELL_LENGTH_UNIT);
streamline->SetMaximumPropagation(500);
streamline->SetMaximumIntegrationStep(0.1);
streamline->SetMinimumIntegrationStep(0.01);
streamline->SetInitialIntegrationStep(0.05);
//streamline->SetIntegrationStepUnit(vtkStreamTracer::CELL_LENGTH_UNIT);
streamline->SetIntegrationDirectionToBoth();
streamline->SetIntegratorTypeToRungeKutta45();
streamline->Update();

vtkSmartPointer<vtkPolyDataMapper> streamLineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
streamLineMapper->SetInputConnection(streamline->GetOutputPort());

vtkSmartPointer<vtkActor> streamLineActor = vtkSmartPointer<vtkActor>::New();
streamLineActor->SetMapper(streamLineMapper);

//outlinefilter
vtkSmartPointer<vtkOutlineFilter> outline =vtkSmartPointer<vtkOutlineFilter>::New();
outline->SetInputConnection(datareader->GetOutputPort());

vtkSmartPointer<vtkPolyDataMapper> outlineMapper =vtkSmartPointer<vtkPolyDataMapper>::New();
outlineMapper->SetInputConnection(outline->GetOutputPort());

vtkSmartPointer<vtkActor> outlineActor =vtkSmartPointer<vtkActor>::New();
outlineActor->SetMapper(outlineMapper);
outlineActor->GetProperty()->SetColor(0,0,0);

//
vtkSmartPointer<vtkPolyDataMapper> meshmapper = vtkSmartPointer<vtkPolyDataMapper>::New();
meshmapper->SetInputConnection(meshreader->GetOutputPort());

vtkSmartPointer<vtkActor> meshactor = vtkSmartPointer<vtkActor>::New();
meshactor->SetMapper(meshmapper);

//rendering
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(meshactor);
renderer->AddActor(outlineActor);
renderer->AddActor(streamLineActor);
//renderer->AddActor(actor);
renderer->SetBackground(namedColors->GetColor3d("Cadet").GetData());
//window
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);

//interaction
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);

vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderWindowInteractor->SetInteractorStyle(style);
renderWindowInteractor->Initialize();
renderWindow->SetSize(300, 300);
renderWindow->Render();
renderWindowInteractor->Start();
vtkSmartPointer namedColors=vtkSmartPointer::New();
//AirplaneModel文件
std::string meshfilename=“K:/Project/VTKproject/flair\u Process/data/Mesh.vtp”;
vtkSmartPointer=vtkSmartPointer::New();
meshreader->SetFileName(meshfilename.c_str());
meshreader->Update();
//数据文件
std::string datafilename=“K:/Project/VTKproject/flair\u Process/data/data.vtu”;
vtkSmartPointer数据读取器=vtkSmartPointer::New();
datareader->SetFileName(datafilename.c_str());
datareader->Update();
//种子点
vtkSmartPointer seeds=vtkSmartPointer::New();
种子->设置中心(0,0,0);
种子->设定半径(0.05);
种子->设定值(100);
//流线生成
vtkSmartPointer流线型=vtkSmartPointer::New();
datareader->Update();
流线型->设置输入连接(datareader->GetOutputPort());
流线型->设置资源连接(种子->GetOutputPort());
//流线型->设置集成步长单位(vtkStreamTracer::单元长度单位);
流线型->设置最大流量(500);
流线型->设置最大积分步长(0.1);
流线型->设置最小积分步长(0.01);
流线型->设置初始集成步骤(0.05);
//流线型->设置集成步长单位(vtkStreamTracer::单元长度单位);
流线型->设置集成方向Toboth();
流线型->设置集成类型ungekutta45();
流线型->更新();
vtkSmartPointer streamLineMapper=vtkSmartPointer::New();
streamLineMapper->SetInputConnection(streamline->GetOutputPort());
vtkSmartPointer streamLineActor=vtkSmartPointer::New();
streamLineActor->SetMapper(流线映射器);
//大纲视图过滤器
vtkSmartPointer outline=vtkSmartPointer::New();
outline->SetInputConnection(datareader->GetOutputPort());
vtkSmartPointer outlineMapper=vtkSmartPointer::New();
outlineMapper->SetInputConnection(outline->GetOutputPort());
vtkSmartPointer大纲视图编辑器=vtkSmartPointer::New();
大纲视图编辑器->设置映射器(大纲视图编辑器);
outlineActor->GetProperty()->SetColor(0,0,0);
//
vtkSmartPointer meshmapper=vtkSmartPointer::New();
meshmapper->SetInputConnection(meshreader->GetOutputPort());
vtkSmartPointer-meshactor=vtkSmartPointer::New();
meshactor->SetMapper(meshmapper);
//渲染
vtkSmartPointer=vtkSmartPointer::New();
渲染器->添加器(meshactor);
渲染器->添加器(大纲编辑器);
渲染器->添加器(streamLineActor);
//渲染器->AddActor(actor);
渲染器->设置背景(NamedColor->GetColor3d(“Cadet”).GetData());
//窗口
vtkSmartPointer renderWindow=vtkSmartPointer::New();
renderWindow->AddRenderer(渲染器);
//相互作用
vtkSmartPointer renderWindowInteractor=vtkSmartPointer::New();
RenderWindowWinterActor->SetRenderWindow(renderWindow);
VTKSmart指针样式=
vtkSmartPointer::New();
RenderWinterActor->SetInteractiorStyle(样式);
renderWindowInteractor->Initialize();
渲染窗口->设置大小(300300);
renderWindow->Render();
renderWindowInteractor->Start();
这是我在paraview中生成的所需输出

这是我的代码的结果:


关于如何解决这个问题有什么想法吗?

我一直在寻找或多或少相同的东西。我在我的数据上尝试了你的代码。我也没有看到结果。另一方面,我做了一个调试语句:

streamline->Print(std::cout);

streamline->GetOutput()->Print(std::cout);
我的结果是:

vtkPStreamTracer (0x555c851095d0)



Debug: Off

  Modified Time: 1444545

  Reference Count: 2

  Registered Events: (none)

  Executive: 0x555c854fb270

  ErrorCode: Success

  Information: 0x555c8556c100

  AbortExecute: Off

  Progress: 1

  Progress Text: (None)

  Start position: 0 0 0

  Terminal speed: 1e-12

  Maximum propagation: 500 unit: length.

  Integration step unit: cell length.

  Initial integration step: 0.05

  Minimum integration step: 0.01

  Maximum integration step: 0.1

  Integration direction: both directions.

  Integrator: 0x555c85572320

  Maximum error: 1e-06

  Maximum number of steps: 2000

  Vorticity computation:  On

  Rotation scale: 1

  Controller: 0
所以我认为问题可能更多的是关于其他事情

你已经解决了吗


很抱歉,我也是新来的,找不到“注释”按钮。

谢谢你的回答,但问题还没有解决。你有没有成功地在vtu中可视化数据?如果有,你的代码有什么不同吗?没有,我与你的观点相同。对我来说,更大的问题是,它不是一个真正的“vtu”文件,而是一个仍在寻找解决方案的非结构化网格(基本上是一个包含一些数据的点云)。您好,问题已经解决。首先,您应该确保您的非结构化网格具有一组矢量数据。然后,您应该使用streamtracer->SetInputArrayToProcess或vtkAssignAttribute类让streamtracer知道哪个数据数组将用于生成流线。@Stargazer0205:您可以共享设置InputArray的代码行吗?我正在努力解决同样的问题,SetInputArrayToProcess还没有解决我的问题。就像这样:streamtracer->SetInputArrayToProcess(0,0,0,vtkDataObject::FIELD\u ASSOCIATION\u CELLS,“Velocity”)。您应该根据数据更改代码。@SteScheller