使用VTK api渲染网格

时间:2017-06-28 21:21:49

标签: mesh vtk finite-element-analysis

我正在制作一个更简单的查看器来阅读和可视化网格。

VTK对我来说是新手,我首先想要找出为观众设置网格数据的最佳/最有效的方法。我看到有许多带有c ++的VTK示例,但其中很多都是转换为vtk格式或渲染基元。

我对转换为vtk格式不感兴趣,我只是将网格数据设置为 vtk非结构化网格 vtk多边形数据集和渲染它。

我做了一点测试。下面的代码正确呈现,但这是设置数据集的最有效方法吗?如果我将.filter()设置为1 000 000,它会起作用,但三角形循环看起来很慢。

N_SQUARES

1 个答案:

答案 0 :(得分:1)

由于多种原因,示例中的代码可能会很慢

  • 您正在构建并销毁j循环中的2个vtkTriangle实例。这很昂贵,可能是造成缓慢的最大原因。
  • 由于您构建了polydata,因此最好避免使用vtkTriangle。相反,做一些像

    这样的事情
    for (int j = 0; j < N_SQUARES; ++j)
    {
      vtkIdType triangle1[3] = {j, j+1, j+2};
      vtkIdType triangle2[3] = {j+2, j+3, j};
      triangles->InsertNextCell(3, triangle1);
      triangles->InsertNextCell(3, triangle2);
      // ... or better yet, create a single quad:
      vtkIdType quad[4] = {j, j+1, j+2, j+3};
      triangles->InsertNextCell(4, quad);
    }
    
  • 你没有告诉VTK阵列(点坐标或连接)有多大会提前。这意味着VTK必须在增加数量时重新分配和复制数组。尝试在第一次循环之前添加nodes->GetData()->Allocate(4 * N_SQUARES);(超过i)。类似地,你可以告诉vtkCellArray提前分配适当数量的内存(有点棘手;它是一个整数数组,如下所示:nptsPerPoly0 ptId0Poly0 ptId1Poly0 ... ptIdNPoly0 nPtsPerPoly1 ...)。对于三角形,您可以调用triangles->Allocate((1 + 3) * 2 * N_SQUARES);。对于前面示例中的四边形,它将是triangles->Allocate((1 + 4) * N_SQUARES);

  • 您的示例不会重复使用多个正方形共享的点。这使得nodestriangles消耗的内存比必要的多得多。
  • 对于中型网格(适合单个计算机的内存),您可以使用线程来准备nodestriangles数组。对于大型网格,VTK可以在多台计算机上运行,​​每台计算机只能保留部分网格(分布式内存并行)。
  • 如果你已经在内存中使用了网格,那么VTK的最新版本允许你编写将网格暴露给VTK而不需要任何副本的特殊类,但这超出了这个问题的范围。但是,它会使给定网格消耗的内存量减半,因此根据网格和计算机的内存,它可能很重要。
  • 根据您制作的N_SQUARES大小,您可能会导致计算机使用交换文件或分区。在这种情况下,您应该减小网格的大小或使用分布式内存并行性。