2016-08-03 239 views
0

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

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)的坐标。我是否还需要进一步改变别的东西?

很多谢谢。

回答

0

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

主要问题是您根本没有渲染polyData。您正在渲染的唯一东西是.obj文件中的内容。从该品系明显:

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

为了使POLYDATA与替换上面的行:

mapper->SetInputData(polyData); 

这假定POLYDATA被正确建立。我无法从您提供的代码中轻松地告知。

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

+0

我也试图与命令行较早,但没有出现在渲染窗口:我VTK/ 命令是 mapper-> setInput设置(POLYDATA); –

+0

它是这样编译的吗?它应该是“SetInputData”请参阅此链接(http://www.vtk.org/doc/nightly/html/classvtkPolyDataMapper.html#acc442e69006a90a371959eec6c1ee74e) –

+0

是的,它使用mapper-> setInput(polyData)进行编译。 但实际上这并不显示模型中的任何变化..! 我做了什么额外的是 reader-> Modified(); 然后它开始显示模型,但仍然...顶点的变化没有被保存在Obj文件中。我使用下面的代码来保存更改: - vtkOBJExporter * objExporter = vtkOBJExporter :: New(); objExporter-> SetRenderWindow(renderWindow); objExporter-> Write(); –