第04章-VTK基础(7)

【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!】

【本小节内容对应原书的第83页至第87页】

4.16 动画

  • 动画是可视化等系统的重要模块;
  • 通过编写修改某个Filter和渲染器Render参数的循环,可以实现简单的动画效果。但是一旦有多个参数需要修改时,这种方法就会变得比较复杂。
  • VTK提供了一个由vtkAnimationCue和vtkAnimationScene等类所组成的框架,支持动画场景的创建和回放。
  • vtkAnimationCue对应一个可随时间改变的实体,比如Actor的空间位置;vtkAnimationScene则表示一个场景或者由vtkAnimationCue实例所组成的动画场景。

动画场景(vtkAnimationScene)

vtkAnimationScene表示一个场景或者是动画场景的建立。动画场景一般是通过渲染一系列的帧,在渲染每一帧时改变某些可视化参数来建立的。所渲染的每一帧都关联一个动画时间,这个时间用来确定动画中每一帧的位置。基于不同的播放模式,动画时间在动画播放过程中是一个计数不断增加的简单变量。

以下列出了类vtkAnimationScene中一些比较重要的方法:

SetStartTime()/SetEndTime()

设置动画场景的开始和结束时间,也是动画回放时的时间范围。

SetPlayMode()

用于控制动画回放的模式,也就是动画时间是如何改变的。有两种模式可以设置。

SequenceMode (PLAYMODE_SEQUENCE)

这种模式下,每帧的动画时间增加(1/frame-rate)的间隔,直至达到所设置的EndTime。因此,所渲染的总帧数是固定的,与渲染每一帧时所用的时间的长短无关。

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基础 全部翻译完成】

第04章-VTK基础(7),布布扣,bubuko.com

时间: 2024-07-30 13:49:44

第04章-VTK基础(7)的相关文章

第04章-VTK基础(5)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第63页至第70页] 4.11 文本标注 VTK提供了两种方法用于标注图像

第04章-VTK基础(4)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第52页至第63页] 4.6 控制3D Props VTK中的渲染窗口渲染

第04章-VTK基础(3)

ExecutorService 建立多线程线程池的步骤: 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其他线程排队等候.一个任务执行完毕,再从队列的中取最前面的任务开始执行.若队列中没有等待进程,线程池的这一资源处于等待.当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了:否则进入等待队列. 为什么要用线程池: 1.减少了创建和

第04章-VTK基础(6)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第70页至第83页] 4.13 数据变换 在4.6节里的"Ass

第04章-VTK基础(1)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第41页至第45页] 这一章通过一系列典型的例子介绍VTK的功能.重点在于

第04章-VTK基础(2)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),因为时间关系.我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^. 欢迎转载,另请转载时注明本文出处,谢谢合作!同一时候.因为译者水平有限,出错之处在所难免,欢迎指出订正! ] [本小节内容相应原书的第45页至第48页] 4.2使用VTK交互器 对数据进行可视化时,

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中,键可以使字符,数字,或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每个键都是由坐标值组成的元祖 存储文件修改的次数,文件名作为键 数字电话/地址薄 函数传递值def func(x,*args,**args): 如果要建公司员工与座机号的列表,如果要获得Alice的座机只能这么找 >>> names   = ['Alice','Bob','Tom'] >>> n

xcode江湖录-第04章 风水宝地--界面生成器之StoryBoard简单示例 与 约束

第04章风水宝地--界面生成器之StoryBoard简单示例 ??如何设置转场动画?? ??如何在参与到转场动作中?? ??如何让页面跳转到自定义VC?? ??如何设置自定义跳转模式?? ??如何用StoryBoard中的VC生成对象?? 01:新建SingleViewApplication,命名为StoryBoardTest. 02:打开Main.Storyboard,如下: 03:通过Object Library选中View Controller(A controller that mana

《Python学习手册 第五版》 -第16章 函数基础

前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函数 1)什么是函数? 2)为什么使用函数? 2.编写函数 1)函数的基本格式 2)定义和调用函数 3)函数的多态.局部变量 接下来针对本章重点,展开详细的说明 1.函数 1)什么是函数? 这里没有严格的定义,用通俗易懂的方式来说: 函数就是将一些语句集合在一起的组件,从而让他们能够不止一次的在程序中