我在 Paraview 中显示了一个 vtkUNiformGrid,它在每个点中包含(除其他内容外)3 分量流向量。当我使用体积渲染显示数据集时,它显示得很好。但是,当我将箭头字形添加到相同的数据时,它们确实显示了相同的数据,但在其他地方,更小且有多个副本(数量为 9)。也许图像能更好地表达我的意思:
我有点不知所措。我搞砸了什么吗?其他想法?
只是为了记录,原因实际上是以错误的方式将数据写入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);
标量和矢量数据集现在都匹配:
为了帮助您进行调试,请打开第二个布局窗口并选择电子表格视图,然后查看您正在应用字形过滤器的源。您尝试在 PointData 下绘制的矢量数据是什么?然后检查字形过滤器属性,向量下拉框指示您尝试绘制的数组。