2017-12-02 8 views
0

Derzeit, basierend auf dem Beispiel VTK ZBuffer, rotiere ich iterativ das 3D-Modell und erfasse jedes Mal die Tiefenkarte. Das Problem besteht darin, dass die Ausgabebilder zwar das Modell rotieren, jedoch die gesamte erste Tiefenkarte enthalten.VTK: ein 3D-Modell drehen und seine Tiefenkarte erfassen

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

...variable declaration/initialization 

//read off file 
offReader->SetFileName(argv[1]); 
offReader->Update(); 

int step = 30; std::string out; 
for (int i = 0; i < 3; i++) { 
    mapper->NewInstance(); 
    actor->NewInstance(); 
    renWin->NewInstance(); 
    renderer->NewInstance(); 

    mapper->SetInputData(polyData); 
    actor->SetMapper(mapper); 

    out = std::to_string(i); 

    actor->RotateZ(step*i); 

    renWin->AddRenderer(renderer); 

    renderer->AddActor(actor); 
    renderer->SetBackground(1, 1, 1); 
    renWin->Render(); 

    // Create Depth Map 
    filter->NewInstance(); 
    scale->NewInstance(); 
    imageWriter->NewInstance(); 

    filter->SetInput(renWin); 
    filter->SetMagnification(3); 
    filter->SetInputBufferTypeToZBuffer();  //Extract z buffer value 
    filter->Update(); 

    scale->SetOutputScalarTypeToUnsignedChar();  
    scale->SetInputConnection(filter->GetOutputPort());  
    scale->SetShift(0); 
    scale->SetScale(-255); 
    scale->Update(); 

    std::string out1 = out + "_depth.bmp"; 
    std::cout << " " << out1 << std::endl; 

    // Write surface map as a .bmp image 
    imageWriter->SetFileName(out1.c_str()); 
    imageWriter->SetInputConnection(scale->GetOutputPort()); 
    imageWriter->Update(); 
    imageWriter->Write(); 

    filter->RemoveAllInputs(); 
    scale->RemoveAllInputs(); 
    imageWriter->RemoveAllInputs(); 
    renderer->RemoveActor(actor); 
    renWin->RemoveRenderer(renderer); 

    .... remaining script 

} 

Die Ausgangstiefenkarten sind alle identisch . 0_depth.bmp, 1_depth.bmp & 2_depth.bmp

Hat jemand das gleiche Problem festgestellt? Wenn ja, was könnte eine mögliche Lösung sein?

Antwort

0

Problem gelöst durch Einführung einer Funktion innerhalb der Rotation stattfand. Anscheinend handelte es sich um ein Update-Problem mit variablen Inhalten, das auf einfachere Weise gelöst werden könnte.

+0

musste der Akteur nach dem Drehanruf aktualisiert werden? –

+0

Ich habe versucht, Actor, Mapper, RenWin, Scale, Filter und ImageWriter zu aktualisieren/zu aktualisieren. Es hat nicht funktioniert. Offensichtlich gibt es einen direkteren Weg. Ich habe alle Rotation innerhalb einer Funktion platziert und auch die renWin innerhalb der Funktion gerendert. Der Funktionsaufruf: WriteDepthMap (i, actor, renderer, renWin); – ionas

Verwandte Themen