第04章-VTK基礎(7)

【譯者:這個系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一書做的中文翻譯(出版時間2010年。ISBN: 978-1-930934-23-8)。由於時間關係,咱們不能保證每週都能更新本書內容,但儘可能作到一週更新一篇到兩篇內容。敬請期待^_^。歡迎轉載,另請轉載時註明本文出處,謝謝合做!

同一時候。由於譯者水平有限,出錯之處在所不免,歡迎指出訂正!html

app

【本小節內容相應原書的第83頁至第87頁】

4.16 動畫

  • 動畫是可視化等系統的重要模塊。
  • 經過編寫改動某個Filter和渲染器Render參數的循環,可以實現簡單的動畫效果。但是一旦有多個參數需要改動時。這樣的方法就會變得比較複雜。
  • VTK提供了一個由vtkAnimationCue和vtkAnimationScene等類所組成的框架,支持動畫場景的建立和回放。
  • vtkAnimationCue相應一個可隨時間改變的實體,比方Actor的空間位置;vtkAnimationScene則表示一個場景或者由vtkAnimationCue實例所組成的動畫場景。

動畫場景(vtkAnimationScene)

vtkAnimationScene表示一個場景或者是動畫場景的創建。動畫場景一般是經過渲染一系列的幀,在渲染每一幀時改變某些可視化參數來創建的。所渲染的每一幀都關聯一個動畫時間,這個時間用來肯定動畫中每一幀的位置。基於不一樣的播放模式,動畫時間在動畫播放過程當中是一個計數不斷添加的簡單變量。框架

下面列出了類vtkAnimationScene中一些比較重要的方法:ide

SetStartTime()/SetEndTime()函數

    設置動畫場景的開始和結束時間。也是動畫回放時的時間範圍。oop

SetPlayMode()動畫

    用於控制動畫回放的模式,也就是動畫時間是怎樣改變的。有兩種模式可以設置。ui

SequenceMode (PLAYMODE_SEQUENCE)this

    這樣的模式下,每幀的動畫時間添加(1/frame-rate)的間隔。直至達到所設置的EndTime。所以。所渲染的總幀數是固定的,與渲染每一幀時所用的時間的長短無關。spa

RealTimeMode (PLAYMODE_REALTIME)

    這樣的模式下,整個動畫的執行時間大約是(EndTime-StartTime)秒,當中第n幀的執行時間是:第(n-1)幀的執行時間+渲染第(n-1)幀所用的時間。所以。所渲染的總幀數隨着渲染每一幀所用時間的不一樣而不一樣。

SetFrameRate()

    幀率是指單位時間內渲染的幀數。主要用於Sequence模式。

AddCue(),RemoveCue(), RemoveAllCue()

    加入vtkAnimationCue實例到場景中或者從場景中移除vtkAnimationCue實例。

SetAnimationTime()

    指定某一幀的動畫時間。

GetAnimationTime()

    動畫回放時。獲取動畫的時鐘時間。

Play()

    開始播放動畫。

SetLoop()

    假設設置爲true。則調用Play()方法後將進入動畫循環。

AnimationCue (vtkAnimationCue)

    vtkAnimationCue相應動畫場景中隨時間改變的實體。vtkAnimationCue實例自己並不知道與動畫相關的參數是假設改變的。

所以,用戶必須從vtkAnimationCue中派生出子類或者使用觀察者模式監聽事件。來改變更畫過程當中需要改變的參數。

 

動畫場景中的Cue實體都有一個開始時間(start-time)和結束時間(end-time)。動畫回放時,當場景的動畫時間是處於所指定的開始時間與結束時間的範圍內時,Cue實體就會被激活。Cue實體一旦激活後,它自己會發出vtkCommand::StartAnimationCueEvent事件。而對於動畫系列中的每一幀。則發出vtkCommand::AnimationCueTickEvent事件,當動畫時間遞增至Cue實體的結束時間時,會發出vtkCommand::EndAnimationCueEvent事件。下面是vtkAnimationCue類中一些比較重要的方法:

    SetTimeMode

        TimeMode定義了Cue實體的起始時間和結束時間是怎樣指定的,有兩種模式可選。

    Relative (TIMEMODE_RELATIVE)

        這樣的模式下,動畫場景中的Cue實體的時間是相對動畫場景的開始時間來指定的。

    Normalized (TIMEMODE_NORMALIZED)

        這樣的模式下,Cue實體的開始時間和結束時間的取值範圍爲[0,1],當中0相應動畫場景的開始。1相應結束。

    SetStartTime/SetEndTime

        這兩個方法主要是當Cue實體被激活時,標識動畫時間的範圍。

當TimeMode取值爲TIMEMODE_RELATIVE時。與動畫場景的起始和結束時間有一樣的單位。當TimeMode取值爲TIMEMODE_NORMALIZED時。Cue實體的開始時間和結束時間的取值範圍爲[0,1],當中0相應動畫場景的開始,1相應結束。

    GetAnimationTime()

        用於vtkCommand::AnimationCueTickEvent事件的處理。

處理事件時。可用來肯定動畫場景中的當前幀。其值依賴於TimeMode。假設TimeMode取值爲TIMEMODE_RELATIVE時,其值是Cue實體激活後的時間單位的倍數;TimeMode取值爲TIMEMODE_NORMALIZED時。Cue實體的開始時間和結束時間的取值範圍爲[0,1],當中0相應動畫場景的開始,1相應結束。

    GetClockTime()

        該方法與vtkAnimationScene::GetAnimationTime()中的動畫時鐘時間類似。

僅僅有當處理vtkCommand::AnimationCueTickEvent事件時纔有效。

    TickInternal (double currenttime, doubledeltatime, double clocktime)

        正如前面所提的。咱們可以派生一個vtkAnimationCue子類來取代編寫處理動畫事件的函數。子類派生時,需要重載該函數。當中該函數的參數分別相應GetAnimationTime(),GetDeltaTime()和GetClockTime()的返回值。

    StartCueInternal(), EndCueInternal()

        這兩個方法可在子類中重載。主要作一些建立、清除等工做以及動畫回放時控制Cue實體的開始和結束。用戶也可以加入事件觀察者,經過監聽vtkCommand::StartAnimationCueEvent和vtkCommand::EndAnimationCueEvent事件來實現類似的功能。

下面的演示樣例中,咱們建立了一個簡單的動畫:vtkSphereSource的StartTheta隨着動畫時間而改變。

演示樣例中的Cue實體使用Normalized時間模式,所以,可以經過改變場景時間或者Cue實體的時間來改變StartTheta的值。

class vtkCustomAnimationCue : public vtkAnimationCue
{
public:
       static vtkCustomAnimationCue* New();
       vtkTypeRevisionMacro (vtkCustomAnimationCue,vtkAnimationCue);
 
       vtkRenderWindow *RenWin;
       vtkSphereSource *Sphere;
 
protected:
       vtkCustomAnimationCue()
       {
              this->RenWin = 0;
              this->Sphere = 0;
       }
 
       // Overridden to adjust the sphere'sradius depending on the frame we
       // are rendering. In this animation wewant to change the StartTheta
       // of the sphere from 0 to 180 over thelength of the cue.
       virtual void TickInternal(doublecurrenttime, double deltatime, double clocktime)
       {
              double new_st = currenttime * 180;
              // since the cue is in normalizedmode, the currenttime will be in the
              // range[0,1], where 0 is start ofthe cue and 1 is end of the cue.
              this->Sphere->SetStartTheta(new_st);
              this->RenWin->Render();
       }
};
vtkStandardNewMacro(vtkCustomAnimationCue);
vtkCxxRevisionMacro(vtkCustomAnimationCue,"$Revision$");
 
int main(int argc, char *argv[])
{
       // Create the graphics sturctures. Therenderer renders into the
       // render window.
       vtkRenderer *ren1 = vtkRenderer::New();
       vtkRenderWindow *renWin =vtkRenderWindow::New();
       renWin->SetMultiSamples(0);
       renWin->AddRenderer(ren1);
 
       vtkSphereSource *sphere =vtkSphereSource::New();
       vtkPolyDataMapper *mapper =vtkPolyDataMapper::New();
       mapper->SetInputConnection(sphere->GetOutputPort());
       vtkActor *actor = vtkActor::New();
       actor->SetMapper(mapper);
       ren1->AddActor(actor);
 
       ren1->ResetCamera();
       renWin->Render();
 
       //Create an Animation Scene
       vtkAnimationScene *scene =vtkAnimationScene::New();
       scene->SetModeToSequence();
       scene->SetFrameRate(30);
       scene->SetStartTime(0);
       scene->SetEndTime(60);
 
       // Create an Animation Cue to animate thecamera.
       vtkCustomAnimationCue *cue1 =vtkCustomAnimationCue::New();
       cue1->Sphere = sphere;
       cue1->RenWin = renWin;
       cue1->SetTimeModeToNormalized();
       cue1->SetStartTime(0);
       cue1->SetEndTime(1.0);
       scene->AddCue(cue1);
       scene->Play();
       scene->Stop();
 
       ren1->Delete();
       renWin->Delete();
       scene->Delete();
       cue1->Delete();
       return 0;
}

【第4章-VTK基礎 全部翻譯完畢】
相關文章
相關標籤/搜索