准备

  IDE:Visual Studio Code

  Language:JavaScript / ECMAScript 6+

  GitHub:Natural2D.JS

  本文主要讲述 Particles - Walker 示例的实现步骤,不涉及具体的代码细节。

第一节 粒子概述

  粒子是粒子系统最基本的组成元素。

  粒子有哪些属性

  颜色(Color):渲染颜色

  位置(Location):渲染位置

  年龄(Age):当前存活帧数

  大小(Size):当前渲染直径

  最大年龄(MaxAge):粒子的最大存活帧数

  最大大小(MaxSize):粒子的最大渲染直径

  属性如何变化?它们之间有什么关系

  年龄逐帧增大

  位置定向移动

  大小与年龄成正比关系:Size = MaxSize * (Age / MaxAge)

  粒子什么时候死亡?死亡后如何处理

  当年龄超过最大年龄时认为它已经死亡

  死亡后的一种处理方法是立即回收占用的资源

  另一种是重置粒子的状态,即当作一个新的粒子

  如何保留历史移动轨迹

  在每帧绘制前蒙一层颜色不透明的矩形

  若矩形的颜色随机渐变,会产生更好看的动态变化效果

图1-1 定向移动

第二节 力学运动

  经典力学描述了物体的宏观运动形式。

  需要扩展哪些属性

  密度(Density):粒子的密度(可选的)

  质量(Mass):粒子的质量

  速度(Velocity):当前速度

  加速度(Acceleration):当前加速度

  速度上限(VelocityUpon):最大运动速度

  属性之间的关系

  2D物体质量与面积成正比,即 Mass = Density * (Size / 2) * (Size / 2) * PI

  3D物体质量与体积成正比,即 Mass = Density * (Size / 2) * (Size / 2) * (Size / 2) *(4 / 3) * PI

  若要简化计算,可以不考虑常量值,有时候我们无需和现实世界保持一致

  粒子的牛顿万有引力运动

  物体加速度的大小跟作用力成正比,跟物体的质量成反比,即 Acceleration = Force / Mass

  引力大小与它们质量的乘积成正比与它们距离的平方成反比,即 Force = G * Mass1 * Mass2 / (Distance * Distance)

图2-1 引力运动

第三节 直线连线

  粒子的渲染方式不是一成不变的。

  有哪些简单的渲染方式?

  绘制空心、实体圆形

  绘制空心、实体矩形

  绘制贴图

  绘制连线 (下图的方式)

图3-1 粒子连线

第四节 树形拓扑

  树形是自然界中常见的一种拓扑结构。

  如何以父子层次结构组织粒子

  子节点继承父节点的颜色

  子节点初始位置相对父节点偏移适当距离

  子节点只承受与父节点之间的牛顿万有引力  

图4-1 树形拓扑

第五节 中心旋转

  一个图形绕着一个定点旋转一定的角度得到另一个图形的变化叫做旋转。

  如何实现好看的旋转效果

  设置画布中心点为旋转中心,然后旋转画布

  若每帧的旋转角度随机渐变,可产生不同的动态效果

  下方示例图片的随机效果

  画布背景颜色随机渐变

  画布旋转角度随机渐变

  粒子父子节点相对位置的旋转角度渐变

  粒子父子节点相对位置的距离系数渐变

图5-1 效果图一

图5-2 效果图二

图5-3 效果图三

附录

  Demo:Particles - Walker

  GitHub:Natural2D.JS

  上一篇:粒子系统(一):从零开始画一棵树

粒子系统(二):Canvas绘制精美图案的更多相关文章

  1. canvas一周一练 -- canvas绘制马尾图案 (5)

    运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...

  2. canvas——绘制解锁图案

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. java-js知识库之二——canvas绘制炫彩气泡

    现在使用canvas绘制气泡,虽说很多人都已经实现过了,可能方法都大同小异,但自己写和看别人写完全是两码事,自己会写的才是自己的,话不多说,直接上代码. 先来一张效果图: 现在上代码,代码有详细的注释 ...

  4. 使用 HTML5 canvas 绘制精美的图形

    HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C “工作草案” — 意味着它仍然处于开发阶段 — 它包含丰富的元素和属性,它们都支持现行的 HT ...

  5. HTML5 canvas 绘制精美的图形

    HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C “工作草案” — 意味着它仍然处于开发阶段 — 它包含丰富的元素和属性,它们都支持现行的 HT ...

  6. 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)

    小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...

  7. canvas基础入门(二)绘制线条、三角形、七巧板

    复杂的内容都是有简单的线条结合而成的,想要绘制出复杂好看的内容先从画直线开始 canvas绘制直线先认识几个函数 beginPath():开始一条路径,或重置当前的路径 moveTo(x,y):用于规 ...

  8. 应用canvas绘制动态时钟--每秒自动动态更新时间

    使用canvas绘制时钟 下文是部分代码,完整代码参照:https://github.com/lemoncool/canvas-clock,可直接下载. 首先看一下效果图:每隔一秒会动态更新时间 一. ...

  9. 如何写成高性能的代码(一):巧用Canvas绘制电子表格

    一.什么是Canvas Canvas是HTML5的标签,是HTML5的一种新特性,又称画板.顾名思义,我们可以将其理解为一块画布,支持在上面绘制矩形.圆形等图形或logo等. 需要注意的是,与其他标签 ...

随机推荐

  1. Genymotion模拟器的安装及常见问题解决方法

    Genymotion是很好用很快的一款Android模拟器. 我们使用的时候下载一个免费版的就足够用了. 官网下载地址:http://www.genymotion.net/ 不过这个软件下载之前必须注 ...

  2. CSS Grid 网格布局全解析

    介绍 CSS Grid(网格) 布局使我们能够比以往任何时候都可以更灵活构建和控制自定义网格. Grid(网格) 布局使我们能够将网页分成具有简单属性的行和列.它还能使我们在不改变任何HTML的情况下 ...

  3. PHP编程效率的20个要点--PHP技术教程分享

    用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP教程会教你在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:兄弟 ...

  4. 数据模型LP32 ILP32 LP64 LLP64 ILP64

    各个C++实现所选择采用的基础类型的大小统称为"数据模型".有四种广泛采用的数据模型: 32 位系统: LP32 或 2/4/4(int 为 16-bit,long 和指针为 32 ...

  5. svn 发布脚本整合

    svn提交时出现(413 Request Entity Too Large)错误解决方法 在nginx的server配置中增加 client_max_body_size 100M; linux多实例a ...

  6. C++标准库string类型的使用和操作总结

    string是C++标准库最重要的类型之一,string支持长度可变的字符串,其包含在string头文件中.本文摘自<C++PRIMER 第四版·特别版>和个人的一些总结. 一.声明和初始 ...

  7. 一次精疲力尽的改bug经历

    一.介绍 最近一直在做有关JavaScriptCore的技术需求,上周发现一个问题,当在JavaScriptCore在垃圾回收时,项目会有一定几率发生崩溃.崩溃发生时调用堆栈如下: 图1 调用堆栈 先 ...

  8. JAVA字符串缓存器全部方法功能及其作用

    不知道干嘛的 serialVersionUID 构造一个没有字符的字符串缓冲区,初始容量为16个字符. StringBuffer() 构造一个没有字符的字符串缓冲区和指定的初始容量. StringBu ...

  9. Android Service基础

    Service Service 是一个组件,用来执行长时间的后台操作,不提供用户界面. 另一个应用组件可以启动一个Service,它将持续地在后台运行,即便是用户转移到另一个应用它也不会停止. 另外, ...

  10. 动态控制jQuery easyui datagrid工具栏显示隐藏

    //隐藏第一个按钮 $('div.datagrid-toolbar a').eq(0).hide(); //隐藏第一条分隔线 $('div.datagrid-toolbar div').eq(0).h ...