zoukankan      html  css  js  c++  java
  • Eyeshot Ultimate 学习笔记(4)

    动画

      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(0, 0, 0, blockName, 1, 1, 1, 0) { }
            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(0, -yPos, 0);
            }
        }

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

  • 相关阅读:
    比赛-h47学长的训练赛 (27 Aug, 2018)
    比赛-OBlack学长的训练赛2 (26 Aug, 2018)
    比赛-OBlack学长的训练赛 (25 Aug, 2018)
    比赛-xxxxxyt学姐的训练赛 (25 Aug, 2018)
    比赛-一场训练赛
    比赛-wxh学长的训练赛 (23 Aug, 2018)
    比赛-sparrow学长的训练赛2 (22 Aug, 2018)
    深入JVM内核--JVM简介
    GitHub之初始化
    B-Tree索引
  • 原文地址:https://www.cnblogs.com/theblueberry/p/4234291.html
Copyright © 2011-2022 走看看