首页 > 代码库 > 动画原理——摩擦力

动画原理——摩擦力

书籍名称:HTML5-Animation-with-JavaScript

书籍源码:https://github.com/lamberta/html5-animation1

1.有摩擦力的情况

摩擦力在物体发生相对运动时产生,是运动方向的反向加速度。

代码表示意思如下

  if (speed > friction) {          speed -= friction;        } else {          speed = 0;        }

06-friction-1.html

技术分享
<!doctype html><html>  <head>    <meta charset="utf-8">    <title>Friction 1</title>    <link rel="stylesheet" href="http://www.mamicode.com/include/style.css">  </head>  <body>    <header>      Example from <a href="http://amzn.com/1430236655?tag=html5anim-20"><em>Foundation HTML5 Animation with JavaScript</em></a>    </header>    <canvas id="canvas" width="400" height="400"></canvas>    <script src="http://www.mamicode.com/include/utils.js"></script>    <script src="http://www.mamicode.com/classes/ball.js"></script>    <script>    window.onload = function () {      var canvas = document.getElementById(‘canvas‘),          context = canvas.getContext(‘2d‘),          ball = new Ball(),          vx = Math.random() * 10 - 5,          vy = Math.random() * 10 - 5,          friction = 0.1;      ball.x = canvas.width / 2;      ball.y = canvas.height / 2;      (function drawFrame () {        window.requestAnimationFrame(drawFrame, canvas);        context.clearRect(0, 0, canvas.width, canvas.height);        var speed = Math.sqrt(vx * vx + vy * vy),            angle = Math.atan2(vy, vx);        if (speed > friction) {          speed -= friction;        } else {          speed = 0;        }        vx = Math.cos(angle) * speed;        vy = Math.sin(angle) * speed;        ball.x += vx;        ball.y += vy;        ball.draw(context);      }());    };    </script>  </body></html>
View Code

2.简单的方法

摩擦力实际就是速度逐渐变相,在动画程序中,我们可以简单的使每一帧的速度都变小。类似。

vx *= 0.9;vy *= 0.9;

06-friction-2.html

技术分享
<!doctype html><html>  <head>    <meta charset="utf-8">    <title>Friction 2</title>    <link rel="stylesheet" href="http://www.mamicode.com/include/style.css">  </head>  <body>    <header>      Example from <a href="http://amzn.com/1430236655?tag=html5anim-20"><em>Foundation HTML5 Animation with JavaScript</em></a>    </header>    <canvas id="canvas" width="400" height="400"></canvas>    <script src="http://www.mamicode.com/include/utils.js"></script>    <script src="http://www.mamicode.com/classes/ball.js"></script>    <script>    window.onload = function () {      var canvas = document.getElementById(‘canvas‘),          context = canvas.getContext(‘2d‘),          ball = new Ball(),          vx = Math.random() * 10 - 5,          vy = Math.random() * 10 - 5,          friction = 0.95;      ball.x = canvas.width / 2;      ball.y = canvas.height / 2;      (function drawFrame () {        window.requestAnimationFrame(drawFrame, canvas);        context.clearRect(0, 0, canvas.width, canvas.height);        vx *= friction;        vy *= friction;        ball.x += vx;        ball.y += vy;        ball.draw(context);      }());    };    </script>  </body></html>
View Code

 

动画原理——摩擦力