c++ - 如何访问从 VTK 中的 STLreader 获得的网格的顶点和索引数组?

标签 c++ vtk

我有以下代码可以从 STL 文件中读取网格数据并将其显示在窗口中。代码工作正常;但我需要访问顶点和索引数组才能进行一些数据处理;更改网格然后渲染它。我想知道如何访问那些具有网格顶点坐标和它们的索引号以形成网格三角形的数组。这似乎是一个非常基本的步骤,但我在 VTK 的 wiki 中找不到任何答案。

int main ( int argc, char *argv[] )
{

  std::string inputFilename = "Scapula.stl";

  vtkSmartPointer<vtkSTLReader> reader =
    vtkSmartPointer<vtkSTLReader>::New();
  reader->SetFileName(inputFilename.c_str());
  reader->Update();

  // Visualize
  vtkSmartPointer<vtkPolyDataMapper> mapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
  mapper->SetInputConnection(reader->GetOutputPort());

  vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
  actor->SetMapper(mapper);

  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  renderer->AddActor(actor);
  renderer->SetBackground(.3, .6, .3); // Background color green

  renderWindow->Render();
  renderWindowInteractor->Start();

  return EXIT_SUCCESS;
}

最佳答案

所有这些信息都存储在 vtkPolyData 中,可以从 vtkSTLreader 中提取。这是我可以获取存储在 STL 文件中的网格的顶点和索引的方法:

//Data source

std::string inputFilename = "reamer.stl";

vtkSmartPointer<vtkSTLReader> reader =
    vtkSmartPointer<vtkSTLReader>::New();

reader->SetFileName(inputFilename.c_str());

reader->Update();

vtkSmartPointer<vtkPolyData> mesh = reader->GetOutput();

vtkSmartPointer<vtkPoints> points = mesh->GetPoints();

vtkSmartPointer<vtkDataArray> dataArray = points->GetData();

vtkIdType numberOfFaces = mesh->GetNumberOfCells();

    mesh->GetCellPoints(i, faceIndex);

    vertexIndex = faceIndex->GetId(0);

    vertexArray[0] = dataArray->GetComponent(vertexIndex, 0);

    vertexArray[1] = dataArray->GetComponent(vertexIndex, 1);

    vertexArray[2] = dataArray->GetComponent(vertexIndex, 2);

    vertexIndex = faceIndex->GetId(1);

    vertexArray[3] = dataArray->GetComponent(vertexIndex, 0);

    vertexArray[4] = dataArray->GetComponent(vertexIndex, 1);

    vertexArray[5] = dataArray->GetComponent(vertexIndex, 2);

    vertexIndex = faceIndex->GetId(2);

    vertexArray[6] = dataArray->GetComponent(vertexIndex, 0);

    vertexArray[7] = dataArray->GetComponent(vertexIndex, 1);

    vertexArray[8] = dataArray->GetComponent(vertexIndex, 2);

其中 vertexArray 是具有 i=0 的网格的第一个索引三角形坐标的数组。您可以遍历 i 以获取其余三角形的坐标。

关于c++ - 如何访问从 VTK 中的 STLreader 获得的网格的顶点和索引数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612063/

相关文章:

c++ - 为什么我的 vtkContourFilter 没有输出?

c++ - 如何在单元质心处存储 vtkUnstructuredGrid 的 vector 场

C++:合并排序和插入排序混合

c++ - 使用 gcc 调用纯虚函数时出现链接器错误

C++,实例化 std::vector 时性能不佳

c# - 显示存储的位少于分配的位的 DICOM monochrome2

Python-VTK 3D Spline Regression 通过血管树的 STL 模型

c++ - 与 VCL 窗体一起使用时 IDropTarget 出现问题

c++ - 如何仅在本地 header 上运行预处理器?

vtk - 如何组合两个 vtkImageData 对象?