我谈弹性运动(动画编程深入)

说到弹性运动,大家首先想到的是弹簧了吧,是的,我们都学过物理,有很强的物理基础,想必都比我学的要好。弹性运动到底怎么过运动呢,也许有人马上就去拿根弹簧过来,可生活中东西并不是好找,这样常见的。找不到是不是就不去研究了呢,当然不是。在学生时代,见过很多弹性运动,只是很少放心上去,比如,拉橡皮筋,松开反弹,就是了。 我现讨论是把弹性运动运用到计算机科学当中,也许大家学了很久的计算机,却不知道数学,物理对计算机有什么帮助,我在这里作一下解释。因为我们还没有深入计算机,如果你学习计算机动画,或者计算机图形学,哪要用到的数学,物理可就多了,大到天体运动,小到粒子引力。跑题了,还是探讨一下弹性运动吧。

    在读书时,大家有没有想过,弹簧拉长是因为弹簧自身有保持原来的状态的能力,当改变它的长度,会使产生恢复到原来状态的力,这个就是弹力。我们知道,有力必然产生加速度,这个加速度有可能是负加速度。但在计算机中,弹力这个概念还是有的,但却会省略掉,因为,我们要用到的只有加速度,只要知道它产生的加速度就够了。然而这个加速度怎么得来呢?可能物理学中会给它一个弹簧系数。其实我们有没有细细观察分析,可能我没有。在这里只要能明白一个原理就足够了。就是弹簧产生的加速度与弹簧拉伸的长度成正比,也就是拉伸的长度越长,所获得的加速度越大。

    但在计算机中表示弹性运动,要注意几个点:其一,弹簧的初始状态,这个状态我们可以用位置表示,也就是弹簧在屏幕上的x,y坐标表示。然后也给定一个点,一个弹簧的最远点(X,Y)。我在这里给出表示弹性运的公式原理及表示方法:

        我们假设是计算机坐标,就是以屏幕左上角为原点,Y轴正方向向下,X轴右方向为正。我们计算机中的弹簧为逻辑上的,也就是我们虚构存在的,其实际中并看不到弹簧的存在,我们假设有这么一个力存在,这也是我之前说的,弹力我们只要知道存在就可以了,我们只要知道加速度与位移的关系就可以了。现在以一个小球为例。这里我用AS3.0实现。实现一个小球受到弹力,并在弹力的作用下作弹性运动。所要用到个类,一个小球类Ball.as,一个文档类,Demo.as现在给出代码:

Ball.as;

package{

    import flash.display.Sprite;

    public class Ball extends Sprite{

        public var radius:Number=0;//这里我们不考虑安全性,主要是为了方便调用,因此定义为public;

        public var vx:Number=0;//小球X方向的速度;

        public var vy:Number=0;//小球Y方向的速度;

        public var ax:Number=0;//小球X方向的加速度;

        public var ay:Number=0;//小球Y方向的加速度;

        function Ball(radius:Number=10){

                    this.radius=radius;

                    this.graphics.beginFill(1);

                    this.graphics.drawCircle(0,0,this.radius);

                    this.endFill();

                }

    }

}

Demo.as;

package{

    import flash.display.Sprite;

   public class Demo extends Sprite{

        private ball:Ball;

        private ox:Number;//小球远移点X坐标;

        private oy:Number;//小球远移点Y坐标;

        private spring:Number=0.8;//弹簧力系数,加速度的比例因子,你可以自己,但要运动正常。

        function Demo(){

             ball=new Ball();

             this.addChild(ball);

             ball.x=stage.stageWidth/2;

             ball.y=stage.stageHeight/2;

             stage.addEventListener(Event.ENTER_FRAME,onEnterFrame);

         }

        private function onEnterFrame(evt:Event){

            var dx=ball.x-ox;

            var dy=blaa.y-oy;

            ball.ax=spring*dx;ball.ay=spring*dy;

            ball.vx+=ball.ax;ball.vy+=ball.ay;

            ball.x+=ball.vx;ball.y+=ball.vy;

            //到这里就全部表示完成了,这就是一个成功的弹性运动,弹性运动非常的好玩,谢谢收看。

}

    }

}

   


猜你喜欢

转载自26252426.iteye.com/blog/1193455
今日推荐