动画

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来控制运行时间,或者其他手段。总之,知道了最基本的用法就可以根据需求不断扩充嘛。

最新文章

  1. Redis学习 - 配置属性:protected-mode
  2. 《所用到的AJAX技术基础》
  3. Struts2中获取servlet API的几种方式
  4. 【JavaEE企业应用实战学习记录】requestListener
  5. 20150226—C# winform中的ListView解析
  6. poj 1054 The Troublesome Frog (暴力搜索 + 剪枝优化)
  7. IOS UIScrollView中 使用 touch 无法响应的问题
  8. C# - implicit, explicit
  9. 【CF】196 Div.2 D. Book of Evil
  10. JVMTI 中间JNI系列功能,线程安全和故障排除技巧
  11. Codeforces 765E. Tree Folding [dfs][树形dp]
  12. _1Python简介 安装及版本检测
  13. 【Android 应用开发】Android - TabHost 选项卡功能用法详解
  14. C# 操作Word文本框——插入表格/读取表格/删除表格
  15. [MySQL] 联合索引与using index condition
  16. navicat for mysql 12中文破解版(安装+破解)--亲测可用
  17. EtherCAT主站对PHY有要求?
  18. 多线程-synchronized、lock
  19. C++中string类
  20. 案例情景--在一次Oracle 数据库导出时 EXP-00008;ORA-00904:EXP-00000: oracle不同版本导入导出规则

热门文章

  1. Junit中常用的注解说明
  2. ip头、tcp头、udp头详解及定义,结合Wireshark抓包看实际情况
  3. Shell脚本编程的常识
  4. iOS-iPhone系统版本号-iPhone App版本号
  5. [Whole Web] [Node.js, PM2] Controlling runaway apps using pm2
  6. java class 文件解析
  7. springmvc 双亲上下文导致的 No mapping found for HTTP request
  8. ssh-add命令
  9. 构建本地yum源之rpmbuild
  10. Verilog HDL常用的行为仿真描述语句