【译者:这个系列教程是以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)的更多相关文章

  1. 第04章-VTK基础(4)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...

  2. 第04章-VTK基础(3)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...

  3. 第04章-VTK基础(2)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...

  4. python数据分析---第04章 NumPy基础:数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  5. 【学习笔记】 第04章 NumPy基础:数组和矢量计算

    前言 正式开始学习Numpy,参考用书是<用Python进行数据清洗>,计划本周五之前把本书读完,关键代码全部实现一遍 NumPy基础:数组和矢量计算 按照书中所示,要搞明白具体的性能差距 ...

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

    第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...

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

    前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函 ...

  8. 异步编程系列第04章 编写Async方法

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  9. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

随机推荐

  1. [转]关于NTLM认证的.NET,php,python登录

    本文转自:http://www.cnblogs.com/myx/archive/2013/03/25/php-ntlm-python-net.html 早期SMB协议在网络上传输明文口令.后来出现 L ...

  2. Mongodb操作之查询(循序渐进对比SQL语句)(转http://www.tuicool.com/articles/UzQj6rF)

    工具推荐:Robomongo,可自行百度寻找下载源,个人比较推荐这个工具,相比较mongoVUE则更加灵活. 集合简单查询方法 mongodb语法:db.collection.find()  //co ...

  3. [编程] C语言的结构体

    结构体 struct 结构体名{} 变量名; 结构体变量: struct person{ char *name; int age; float score; } student; 成员的获取和赋值 / ...

  4. 4、构造方法、this、super

    构造方法 构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是 ...

  5. js得到数组的下标值

    <script type="text/javascript"> var arr = [1,2,3,4,5,6,2,4,55]; for(var i=0; $i<a ...

  6. js实现栈结构

    实现栈结构 //创建栈 function Stack (){ let items = [] this.push = function(element){ items.push(element) } t ...

  7. UOJ#55. 【WC2014】紫荆花之恋

    传送门 暴力思路就是每次点分治计算答案 点分治之后,条件可以变成 \(dis_i-r_i\le r_j-dis_j\) 每次只要查找 \(r_j-dis_j\) 的排名然后插入 \(dis_j-r_j ...

  8. 01:谁考了第k名 个人博客:doubleq.win

    个人博客:doubleq.win 01:谁考了第k名 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的 ...

  9. MyEclipse去除网上复制下来的代码带有的行号(使用正则表达式)

    一.正则表达式去除代码行号 作为开发人员,我们经常从网上复制一些代码,有些时候复制的代码前面是带有行号,如: MyEclipse本身自带有查找替换功能,并且支持正则表达式替换,使用正则替换就可以很容易 ...

  10. svg矢量图标在html中的使用, (知识点:1.通过h5中的css实现点击变色,2.一个svg文件包含多个图标)

    svg矢量文件体积小,不变形,比传统的png先进,比现在流行的icon-font灵活.然而在使用过程中还是遇到了很多坑.今天花了一天时间把经验整理出来,以供后来者借鉴.如果您从本文收益,请留言mark ...