动画(Animation)

动画意味着随着时间而变化,尤其指视觉上的变化,包括位置、形态等的变化。运动基本上表现为物体随时间,发生位置上的变化;形态基本表现为大小、颜色、透明度、形状等随时间的变化。

图像以每秒24帧的速度播放,最容易看成运动的图像。比这个速度再慢些,会由于停顿时间较长,人眼会感觉影像不连贯。人眼似乎不能分辨比这个帧频再快的速度,理论上讲,帧频再快也不会使动画变得更真实,虽然快速的帧频,看上去会更平滑。

三角学(Trigonometry)

三角学是研究三角形与其边和角关系的学科。一个三角形有三条边和三个角,这些边和角存在着一些特殊的关系。比如,增大其中任何一个角,那么该角对应的边就会增长,假设其它两条边长度不,其它两个角会变小。我们在动画中,经常遇到的是直角三角形模型,其中一个角为90度。

勾股定理

直角三角形两直角边长的平方和等于斜边长的平方。由上图可推出: b2 + c2 = a2

斜边公式

(一)已知两条直角边的长度 ,可按勾股定理计算斜边 :a2 = b2 + c2
(二)已知一条直角边和一个锐角,可用直角三角函数计算斜边。
 
∠B+∠C=90°
 
正弦(sine)
sinB = ∠B的对边(AC)/斜边(BC)
余弦(cosine)
cosB = ∠B的邻边(AB)/斜边(BC)
正切(tangent)
tanB =  ∠B的对边(AC)/∠B的邻边(AB)
反正弦(arcsine)
∠B = Math.asin(∠B的对边(AC)/斜边(BC))
反余弦(arccosine)
∠B = Math.acos(∠B的邻边(AB)/斜边(BC))
反正切(arctangent)
∠B = Math.atan(∠B的对边(AC)/∠B的邻边(AB))

坐标系(Coordinate System)

基于HTML文档的JS动画,文档左上角坐标为(0,0),X值从左向右不断增大,Y值从上到下不断增大。

旋转(Rotation)

波形(waveform)

正弦曲线:y=sin(x)

余弦曲线:y=cos(x)

创建波形:

value = center + Math.sin(angle)*range;

angle += speed;

创建圆形:

posx = centerX + Math.cos(angle)*radius;

posy = centerY + Math.sin(angle)*radius;

angle += speed;

创建椭圆:

posx = centerX + Math.cos(angle)*radiusX;

posy = centerY + Math.sin(angle)*radiusY;

angle += speed;

两点间距离:

dx = x2 - x1;

dy = y1 - y2;

dist = Math.sqrt(dx*dx + dy*dy);

加速度(accelerate)

加速度就是使速度加快,减速度就是使速度减慢。

speed += a*speed;

角速度转换为想x,y速度向量

vx = speed * Math.cos(angle);

vy = speed * Math.sin(angle);

角加速度转换为 x,y加速度

ax = force * Math.cos(angle);

ay = force * Math.sin(angle);

速度转换:

vx += ax;

vy += ay;

边界(edge)

边界是一个矩形,就是物体运动不能超过这个矩形范围,这个范围我们一般设为浏览器可视范围。

if(posx - width > right){

  posx = left - width;

}else if(posx < left){

  posx = left;

}

if(posy - height > bottom){

  posy = bottom - height;

}else if(posy < top){

  posy =  top;

}

反弹(rebound)

反弹即改变物体运动的运动方向为反方向。

摩擦力(Friction)

摩擦力是与速度方向相反的力,从速度中减去这个值。如果摩擦力大于速度,速度就变为0。常用的做法是在速度上乘以0.9或0.8,速度会无限接近零,但永远不会等于0 。这种做法的好处是速度永远不会变为负数,不需要进行判断。

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;

或者

vx *= friction;

vy *= friction;

缓动(easing)

缓动运动,速度与距离成反比,物体离目标越远,物体速度越快。当物体与目标点非常接近时,物体几乎停止运动。

缓动速查: http://easings.net/zh-cn

弹性(springing)

弹性运动,加速度与距离成正比。物体离目标很远,再用上加速度,会使物体移动速度越来越快。当物体接近目标是,加速度减小。物体飞过目标点,再由反向加速度将它拉回来,最终,用摩擦力使其静止。

JS动画理论的更多相关文章

  1. 【06-23】js动画学习笔记01

    <html> <head> <style> * { margin:0; padding:0; } #div1{ width:200px; height:200px; ...

  2. css动画与js动画的区别

    CSS动画 优点: (1)浏览器可以对动画进行优化.   1. 浏览器使用与 requestAnimationFrame 类似的机制,requestAnimationFrame比起setTimeout ...

  3. CSS VS JS动画,哪个更快[译]

    英文原文:https://davidwalsh.name/css-js-animation 原作者Julian Shapiro是Velocity.js的作者,Velocity.js是一个高效易用的js ...

  4. css与 js动画 优缺点比较

    我们经常面临一个抉择:到底使用JavaScript还是CSS动画,下面做一下对比 JS动画 缺点:(1)JavaScript在浏览器的主线程中运行,而主线程中还有其它需要运行的JavaScript脚本 ...

  5. [学习笔记]js动画实现方法,作用域,闭包

    一,js动画基本都是依靠setInterval和setTimeout来实现 1,setInterval是间隔执行,过一段时间执行一次代码 setInterval(function(){},500);即 ...

  6. css3动画与js动画的一些理解

    http://zencode.in/19.CSS-vs-JS%E5%8A%A8%E7%94%BB%EF%BC%9A%E8%B0%81%E6%9B%B4%E5%BF%AB%EF%BC%9F.html 首 ...

  7. js动画(四)

    终于到了最后了,这里要告一段落了,整了个js运动框架,咳咳咳,好冷 啊啊啊啊啊啊,这天气.妈的,工资怎么也不发,啊,说好的 人与人之间的信任呢?哎,气诶,不到150字啊,又是这个梗..怎么办?说些什么 ...

  8. css动画特效与js动画特效(一)------2017-03-24

    1.用css做动画效果: 放鼠标才会发生 利用hover <head> <style> #aa{ background-color: red; width: 100px; he ...

  9. JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能

    摘要: 理解浏览器渲染. 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门探索 J ...

随机推荐

  1. ArrStack——数组栈(procedure)

    //数组栈,对于无法预料栈的长度情况下,可能会因为原分配数组不够长而导致数据溢出,或因为数组太长而浪费空间.但是操作快,不需要额外的操作.而链表与此想法,可以动态分配内存,但是要增加额外的操作. #i ...

  2. Win7 64位安装MySQL

    1.Win7 64位 安装MySQL5.5版本 安装文件的执行:会提示“已经停止工作”: 2.我下载了mysql-installer-community-5.7.11.0.msi,可以安装成功,中途需 ...

  3. 字符集(CHARACTER SET)和校对集(COLLATE)

    http://blog.sina.com.cn/s/blog_9707fac301016wxm.html http://www.th7.cn/db/mysql/201412/84636.shtml 从 ...

  4. Linux命令 — 设置或查看网络配置命令ifconfig

    ifconfig命令用于设置或查看网络配置,包括IP地址.网络掩码.广播地址等.它是linux系统中,使用频率最高的关于网络方面的命令. 1. 命令介绍 命令格式: ifconfig [interfa ...

  5. 翻译Android USB HOST API

    翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...

  6. Light OJ 1114 Easily Readable 字典树

    题目来源:Light OJ 1114 Easily Readable 题意:求一个句子有多少种组成方案 仅仅要满足每一个单词的首尾字符一样 中间顺序能够变化 思路:每一个单词除了首尾 中间的字符排序 ...

  7. Delphi QQ表情的实现

    Delphi QQ表情的实现 QQ表情描述 蓝框 提示信息 鼠标在这个表情上面 这个表情才动 可以增加表情 表情打包 单击这个表情插入表情 关闭本窗体   主要使用Webbrowsr来实现的   -- ...

  8. ExtJs4学习(四):Extjs 中id与itemId的差别

       为了方便表示或是指定一个组件的名称,我们一般会使用id或者itemId进行标识命名. (推荐尽量使用itemId.这样能够降低页面唯一标识而产生的冲突) id:   id是作为整个页面的Comp ...

  9. Java语言基础(四)

    Java语言基础(四) 一.基本数据类型(8) byte  8位  使用较少,一般用于网络传输: -128-+127 short  16位 不常用 -32768-+32767 int  32位 常用  ...

  10. Eclipse3.7默认字体修改-找回Courser-New字体

    1.找到jFace并用WinRAR打开之: jFace的具体位置:$Eclipse目录$/plugins/org.eclipse.jface_3.7.0.I20110522-1430.jar,找到后, ...