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

  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/theblueberry/p/4234291.html
Copyright © 2011-2022 走看看