最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

three.js 制作動態(tài)二維碼的示例代碼

 更新時間:2020年07月31日 15:14:59   作者:郭先生  
這篇文章主要介紹了three.js 制作動態(tài)二維碼的示例代碼,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

今天郭先生說一下用canvas解析圖片流,然后制作一個動態(tài)二維碼的小案例,話不多說先上圖,這是郭先生的微信二維碼哦!

1. 解析圖片流

canvas = document.createElement('canvas');//創(chuàng)建canvas畫布
content = canvas.getContext('2d');//獲取畫布的上下文
canvas.width = 310;//設(shè)置尺寸
canvas.height = 310;
img = new Image();//創(chuàng)建一張圖片
img.src = require("../assets/images/base/wechat.png");//設(shè)置圖片地址
img.onload = () => {
    //在圖片加載后
  content.drawImage(img, 0, 0, canvas.width, canvas.height);//將圖片添加到畫布,并設(shè)置寬高
  imgData = content.getImageData(0, 0, canvas.width, canvas.height).data;//獲取畫布數(shù)據(jù)
};

imgData是什么樣的呢?如下圖

這是一個Uint8ClampedArray的類型化數(shù)組,這個數(shù)組出現(xiàn)最多的也是在imgData上。它會將負(fù)數(shù)歸入0,大于255的數(shù)歸入255,所以取模就不用了。我們再來看這個數(shù)組的長度是384400是怎么來的呢?因為我們設(shè)置了畫布長寬為310,而imgData四位代表一個rgba像素點(diǎn),也就是imgData[0]是紅色通道,imgData[1]是綠色通道,imgData[2]是藍(lán)色通道,imgData[3]是透明通道…依次循環(huán),所以310 * 310 * 4 = 384400。

2. 處理像素點(diǎn),畫出二維碼

for (var i = 0; i < 31 * 31; i++) {
    //random_position為各個小平面塊打亂時的位置信息,我設(shè)置小平面一共有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設(shè)置成310個數(shù)組
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)//每個數(shù)組有310項,每項的值為'light'或者'black'
  }
}
var color1 = [];//設(shè)置color1為小平面顏色數(shù)組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的循環(huán)
  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);//小方塊網(wǎng)格
    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]);//先將小方塊的位置設(shè)置成打亂的位置,便于動畫播放。
    mesh.name = 'plane';
    group.add(mesh);//將所有小平面放到數(shù)組,便于操作。
  }
}
scene.add(group);

這部分代碼主要是計算部分,沒什么技術(shù)含量。

3. 實(shí)現(xiàn)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的基礎(chǔ)功能,請自行查看tween文檔。

以上就是three.js 制作動態(tài)二維碼的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于three.js 制作動態(tài)二維碼的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • php,js,css字符串截取的辦法集錦

    php,js,css字符串截取的辦法集錦

    這篇文章主要介紹了php,js,css字符串截取的辦法,其實(shí)沒有什么技術(shù)含量,就是記錄一下,方便自己復(fù)習(xí)鞏固,希望對大家能有所幫助
    2014-09-09
  • js添加千分位的實(shí)現(xiàn)代碼(超簡單)

    js添加千分位的實(shí)現(xiàn)代碼(超簡單)

    下面小編就為大家?guī)硪黄猨s添加千分位的實(shí)現(xiàn)代碼(超簡單)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • JavaScript必知必會(三) String .的方法來自何方

    JavaScript必知必會(三) String .的方法來自何方

    這篇文章主要介紹了JavaScript必知必會(三) String .的方法來自何方的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • JavaScript中的null和undefined解析

    JavaScript中的null和undefined解析

    在JavaScript開發(fā)中,被人問到:null與undefined到底有啥區(qū)別? 一時間不好回答,特別是undefined,因為這涉及到undefined的實(shí)現(xiàn)原理
    2012-04-04
  • js中的屏蔽的使用示例

    js中的屏蔽的使用示例

    本文為大家介紹下js中的屏蔽的應(yīng)用;屏蔽網(wǎng)頁內(nèi)容選中、剪切、復(fù)制及拷屏總之你能想象的應(yīng)該都有,感興趣的朋友可以參考下,希望對大家學(xué)習(xí)js有所幫助
    2013-07-07
  • JavaScript輕松創(chuàng)建級聯(lián)函數(shù)的方法示例

    JavaScript輕松創(chuàng)建級聯(lián)函數(shù)的方法示例

    級聯(lián)函數(shù)也叫鏈?zhǔn)胶瘮?shù),方法鏈一般適合對一個對象進(jìn)行連續(xù)操作 (集中在一句代碼)。一定程度上可以減少代碼量,缺點(diǎn)是它占用了 函數(shù)的返回值。下面這篇文章主要給大家介紹了利用JavaScript如何輕松創(chuàng)建級聯(lián)函數(shù)的方法示例,需要的朋友可以參考借鑒。
    2017-02-02
  • 一看就懂的i++和++i示例代碼詳解

    一看就懂的i++和++i示例代碼詳解

    這篇文章主要介紹了i++和++i區(qū)別詳解,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • document.body.scrollTop 值總為0的解決方法 比較常見的標(biāo)準(zhǔn)問題

    document.body.scrollTop 值總為0的解決方法 比較常見的標(biāo)準(zhǔn)問題

    頁面具有 DTD(或者說指定了 DOCTYPE)時,使用 document.documentElement。
    2009-11-11
  • JavaScript變量中var,let和const的區(qū)別

    JavaScript變量中var,let和const的區(qū)別

    這篇文章主要介紹了JavaScript變量中var,let和const的區(qū)別,JavaScript中一共有3種用來聲明變量的關(guān)鍵字,分別是var、let和const,文章通過圍繞主題展開對三個關(guān)鍵詞的詳細(xì)介紹,需要的朋友可以參考一下
    2022-09-09
  • 用js生成a標(biāo)簽下載文件并攜帶請求頭的兩種方法

    用js生成a標(biāo)簽下載文件并攜帶請求頭的兩種方法

    這篇文章主要給大家介紹了關(guān)于用js生成a標(biāo)簽下載文件并攜帶請求頭的兩種方法, 這種下載文件方式在前端項目中非常常見,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03

最新評論

讷河市| 财经| 玛纳斯县| 桐庐县| 孝感市| 曲靖市| 永川市| 衢州市| 清新县| 乌兰浩特市| 周口市| 调兵山市| 东丰县| 福安市| 凉山| 栾川县| 呼和浩特市| 大安市| 武城县| 综艺| 纳雍县| 卢湾区| 闵行区| 井冈山市| 隆安县| 永宁县| 观塘区| 郯城县| 綦江县| 谷城县| 临沭县| 响水县| 周宁县| 太仓市| 常熟市| 镇安县| 碌曲县| 南投市| 循化| 苍溪县| 浦城县|