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 相关文章推荐
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
Feb 01 Javascript
jQuery动画效果实现图片无缝连续滚动
Jan 12 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 Javascript
Jquery EasyUI $.Parser
Jun 02 jQuery
jQuery实现节点的追加、替换、删除、复制功能示例
Jul 11 jQuery
使用JavaScript开发跨平台的桌面应用详解
Jul 27 Javascript
使用JS模拟锚点跳转的实例
Feb 01 Javascript
原生JS实现瀑布流插件
Feb 06 Javascript
一步一步实现Vue的响应式(对象观测)
Sep 02 Javascript
webpack 处理CSS资源的实现
Sep 27 Javascript
vue-autoui自匹配webapi的UI控件的实现
Mar 20 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 Hex RGB颜色值互换的使用
2013/05/10 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
Angular实现form自动布局
2016/01/28 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
python使用matplotlib绘制折线图教程
2017/02/08 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
详解python中的lambda与sorted函数
2020/09/04 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
表扬信格式
2014/01/12 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
活动总结报告怎么写
2014/07/03 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
小学生学习保证书
2015/02/26 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书