动画

Eyeshot的官方Demo中有一个功能是近期项目需要用到的,就是动画效果。其中主要运用到BlockReference类,该类下的两个方法MoveTo(Dictionary<string, Block> blocks)和Animate(int frameNumber)分别用来移动某个block中的实体和作为接口与视图ViewportLayout交互。

假如我导入了一个模型,该模型中包含多个Entity和Material,这里material不用加以管理,只需要处理entity。首先要写一个新的类继承类BlockReference,重写MoveTo方法和Animate方法,留出一个接口来接收block。例如可以这样写:

 class MyEntity : BlockReference
{
// 定义一个变量,表示在Y轴的位移量
private double yPos; public MyEntity(string blockName)
: base(, , , blockName, , , , ) { }
protected override void Animate(int frameNumber)
{
// 该处主要是编写运动轨迹,可根据需要进行数学运算表达出需要的运动轨迹
// 这里就只是单纯把帧数传递给位移量
yPos = frameNumber;
base.Animate(frameNumber);
}
public override void MoveTo(Dictionary<string, Block> blocks)
{
base.MoveTo(blocks);
// 用Translated方法来移动实体,参数分别是X,Y,Z轴的位移量
OpenGL.gl.Translated(, -yPos, );
}
}

即Animate函数和MoveTo函数不断地执行,进而达到移动模型的效果。 至于执行的频率则与参数frameNumber有关,如不使用StopAnimate()方法停止移动,就会一直运动下去,可达到官方demo中那种循环运动的效果。

如上,在自定义类MyEntity的构造函数中的参数,可按照自己的需要结合BlockReference类来定义,不过我理解的是,至少需要一个参数,因为继承了BlockReference类。这里只用到了blockName这一个参数,就是与外界的接口。在导入模型之后,将所有导入模型中的entity都添加到一个block中,并以该block的name为参数实例化类MyEntity,将该类添加到ViewportLayout的Entities列表中。如需执行动画,用方法viewportLayout1.StartAnimation()停止则用viewportLayout1.StopAnimation(),比如可以这样使用:

private void viewportLayout1_WorkCompleted(object sender, WorkCompletedEventArgs e)
{
if (e.WorkUnit is ReadFileAsynch)//导入文件
{
ReadFileAsynch rfa = (ReadFileAsynch)e.WorkUnit;
Entity[] entList = rfa.Entities; Block b = new Block();
for (int i = ; i < entList.Length; i++)
{
b.Entities.Add(entList[i]);
}
viewportLayout1.Blocks.Add("block1", b);
MyEntity me = new MyEntity("block1");
viewportLayout1.Entities.Add(me);
}
}

执行动画以及停止动画可在任意需要的地方添加,比如按钮点击 事件中。

当然,以上只是简单记录了基本使用方法,如果想要实现比较复杂的动画效果,不仅在Animate函数中需要详细计算以外,还可能用到timer来控制运行时间,或者其他手段。总之,知道了最基本的用法就可以根据需求不断扩充嘛。

Eyeshot Ultimate 学习笔记(4)的更多相关文章

  1. Eyeshot Ultimate 学习笔记(1)

    在Winform项目中用到3D技术,这是在做项目一段时间以来第一次,还是指定的3D控件Eyeshot Ultimate,这个控件名称用度娘搜索,竟然毫无结果,不知道是没有人用过还是觉得该控件过于简单, ...

  2. Eyeshot Ultimate 学习笔记(2)

    导入模型 一般情况下,我们自己搭建模型的功力还不够,大多都是在3Dmax中做好模型,导出成模型文件,然后再导入Eyeshot视图中.导入的代码包括: OpenFileDialog openFileDi ...

  3. Eyeshot Ultimate 学习笔记(3)

    实体角度和位置的控制 有时候导入的模型方向或者角度不太适合,就需要调节一下,这里我发现的一种方法是用到Transformation类,其实有很多类的运用都非常灵活,如果不是有官方示例,恐怕是很难发现的 ...

  4. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  5. VSTO 学习笔记(十三)谈谈VSTO项目的部署

    原文:VSTO 学习笔记(十三)谈谈VSTO项目的部署 一般客户计算机专业水平不高,但是有一些Office水平相当了得,尤其对Excel的操作非常熟练.因此如果能将产品的一些功能集成在Office中, ...

  6. VSTO学习笔记(十五)Office 2013 初体验

    原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...

  7. VSTO 学习笔记(十)Office 2010 Ribbon开发

    原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...

  8. VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式

    原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...

  9. VSTO学习笔记(八)向 Word 2010 中写入表结构

    原文:VSTO学习笔记(八)向 Word 2010 中写入表结构 前几天公司在做CMMI 3级认证,需要提交一系列的Word文档,其中有一种文档要求添加公司几个系统的数据库中的表结构.我临时接到了这项 ...

随机推荐

  1. 使用webview如何做超时判断

    在加载网页时给一个timer定时器,规定超时时间,然后再超时时间的方法中提示超时 如果没有超时,则在webview协议中的“加载完成”方法中 取消timer定时器 - (void)openWebVie ...

  2. PS Studio打包程序 .net版本依赖

    PS Studio打包好的程序(Win7下),拿到Windows Server 2003(PS2.0),如果提示”.Net framework初始化错误“,则需要安装 .net 3.0 如果是PS3. ...

  3. Java生成word文档

    itext-rtf-2.1.7.jar,下载地址:http://download.csdn.net/detail/xuxu198899223/7717727 itext-2.1.7.jar 下载地址: ...

  4. web app 相关记录

    今天在手机浏览器上运行cocos2d-html5的sample, crystalcraze运行起来只有10~20帧, moonwarrior只有20~30帧,很不理想的数据: 记录下几个web app ...

  5. Android记录6--ViewPage+Fragment的使用例子

    Android记录6--ViewPage+Fragment的使用例子 2013年9月6日Fragment学习 Fragment这个东西,我到现在才接触到,之前没有用到过,关于Fragment这个东西在 ...

  6. Spring安全资料整理列表

    Spring 被爆漏洞,允许远程执行代码http://automationqa.com/forum.php?mod=viewthread&tid=2827&fromuid=21 Spr ...

  7. Java中的编码问题

    下面将侧重介绍java乱码是如何产生的.存在哪些乱码的情况.该如何从根本上解决乱码问题.各位随博主一起征服令人厌烦的java乱码问题吧!!! 一.Java编码转换过程 我们总是用一个java类文件和用 ...

  8. C++实现多线程类Thread

    Windows编程中创建线程的常见函数有:CreateThread._beginthread._beginthreadex.据说在任何情况下_beginthreadex都是较好的选择. _begint ...

  9. 跨时钟域设计【二】——Fast to slow clock domain

    跨时钟域设计中,对快时钟域的Trigger信号同步到慢时钟域,可以采用上面的电路实现,Verilog HDL设计如下:   // Trigger signal sync, Fast clock dom ...

  10. ActionBar功能,效果图一览

    这里提供了效果预览,如果由你需要的界面,详细的代码可以去看原文. http://blog.csdn.net/android2me/article/details/8874846 一.概述 1.App ...