three.js 制作动态二维码的示例代码


Posted in Javascript onJuly 31, 2020

今天郭先生说一下用canvas解析图片流,然后制作一个动态二维码的小案例,话不多说先上图,这是郭先生的微信二维码哦!

three.js 制作动态二维码的示例代码

1. 解析图片流

canvas = document.createElement('canvas');//创建canvas画布
content = canvas.getContext('2d');//获取画布的上下文
canvas.width = 310;//设置尺寸
canvas.height = 310;
img = new Image();//创建一张图片
img.src = require("../assets/images/base/wechat.png");//设置图片地址
img.onload = () => {
    //在图片加载后
  content.drawImage(img, 0, 0, canvas.width, canvas.height);//将图片添加到画布,并设置宽高
  imgData = content.getImageData(0, 0, canvas.width, canvas.height).data;//获取画布数据
};

imgData是什么样的呢?如下图

three.js 制作动态二维码的示例代码

这是一个Uint8ClampedArray的类型化数组,这个数组出现最多的也是在imgData上。它会将负数归入0,大于255的数归入255,所以取模就不用了。我们再来看这个数组的长度是384400是怎么来的呢?因为我们设置了画布长宽为310,而imgData四位代表一个rgba像素点,也就是imgData[0]是红色通道,imgData[1]是绿色通道,imgData[2]是蓝色通道,imgData[3]是透明通道…依次循环,所以310 * 310 * 4 = 384400。

2. 处理像素点,画出二维码

for (var i = 0; i < 31 * 31; i++) {
    //random_position为各个小平面块打乱时的位置信息,我设置小平面一共有31 * 31个
  random_position.push([Math.floor(Math.random() * 300 - 150), Math.floor(Math.random() * 300 - 150), Math.floor(Math.random() * 300 - 150)])
}
var color = new Array(310).fill('').map(d => []);//color设置成310个数组
for (var i = 0; i < 310; i++) {
  for (var j = 0; j < 310; j++) {
    let clr = imgData[(i * 310 + j) * 4] + imgData[(i * 310 + j) * 4 + 1] + imgData[(i * 310 + j) * 4 + 2];
    clr = clr > 382 ? 'light' : 'black'; //因为颜色是有深色块和浅色块组成,他们的分界就是rgb通道颜色值之和小于等于127+127+127之和。
    color[i].push(clr)//每个数组有310项,每项的值为'light'或者'black'
  }
}
var color1 = [];//设置color1为小平面颜色数组31 * 31。
color.filter((d, i) => (i + 6) % 10 == 0).forEach((dd, ii) => color1[ii] = dd.filter((d, i) => (i + 6) % 10 == 0));//每10个像素,筛选出1个像素作为小平面的颜色,选取的位置尽量在10个的中间选择,毕竟有的图片比较模糊。
for (var i = 0; i < color1.length; i++) {//31 * 31的循环
  for (var j = 0; j < color1[i].length; j++) {
    var geometry = new THREE.PlaneGeometry(10, 10);
    var material = new THREE.MeshBasicMaterial({
      color: 0xffffff,
      side: THREE.DoubleSide,
      transparent: true,
      opacity: color1[i][j] == 'black' ? 0 : 1,
    });
    var mesh = new THREE.Mesh(geometry, material);//小方块网格
    origin_position.push([j * 10 - 15 * 10, 15 * 10 - i * 10, 0]);//保存序列换后小方块的位置
    mesh.position.set(random_position[j + i * j][0], random_position[j + i * j][1], random_position[j + i * j][2]);//先将小方块的位置设置成打乱的位置,便于动画播放。
    mesh.name = 'plane';
    group.add(mesh);//将所有小平面放到数组,便于操作。
  }
}
scene.add(group);

这部分代码主要是计算部分,没什么技术含量。

3. 实现tween动画

var pos = { time: 0 };
tween1 = new TWEEN.Tween(pos).to({ time: 1 }, 3000);
tween2 = new TWEEN.Tween(pos).to({ time: 0 }, 3000);
tween1.easing(TWEEN.Easing.Quadratic.In);
tween2.easing(TWEEN.Easing.Quadratic.Out);
tween1.onUpdate(onUpdate);
tween2.onUpdate(onUpdate);
tween1.start();

function onUpdate() {
  let time = this._object.time;
  group.children.forEach((d, i) => {
    d.position.set(time * origin_position[i][0] + (1 - time) * random_position[i][0], time * origin_position[i][1] + (1 - time) * random_position[i][1], (1 - time) * random_position[i][2]);
  })
}

这部分只是用了tween的基础功能,请自行查看tween文档。

以上就是three.js 制作动态二维码的示例代码的详细内容,更多关于three.js 制作动态二维码的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js DataSet数据源处理代码
Mar 29 Javascript
js获取html页面节点方法(递归方式)
Dec 13 Javascript
js使用removeChild方法动态删除div元素
Aug 01 Javascript
动态加载js、css的简单实现代码
May 26 Javascript
用AngularJS的指令实现tabs切换效果
Aug 31 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
Sep 02 Javascript
js字符串引用的两种方式(必看)
Sep 18 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
Oct 21 Javascript
JQuery和HTML5 Canvas实现弹幕效果
Jan 04 Javascript
微信小程序canvas拖拽、截图组件功能
Sep 04 Javascript
koa2+vue实现登陆及登录状态判断
Aug 15 Javascript
vue动态绑定style样式
Apr 20 Vue.js
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
Jul 31 #Javascript
vue抽出组件并传值实例
Jul 31 #Javascript
Vue通过Blob对象实现导出Excel功能示例代码
Jul 31 #Javascript
Vue.js中使用Vuex实现组件数据共享案例
Jul 31 #Javascript
原生JS实现记忆翻牌游戏
Jul 31 #Javascript
js实现跳一跳小游戏
Jul 31 #Javascript
js实现翻牌小游戏
Jul 31 #Javascript
You might like
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
php木马webshell扫描器代码
2012/01/25 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
2018/01/21 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
python如何查看系统网络流量的信息
2016/09/12 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
《守株待兔》教学反思
2014/03/01 职场文书
学习雷锋倡议书
2014/04/15 职场文书
缅怀革命先烈演讲稿
2014/05/14 职场文书
空气的环保标语
2014/06/12 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
学生党员检讨书范文
2014/12/27 职场文书
西安事变观后感
2015/06/12 职场文书
地心历险记观后感
2015/06/15 职场文书