Hello everyone <br><br>I am attempting to link a vtkcommand to use as a way of writing a movie every time an interaction event is called from a vtkremderwindowinteractor<br><br>However I am not sure I am connecting the elements correctly. Also from the examples I have seen, the movie writers need and "end()" call to close its file. If I am to use a vtk command is this possible? <br>
<br>Any suggestion is welcomed. <br><br>Thank you <br><br>Sergio <br>ps. below my code. <br><br>/*=========================================================================<br>=========================================================================*/<br>
//<br>//<br><br>// First include the required header files for the VTK classes we are using.<br>#include "vtkConeSource.h"<br>#include "vtkPolyDataMapper.h"<br>#include "vtkRenderWindow.h"<br>
#include "vtkRenderWindowInteractor.h"<br>#include "vtkCamera.h"<br>#include "vtkActor.h"<br>#include "vtkRenderer.h"<br>#include "vtkCommand.h"<br>#include "vtkBoxWidget.h"<br>
#include "vtkTransform.h"<br>#include "vtkInteractorStyleTrackballCamera.h"<br>#include "vtkFFMPEGWriter.h"<br>#include "vtkWindowToImageFilter.h"<br><br><br>//<br>// Similar to Cone2.cxx, we define a callback for interaction.<br>
// <br>class vtkMyCallback : public vtkCommand<br>{<br>public:<br> static vtkMyCallback *New() <br> { return new vtkMyCallback; }<br> virtual void Execute(vtkObject *caller, unsigned long, void*)<br> {<br> vtkFFMPEGWriter *movie = reinterpret_cast<vtkFFMPEGWriter*>(caller);<br>
movie->Write();<br> movie->End();<br> }<br>};<br><br>int main()<br>{<br> // <br> //<br> vtkConeSource *cone = vtkConeSource::New();<br> cone->SetHeight( 3.0 );<br> cone->SetRadius( 1.0 );<br>
cone->SetResolution( 10 );<br> <br> // <br> //<br> vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();<br> coneMapper->SetInputConnection( cone->GetOutputPort() );<br><br> // <br> //<br> vtkActor *coneActor = vtkActor::New();<br>
coneActor->SetMapper( coneMapper );<br><br> //<br> //<br> vtkRenderer *ren1= vtkRenderer::New();<br> ren1->AddActor( coneActor );<br> ren1->SetBackground( 0.1, 0.2, 0.4 );<br><br> //<br> //<br> vtkRenderWindow *renWin = vtkRenderWindow::New();<br>
renWin->AddRenderer( ren1 );<br> renWin->SetSize( 320, 240 );<br><br> // <br> // The vtkRenderWindowInteractor class watches for events (e.g., keypress,<br> // mouse) in the vtkRenderWindow. These events are translated into<br>
// event invocations that VTK understands (see VTK/Common/vtkCommand.h<br> // for all events that VTK processes). Then observers of these VTK<br> // events can process them as appropriate.<br> vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();<br>
iren->SetRenderWindow(renWin);<br><br> //<br> // By default the vtkRenderWindowInteractor instantiates an instance<br> // of vtkInteractorStyle. vtkInteractorStyle translates a set of events<br> // it observes into operations on the camera, actors, and/or properties<br>
// in the vtkRenderWindow associated with the vtkRenderWinodwInteractor. <br> // Here we specify a particular interactor style.<br> vtkInteractorStyleTrackballCamera *style = <br> vtkInteractorStyleTrackballCamera::New();<br>
iren->SetInteractorStyle(style);<br><br> //<br> // Here we use a vtkBoxWidget to transform the underlying coneActor (by<br> // manipulating its transformation matrix). Many other types of widgets<br> // are available for use, see the documentation for more details.<br>
//<br> // The SetInteractor method is how 3D widgets are associated with the render<br> // window interactor. Internally, SetInteractor sets up a bunch of callbacks<br> // using the Command/Observer mechanism (AddObserver()). The place factor <br>
// controls the initial size of the widget with respect to the bounding box<br> // of the input to the widget.<br> vtkBoxWidget *boxWidget = vtkBoxWidget::New();<br> boxWidget->SetInteractor(iren);<br> boxWidget->SetPlaceFactor(5.25);<br>
<br> vtkWindowToImageFilter *w2if = vtkWindowToImageFilter::New();<br> w2if->SetInput(renWin);<br><br> vtkFFMPEGWriter *moviewriter1 = vtkFFMPEGWriter::New();<br> moviewriter1->SetFileName("test1.avi");<br>
moviewriter1->SetInputConnection(w2if->GetOutputPort());<br> moviewriter1->Start();<br> //<br> //<br> boxWidget->SetProp3D(coneActor);<br> boxWidget->PlaceWidget();<br><br> vtkMyCallback *callback = vtkMyCallback::New();<br>
moviewriter1->AddObserver(vtkCommand::InteractionEvent, callback);<br><br> //<br> // Normally the user presses the "i" key to bring a 3D widget to life. Here<br> // we will manually enable it so it appears with the cone. <br>
//<br> boxWidget->On();<br><br> iren->Initialize();<br> iren->Start();<br> moviewriter1->End();<br> //<br><br> cone->Delete();<br> coneMapper->Delete();<br> coneActor->Delete();<br> callback->Delete();<br>
boxWidget->Delete();<br> ren1->Delete();<br> renWin->Delete();<br> iren->Delete();<br> style->Delete();<br><br> return 0;<br>}<br><br><br><br>