粒子系统(二):Canvas绘制精美图案
准备
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绘制精美图案的更多相关文章
- canvas一周一练 -- canvas绘制马尾图案 (5)
运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...
- canvas——绘制解锁图案
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- java-js知识库之二——canvas绘制炫彩气泡
现在使用canvas绘制气泡,虽说很多人都已经实现过了,可能方法都大同小异,但自己写和看别人写完全是两码事,自己会写的才是自己的,话不多说,直接上代码. 先来一张效果图: 现在上代码,代码有详细的注释 ...
- 使用 HTML5 canvas 绘制精美的图形
HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C “工作草案” — 意味着它仍然处于开发阶段 — 它包含丰富的元素和属性,它们都支持现行的 HT ...
- HTML5 canvas 绘制精美的图形
HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C “工作草案” — 意味着它仍然处于开发阶段 — 它包含丰富的元素和属性,它们都支持现行的 HT ...
- 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)
小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...
- canvas基础入门(二)绘制线条、三角形、七巧板
复杂的内容都是有简单的线条结合而成的,想要绘制出复杂好看的内容先从画直线开始 canvas绘制直线先认识几个函数 beginPath():开始一条路径,或重置当前的路径 moveTo(x,y):用于规 ...
- 应用canvas绘制动态时钟--每秒自动动态更新时间
使用canvas绘制时钟 下文是部分代码,完整代码参照:https://github.com/lemoncool/canvas-clock,可直接下载. 首先看一下效果图:每隔一秒会动态更新时间 一. ...
- 如何写成高性能的代码(一):巧用Canvas绘制电子表格
一.什么是Canvas Canvas是HTML5的标签,是HTML5的一种新特性,又称画板.顾名思义,我们可以将其理解为一块画布,支持在上面绘制矩形.圆形等图形或logo等. 需要注意的是,与其他标签 ...
随机推荐
- EXCEL VLOOKUP函数怎么返回多列结果
一般VLOOKUP函数只能返回一列的结果,本例介绍如何一次性返回多列结果. 工具/原料 Excel 函数使用方法说明: 首先,原始数据包括姓名.工号.性别和籍贯信息.现在需要根据姓名同 ...
- IPFS: BitSwap协议(数据块交换)
原创 2018-01-11 飞向未来 IPFS指南 BitSwap协议 IPFS节点之间是如何进行数据交换的?本文来讲一下这个问题. IPFS在BitTorrent的基础上实现了p2p数据交换协议:B ...
- php 制作圆形图片
function createRoundImg($imgpath) { $ext = pathinfo($imgpath); $src_img = null; switch ($ext['extens ...
- AngularJs的resource服务与Rest服务交互
前言以后补: * 在使用resource服务返回的资源对象后具有与后台数据交互的五大接口:save query delete remove get 五种默认行为: { "get": ...
- 【Python】 文件目录比较工具filecmp和difflib
在一些运维场景中,常常需要比较两个环境中的应用目录结构(是否有文件/目录层面上的增删)以及比较两个环境中同名文件内容的不同(即文件层面上的改).Python自带了两个内建模块可以很好地完成这个工作,f ...
- 关于BufferedReader的readLine方法遇到的坑
今天偶然用到BufferedReader,在读取文本后输出数据的时候遇到了隔行输出的问题. 如: 床前明月光 疑是地上霜 123456 789789 输出的为:疑是地上霜789789 找了一下,最终找 ...
- Frequent Value
Frequent Value poj-3368 题目大意:给你n个数的数列,保证它是单调递增的.给你m个询问,每个询问是询问两个节点之间最长的连续的相等的数的长度. 注释:n,m<=100000 ...
- IntelliJIDEA中如何使用JavaDoc
IntelliJ IDEA 12.1.6,本身提供了很好的 JavaDoc 生成功能,以及标准 JavaDoc 注释转换功能,其实质是在代码编写过程中,按照标准 JavaDoc 的注释要求,为需要暴露 ...
- java基础之类与对象
[类 & 对象] 1.类:具有一系列相同属性(特征)和方法(行为)的个体的集合,称为类. 类是一个抽象的概念,只能说类具有哪些属性,而不能直接对属性进行赋值. 例如:人类有身高的属性,但是不能 ...
- APP案例分析
产品 蓝叠安卓模拟器 选择理由 看了一眼桌面,就这个比较有意思.现在很多人喜欢玩手游,经常喜欢开个小号搞事情.这时候身边又没有多余的手机,怎么办?安卓模拟器下一个.手机屏幕太小玩起来没意思怎么 ...