[vtkusers] Animated texture

Utkarsh Ayachit utkarsh.ayachit at kitware.com
Thu Apr 14 12:16:08 EDT 2005


You can create an animation using vtkAnimationScene and vtkAnimationCue 
classes. I am attaching a small example to create an animation: it 
animates a sphere source.

Utkarsh

// --------------------------------------------------------------------
// This simple example shows how to do basic animation
// using C++
//

#include "vtkAnimationCue.h"
#include "vtkAnimationScene.h"
#include "vtkCommand.h"
#include "vtkRenderer.h"
#include "vtkSphereSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include <unistd.h>
class CueAnimator
{
public:
   CueAnimator()
     {
     this->SphereSource = 0;
     this->Mapper = 0;
     this->Actor = 0;
     }
   ~CueAnimator()
     {
     this->Cleanup();
     }
   void StartCue(vtkAnimationCue::AnimationCueInfo* info, vtkRenderer* ren)
     {
     cout <<"*** IN StartCue "<< endl;
     this->SphereSource = vtkSphereSource::New();
     this->SphereSource->SetRadius(0.5);

     this->Mapper = vtkPolyDataMapper::New();
     this->Mapper->SetInput(this->SphereSource->GetOutput());

     this->Actor = vtkActor::New();
     this->Actor->SetMapper(this->Mapper);

     ren->AddActor(this->Actor);
     ren->ResetCamera();
     ren->Render();
     }

   void Tick(vtkAnimationCue::AnimationCueInfo* info, vtkRenderer* ren)
     {
     double newradius = 0.1 + ((double)(info->CurrentTime - 
info->StartTime)/
       (double)(info->EndTime - info->StartTime)) * 1;
     this->SphereSource->SetRadius(newradius);
     this->SphereSource->Update();
     ren->Render();
     }
   void EndCue(vtkAnimationCue::AnimationCueInfo *info, vtkRenderer* ren)
     {
     ren->RemoveActor(this->Actor);
     this->Cleanup();
     }
protected:
   vtkSphereSource* SphereSource;
   vtkPolyDataMapper* Mapper;
   vtkActor* Actor;
   void Cleanup()
     {
     if (this->SphereSource)
       {
       this->SphereSource->Delete();
       }
     this->SphereSource = 0;
     if (this->Mapper)
       {
       this->Mapper->Delete();
       }
     this->Mapper = 0;
     if (this->Actor)
       {
       this->Actor->Delete();
       }
     this->Actor = 0;
     }
};
class vtkAnimationCueObserver : public vtkCommand
{
public:
   static vtkAnimationCueObserver* New()
     {
     return new vtkAnimationCueObserver;
     }

   virtual void Execute(vtkObject* caller, unsigned long event,
     void* calldata)
     {
     if (this->Animator && this->Renderer)
       {
       switch(event)
         {
       case vtkCommand::StartAnimationCueEvent:
         Animator->StartCue((vtkAnimationCue::AnimationCueInfo*) calldata,
           this->Renderer);
         break;
       case vtkCommand::EndAnimationCueEvent:
         Animator->EndCue((vtkAnimationCue::AnimationCueInfo*) calldata,
           this->Renderer);
         break;
       case vtkCommand::AnimationCueTickEvent:
         Animator->Tick((vtkAnimationCue::AnimationCueInfo*) calldata,
           this->Renderer);
         break;
         }
       }
     if (this->RenWin)
       {
       this->RenWin->Render();
       }
     }
   vtkRenderer* Renderer;
   vtkRenderWindow* RenWin;
   CueAnimator* Animator;
protected:
     vtkAnimationCueObserver()
       {
       this->Renderer = 0;
       this->Animator = 0;
       this->RenWin = 0;
       }

};




int main(int argc, char* argv[])
{
   // Create the graphics structure. The renderer renders into the
   // render window.
   vtkRenderer *ren1 = vtkRenderer::New();
   vtkRenderWindow *renWin = vtkRenderWindow::New();
   renWin->AddRenderer(ren1);
   renWin->Render();

   // Create an Animation Scene
   vtkAnimationScene* scene = vtkAnimationScene::New();
   if (argc >= 2 && strcmp(argv[1],"real") == 0)
     {
     scene->SetModeToRealTime();
     }
   else
     {
     scene->SetModeToSequence();
     }
   scene->SetLoop(0);
   scene->SetFrameRate(5);
   scene->SetStartTime(3);
   scene->SetEndTime(20);

   // Create an Animation Cue.
   vtkAnimationCue* cue1 = vtkAnimationCue::New();
   cue1->SetStartTime(5);
   cue1->SetEndTime(13);
   scene->AddCue(cue1);

   // Create cue animator;
   CueAnimator animator;

   // Create Cue observer.
   vtkAnimationCueObserver* observer = vtkAnimationCueObserver::New();
   observer->Renderer = ren1;
   observer->Animator = &animator;
   observer->RenWin = renWin;
   cue1->AddObserver(vtkCommand::StartAnimationCueEvent, observer);
   cue1->AddObserver(vtkCommand::EndAnimationCueEvent, observer);
   cue1->AddObserver(vtkCommand::AnimationCueTickEvent, observer);

   scene->Play();
   scene->Stop();

   ren1->Delete();
   renWin->Delete();
   scene->Delete();
   cue1->Delete();
   observer->Delete();
   return 0;
}
// --------------------------------------------------------------------


DIDI Abdelwaheb 202724 wrote:
> Hi all !
> 
>  
> 
> Could you please tell me the best way to render animated texture from a 
> data set?
> 
> The texture size is 64*1024, computed trough a ImageData, and I want it 
> to be updated around 15 times per second.
> 
> Do you think it's possible in vtk ?
> 
>  
> 
> Thanks
> 
>  
> 
>  
> 
>  
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> This is the private VTK discussion list. 
> Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers



More information about the vtkusers mailing list