2014-06-13 1 views
0

일부 윤곽선의 3D 모델을 만들려고합니다.멀티플 vtkpolydata 윤곽 렌더링

vtkAppolyFilter를 사용하여 vtkPolyData (내 윤곽선)를 추가하고 있습니다. 그런 다음 새 vtkPolyData 인스턴스에서 출력을 가져옵니다.

나는 매퍼를 넣은 다음 배우를 넣었습니다. 하지만 어떤 이유로 렌더링 할 때

아무 것도 볼 수 없습니다. 그냥 검은 화면.

누군가 내가 틀린 곳을 알고 있다면. 저에게 알려주세요.

감사합니다. 여기

이 '코드 S : 구글에

vtkSmartPointer<vtkAppendPolyData> appendFilter = vtkSmartPointer<vtkAppendPolyData>::New(); 
double z=0; 
//Does the job to append them 
for(int i=0; i < this->mAllContoursRepresentations.size();i++){ 
    for(int j=0; j< this->mAllContoursRepresentations.at(i).size();j++){ 
     // z. is the number of the image 
     z = this->mAllContoursRepresentations.at(i).at(j).first; 
     //contour to copy 
     vtkPolyData* pld = this->mAllContoursRepresentations.at(i).at(j).second->GetContourRepresentationAsPolyData(); 
     //contour to paste 
     vtkSmartPointer<vtkPolyData> vtp = vtkSmartPointer<vtkPolyData>::New(); 
     //copy contour and paste it in another one 
     vtp->DeepCopy(pld); 
     vtkPoints* vtpPoints = vtp->GetPoints(); 
     vtkPoints* pldPoints = pld->GetPoints(); 
     vtpPoints->SetNumberOfPoints(pld->GetNumberOfPoints()); 
     for(int k=0;k<vtp->GetNumberOfPoints();k++){ 
      double toPixel[3]; 
      double points[3]; 
      pldPoints->GetPoint(k,points); 
      vtkInteractorObserver::ComputeWorldToDisplay(Activity::GetActivity().GetDefaultRendererVisit(),points[0],points[1],points[2],toPixel); 
      points[2]= z; 
      points[1]=toPixel[1]; 
      points[0]=toPixel[0]; 
      vtpPoints->SetPoint(k,points); 
     } 
     //append contour to the filter 
     appendFilter->AddInputData(vtp); 
    } 
} 
appendFilter->Update(); 

vtkSmartPointer<vtkPolyDataMapper> contoursMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); 
contoursMapper->SetInputData(contours); 
contoursMapper->ScalarVisibilityOff(); 
vtkSmartPointer<vtkActor> contoursActor = vtkSmartPointer<vtkActor>::New(); 
contoursActor->SetMapper(contoursMapper); 
contoursActor->GetProperty()->SetRepresentationToWireframe(); 
contoursActor->GetProperty()->SetColor(1,0,1); 
vtkSmartPointer<vtkVRMLExporter> exporter = vtkSmartPointer<vtkVRMLExporter>::New(); 
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); 
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); 
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); 
renderer->AddActor(contoursActor); 
renderer->ResetCamera(); 
renderWindow->AddRenderer(renderer); 
interactor->SetRenderWindow(renderWindow); 
renderWindow->Render(); 
exporter->SetFileName("C:\\Users\\stagiaire\\Desktop\\toto.wrl"); 
exporter->SetRenderWindow(renderWindow); 
exporter->Write(); 
interactor->Initialize(); 
interactor->Start(); 

답변

0

감사합니다, 나는 내 자신을 도울 수있는 방법을 발견했다.

기본적으로 내 포인트 을 벡터에 저장하여 새로운 vtkpolydata 구조체 (contour -> simples lines)를 만들고 vtkAppendPolyData에 추가합니다. 평소 명령어를 사용하여 렌더링합니다. .

for(int i=0; i < this->mAllContoursRepresentations.size();i++){ 
     for(int j=0; j< this->mAllContoursRepresentations.at(i).size();j++){ 
      //contour to copy 
      vtkPolyData* pld = this->mAllContoursRepresentations.at(i).at(j).second->GetContourRepresentationAsPolyData(); 

      // z. is the number of the image 
      z = this->mAllContoursRepresentations.at(i).at(j).first; 

      vtkPoints* pldPoints = pld->GetPoints(); 
      int numberPoints= pld->GetNumberOfPoints(); 

      for(int k=0;k<numberPoints;k++){ 
       pldPoints->GetPoint(k,toWorld); 

       vtkInteractorObserver::ComputeWorldToDisplay(Activity::GetActivity().GetDefaultRendererVisit(), 
        toWorld[0],toWorld[1],toWorld[2],toPixel); 


       qDebug()<< "Points Of contours - Image "; 
       qDebug() << z; 
       qDebug() << "\n"; 
       qDebug() << toPixel[0]; 
       qDebug() << toPixel[1]; 
       qDebug() << z; 

       double *pointToSave =new double[3]; 
       pointToSave[0] = toPixel[0]; 
       pointToSave[1] = toPixel[1]; 
       pointToSave[2] = z; 

       pointsContours.push_back(pointToSave); 
      } 
      pld = NULL; 
      pldPoints= NULL; 
     } 

    } 


    delete[] toPixel; 
    delete[] toWorld; 
    this->Stop(); 

    //create vtkAppendsPolyData in order to append contours together 
    vtkSmartPointer<vtkAppendPolyData> appendFilter = vtkSmartPointer<vtkAppendPolyData>::New(); 
    int idPoint; 
    idPoint=0; 
    while(idPoint < pointsContours.size()){ 

     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); 
     unsigned int k=0;  
     for(;idPoint < pointsContours.size()-1;idPoint++){ 
      if(pointsContours.at(idPoint)[2]==pointsContours.at(idPoint+1)[2]){ 
       points->InsertNextPoint(pointsContours.at(idPoint)); 
       k++;          
      } 
      else 
       break; 
     } 

     if(idPoint < pointsContours.size()){ 
      points->InsertNextPoint(pointsContours.at(idPoint)); 
      k++;    
      idPoint++;  
     } 


     vtkSmartPointer<vtkPolyLine> polyline = vtkSmartPointer<vtkPolyLine>::New(); 
     polyline->GetPointIds()->SetNumberOfIds(k); 
     for(unsigned int j=0; j<k;j++) 
      polyline->GetPointIds()->SetId(j,j); 

     // Create a cell array to store the lines in and add the lines to it 
     vtkSmartPointer<vtkCellArray> cells = 
      vtkSmartPointer<vtkCellArray>::New(); 
     cells->InsertNextCell(polyline); 

     vtkSmartPointer<vtkPolyData> polyData = 
      vtkSmartPointer<vtkPolyData>::New(); 

     // Add the points to the dataset 
     polyData->SetPoints(points); 

     // Add the lines to the dataset 
     polyData->SetLines(cells); 

     appendFilter->AddInputData(polyData); 
    } 

    pointsContours.clear(); 
    appendFilter->Update(); 


    vtkSmartPointer<vtkPolyDataMapper> contoursMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); 

    contoursMapper->SetInputData(appendFilter->GetOutput()); 
    contoursMapper->ScalarVisibilityOff(); 

    vtkSmartPointer<vtkActor> contoursActor = vtkSmartPointer<vtkActor>::New(); 
    contoursActor->SetMapper(contoursMapper); 
    contoursActor->GetProperty()->SetRepresentationToWireframe(); 
    contoursActor->GetProperty()->SetColor(0,0,0); 


    vtkSmartPointer<vtkVRMLExporter> exporter = vtkSmartPointer<vtkVRMLExporter>::New(); 
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); 
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); 
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); 


    renderer->AddActor(contoursActor); 
    renderer->ResetCamera(); 
    renderWindow->AddRenderer(renderer); 
    renderer->SetBackground(1,1,1); // Background color 
    interactor->SetRenderWindow(renderWindow); 
    interactor->Initialize(); 
    renderWindow->Render(); 
    interactor->Start(); 

이 예는 너무 당신을 도울 수 있습니다 사람 (문의 주시기 바랍니다) 도움이 필요하면 여기

는 코드입니다. http://www.vtk.org/Wiki/VTK/Examples/Cxx/GeometricObjects/PolyLine