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 相关文章推荐
jquery json 实例代码
Dec 02 Javascript
php对mongodb的扩展(初识如故)
Nov 11 Javascript
js监听滚动条滚动事件使得某个标签内容始终位于同一位置
Jan 24 Javascript
js中unicode转码方法详解
Oct 09 Javascript
JavaScript获取当前cpu使用率的方法
Dec 15 Javascript
谈谈我对JavaScript DOM事件的理解
Dec 18 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
Dec 28 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
Feb 04 Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 Javascript
vue实现输入框自动跳转功能
May 20 Javascript
谈谈node.js中的模块系统
Sep 01 Javascript
关于对TypeScript泛型参数的默认值理解
Jul 15 Javascript
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
php 字符串函数收集
2010/03/29 PHP
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
js跨域请求的5中解决方式
2015/07/02 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
详解JavaScript的变量
2019/04/04 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
简单介绍Python中的round()方法
2015/05/15 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
python实现黑客字幕雨效果
2018/06/21 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
Ajax请求总共有多少种Callback
2016/07/17 面试题
PyQt QMainWindow的使用示例
2021/03/24 Python
自荐信的五个重要部分
2013/10/29 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
师范生自我鉴定
2014/03/20 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
通用员工手册范本
2015/05/14 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS