Flash/Flex学习笔记(40):弹性运动续--弹簧

上一篇里演示的弹性运动加上摩擦力因素后,物体最终基本上都会比较准确的停在目标位置。但是我们回想一下现实世界中的弹簧,如果把弹簧的一头固定起来(即相当于目标点),而另一端栓一个球,把球拉开或压缩一定距离然后松手,事实上小球永远也不可能到达弹簧固定的那一端(因为弹簧即使压缩到最紧,也总有一定的长度)

所以如果要在Flash里模拟现实中的弹簧,真正的目标点绝不是弹簧的端点,而是目标点再偏移一段距离(即弹簧自然伸展时的长度)

如果考虑到二维坐标的弹簧运动,要稍微复杂一点:

上面的例子中,移动的方向(即夹角)与目标点都是固定的,如果改成动态的(比如鼠标当前所在位置),效果可能更逼真

1
2
3
4
5
6
7
8
9
10
11
12
function EnterFrameHandler(e:Event):void{
    targetX = mouseX;//改成动态目标
    targetY = mouseY;
    angle = Math.atan2(targetY - ball.y,targetX -ball.x);//动态夹角
    ball.vx += (targetX - springLength*Math.cos(angle) - ball.x)*spring;
    ball.vy += (targetY - springLength*Math.sin(angle) - ball.y)*spring;
    ball.vx *= friction;
    ball.vy *= friction;
    ball.x += ball.vx;
    ball.y += ball.vy;
    DrawLine();
}

如果二个物体相互以对方所在位置为目标做弹性运动,同时再考虑弹簧长度,边界检测等因素,可以用AS3模拟出一个极逼真的弹簧模型:

如果玩得再疯狂一点,多放一些小球,让第二个以第一个为目标,第三个以第二个为目标...最后一个再以第一个为目标,这样构成一个环,大概就是下面这个样子:

思考一下:这样为啥不会造成死循环?

posted @   菩提树下的杨过  阅读(1683)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示