准备

  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. GeoJSON JS判断某一点是否在某一区域范围之内

    GeoJSON JS判断某一点是否在某一区域范围之内 算法: function isInPolygon(checkPoint, polygonPoints) { var counter = 0; va ...

  2. Unity性能优化的N种武器

    贴图: l  控制贴图大小,尽量不要超过 1024 x1024: l  尽量使用2的n次幂大小的贴图,否则GfxDriver里会有2份贴图: l  尽量使用压缩格式减小贴图大小: l  若干种贴图合并 ...

  3. 谁能用通俗的语言解释一下什么是 RPC 框架?

    转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题 关于RPC你的题目是RPC框架,首先了解什么叫RP ...

  4. NET Core2.0 Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。

    DotNetCore2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到的时 ...

  5. Vmware虚拟机不能使用键盘的解决方法

    有个笔记本thinkpad T440要重装系统,但又怕前面的资料丢失,因此打算直接将整个物理机迁移到VCenter 6.5上去,比GHOST什么的方便多了,利用Vmware Convert工具直接在线 ...

  6. docker 学习之一:docker 安装

    核心概念1. 镜像是一个只读的模板类似于安装系统用到的那个iso文件我们通过镜像来完成各种应用的部署. 2. docker容器镜像类似于操作系统而容器类似于虚拟机本身.它可以被启动.开始.停止.删除等 ...

  7. 键值编码KVC

    动态设置:setValue:属性值 forKey:属性名用于简单路径:setValue:属性值 forKeyPath:属性路径用于复合路径,例如Person有一个Account类型的属性,那么pers ...

  8. 20165226 2017-2018-3 《Java程序设计》第5学习总结

    20165226 2017-2018-3 <Java程序设计>第5周学习总结 教材学习内容总结 第七章 内部类与异常类 匿名类创建对象: new Bank() { 匿名类的类体 }: 异常 ...

  9. java.lang.system 类源码解读

    通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...

  10. 『转载』从内存资源中加载C++程序集:CMemLoadDll

    MemLoadDll.h #if !defined(Q_OS_LINUX) #pragma once typedef BOOL (__stdcall *ProcDllMain)(HINSTANCE, ...