在VTK中修改polyData点/顶点

时间:2016-08-03 16:12:00

标签: c++ 3d vtk

我正在尝试使用VTK来改变点,即我将坐标(x,y,z)改变为(+ 1 / -1)值。我正在读取.OBJ文件,然后访问模型的点,当我试图可视化模型中的更改时,RenderWindow不会显示任何内容。以下是我的代码: -

   vtkSmartPointer<vtkOBJReader> reader =
            vtkSmartPointer<vtkOBJReader>::New();
        reader->SetFileName(filename.c_str());
        reader->Update();


        vtkSmartPointer<vtkPolyData> polyData = reader->GetOutput();
        polyData->Update();

    Point3d point;
        std::vector<Point3d> vertices; 

        double p[3];

        vtkPoints* points = vtkPoints::New();

    vtkDoubleArray* pcoord = vtkDoubleArray::New();

    pcoord->SetNumberOfComponents(3);       
            pcoord->SetNumberOfTuples(polyData->GetNumberOfPoints());

for(vtkIdType i = 0; i < polyData->GetNumberOfPoints(); i++)
        {  
    polyData->GetPoint(i,p);

            p[0] +=1;
            p[1] +=1;
            p[2] +=1;
    pcoord->SetTuple(i, p);

}
    points->SetData(pcoord);
    olyData->SetPoints(points);

    polyData->Modified();

    //Visualize Code

    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();
      renderer->AddActor(actor);

    vtkRenderWindow* renderWindow = vtkRenderWindow::New();
    renderWindow->AddRenderer(renderer);

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
      renderWindowInteractor->SetRenderWindow(renderWindow);

      renderWindowInteractor->Initialize();
      renderWindowInteractor->Start();

我是3D和VTK的新手,请检查我遗失的地方,因为我想更改每个顶点(x,y,z)的坐标。我是否还需要进一步改变其他内容?

非常感谢。

1 个答案:

答案 0 :(得分:0)

首先,您在问题中包含的代码中存在对齐问题。我相信你也错过了一个for循环。 (“i”定义在哪里?)

主要问题是你根本没有渲染polyData。您渲染的唯一内容是.obj文件中的内容。显而易见:

mapper->SetInputConnection(reader->GetOutputPort());

为了渲染polyData,请将上一行替换为:

mapper->SetInputData(polyData);

这假设polyData已正确创建。我不能轻易地从您提供的代码中说出这一点。

Here是一个可能有用的示例。