同一時候。由於譯者水平有限,出錯之處在所不免,歡迎指出訂正!html
】app
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; }