Как я могу использовать класс vtkStreamTracer для создания упорядочения с моими неструктурированными сеточными данными (vtu)

#c #vtk

#c #vtk

Вопрос:

Я использую VTK и C для визуализации данных, поступающих из xflow в vtu. Когда я использую 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();
 

Это мой желаемый результат, созданный в paraview
Это мой желаемый результат, созданный в paraview

Это результат моего кода:

Это результат моего кода:

Есть идеи о том, как это решить?

Ответ №1:

Я искал более или менее одно и то же. Я попробовал ваш код на своих данных. И я также не видел результата. С другой стороны, я выполнил инструкцию debug :

 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
 

Поэтому я думаю, что проблема может быть в чем-то другом?

Вы уже решили это?

Извините, я тоже новичок здесь, не смог найти кнопку «комментарий».

Комментарии:

1. Спасибо за ваш ответ, но проблема не решена. Вы когда-нибудь успешно визуализировали данные в vtu? Если у вас есть, есть ли какая-либо разница в вашем коде?

2. Нет, я нахожусь в одной точке с вами. большая проблема для меня в том, что это не настоящий файл «vtu», а скорее неструктурированная сетка (в основном облако точек с некоторыми данными), которая все еще ищет решения.

3. Здравствуйте, проблема решена. Во-первых, вы должны убедиться, что ваша неструктурированная сетка содержит набор векторных данных. Затем вы должны сообщить streamtracer, какой массив данных будет использоваться для создания упорядочения, используя streamtracer->SetInputArrayToProcess или класс vtkAssignAttribute .

4. @Stargazer0205: Можете ли вы поделиться строкой кода, в которой вы устанавливаете входной массив? Я борюсь с той же проблемой, и SetInputArrayToProcess еще не решил мою проблему.

5. точно так же: streamtracer->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_CELLS, «Скорость») . Вы должны изменить свой код в соответствии с вашими данными. @SteScheller