Ошибка Paraview при отображении vtkUniformGrid?

Я показываю vtkUNiformGrid в Paraview, который содержит (помимо прочего) 3-компонентный вектор потока в каждой точке. Когда я показываю набор данных с объемным рендерингом, он отображает просто отлично. Однако, когда я добавляю глиф стрелки к тем же данным, они показывают те же данные, но в другом месте, меньшего размера и в нескольких копиях (9 штук). Возможно, изображения лучше показывают, что я имею в виду: screenshot

Я немного в растерянности, где искать. Я что-то напутал? Другие идеи?


person eudoxos    schedule 11.03.2014    source источник


Ответы (2)


Чтобы помочь вам в отладке, откройте второе окно макета и выберите «Представление электронной таблицы» и посмотрите на источник, к которому вы применяете фильтр глифов. Находятся ли векторные данные, которые вы пытаетесь построить, в PointData? Затем проверьте в свойствах фильтра глифов, что в раскрывающемся списке «Векторы» указан массив, который вы пытаетесь построить.

person user3208430    schedule 12.03.2014

Просто для протокола: причина заключалась в том, что данные записывались в vtkDoubleArray неправильным образом — массив состоит из 3 компонентов, а индексы на самом деле составляли 1/3 от того, что должны были быть, с вкраплениями значений x/y/z (что дает рисунок 3x3 в нижней трети, как я понял); Я предполагал, что компоненты хранятся рядом, что, по-видимому, не так.

Старый код был примерно таким:

auto flow=vtkSmartPointer<vtkDoubleArray>::New();
flow->SetNumberOfComponents(3);

auto grid=vtkSmartPointer<vtkUniformGrid>::New();
grid->SetDimensions(...);
grid->GetPointData()->AddArray(flow);

for(int i:{0,1,2}) flow->FillComponent(i,0);

for(ijk: ... /* traverses the grid, each point potentially more than once */ ){
   vtkIdType dataId=grid->ComputePointId(ijk);
   // XXX: this is what caused troubles:
   double* f0=flow->GetPointer(dataId);
   f[0]+=dx;
   f[1]+=dy;
   f[2]+=dz;
}

Правильная версия тела цикла:

double f[3];
flow->GetTupleValue(dataId,f); // copy the data
f[0]+=dx;
f[1]+=dy;
f[2]+=dz;
flow->SetTupleValue(dataId,f);

Наборы скалярных и векторных данных теперь совпадают: screenshot-improved

person eudoxos    schedule 12.03.2014