2016-08-03 548 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(); –