0

我在 Paraview 中显示了一个 vtkUNiformGrid,它在每个点中包含(除其他内容外)3 分量流向量。当我使用体积渲染显示数据集时,它显示得很好。但是,当我将箭头字形添加到相同的数据时,它们确实显示了相同的数据,但在其他地方,更小且有多个副本(数量为 9)。也许图像能更好地表达我的意思: 截屏

我有点不知所措。我搞砸了什么吗?其他想法?

4

2 回答 2

0

只是为了记录,原因实际上是以错误的方式将数据写入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);

标量和矢量数据集现在都匹配: 截图改进

于 2014-03-12T09:05:15.583 回答
0

为了帮助您进行调试,请打开第二个布局窗口并选择电子表格视图,然后查看您正在应用字形过滤器的源。您尝试在 PointData 下绘制的矢量数据是什么?然后检查字形过滤器属性,向量下拉框指示您尝试绘制的数组。

于 2014-03-12T00:22:35.090 回答