博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#情人节专题#利用Three.js实现一个记录两个人走过岁月的点点滴滴的idea
阅读量:7025 次
发布时间:2019-06-28

本文共 5202 字,大约阅读时间需要 17 分钟。

前言

碰巧我们在一起两周年,花了两天码了一个走心的礼物,于是就有了这个小项目的来源

首先看下效果图---一个音乐播放,带图片切换的时间记录器

如果觉得不错的话,您可以点右上角 "Star" 支持一下 谢谢! ^_^

技术实现

  • 雪花飘落效果实现

    1.把五张图片充当雪花,然后three.js3D库 + 定时 营造出雪花飘落的效果,大致代码如下:

    function init() {    camera = new THREE.PerspectiveCamera(75, containerWidth / containerHeight, 1, 10000);    camera.position.z = 1000;    scene = new THREE.Scene();    scene.add(camera);    renderer = new THREE.CanvasRenderer();    renderer.setSize(containerWidth, containerHeight);    for (var i = 0; i < snowNum; i++) {      var material = new THREE.ParticleBasicMaterial({        map: new THREE.Texture(particleImages[i % 5])      });      particle = new Particle3D(material);      particle.position.x = Math.random() * 2000 - 1000;      particle.position.y = Math.random() * 2000 - 1000;      particle.position.z = Math.random() * 2000 - 1000;      particle.scale.x = particle.scale.y = 1;      scene.add(particle);      particles.push(particle)    }    container.appendChild(renderer.domElement);    document.addEventListener("mousemove", onDocumentMouseMove, false);    document.addEventListener("touchstart", onDocumentTouchStart, false);    document.addEventListener("touchmove", onDocumentTouchMove, false);    setInterval(loop, 1000 / 50)  }复制代码
  • 倒计时

    1.这个不用多说,给一个起初时间和当前时间对比,然后操作对应的dom元素,然后控制title

    countTime('2017/02/12 00:00', 'day', 'hour', 'minute', 'second');var days = parseInt($('#day').text());var years = new Date().getFullYear();var month = new Date().getMonth() + 1;var dateDay = new Date().getDate();复制代码
  • 图片,描述文字的切换

    1.为了避免图片过多同时加载缓慢问题--这里js设置一个图片列表和对应两个图片描述两个变量,同时为了保证图片加载出来才切换图片描述文字,用到了img的load事件函数

    curImgDom.src = imgList[imgIndex];  // curImgDom.setAttribute('src', imgList[imgIndex]);  if (isInitImage) {      $('.img-intro').text(imgDescList[imgIndex]);      return;  }else {      // curImgDom.src = imgList[imgIndex];      if (curImgDom.complete) {          $('.img-intro').text(imgDescList[imgIndex]);          return false;      }      curImgDom.onload = function () {          $('.img-intro').text(imgDescList[imgIndex]);      };  }复制代码
  • 音频播放

    1. 里音频设置自动,循环播放,点击图标暂停,播放切换。这里监听了audio的play,canplaythrough(保证音频加载完毕)事件,这里值得注意一点是,audio的play()方法执行后返回来的promise对象,用来判断是否成功执行(播放),可以根据这个promise控制音乐?图标的旋转or停止状态,大致代码如下:
    audioDom.addEventListener('canplaythrough', function () {      try {          // chrome浏览器没有也页面交互(点击,滚动)之前会报错误---Uncaught(in promise)DOMException:play()          //处理方法设置浏览器autoplay-policy---https://blog.csdn.net/super_XYQ/article/details/83026792          var promise = audioDom.play();          if (promise !== undefined) {              promise.then(function () {                  musicCloseDom.classList.add('rotate');              }).catch(function () {                  musicCloseDom.classList.remove('rotate');              });          }      } catch (error) {          console.log('error', error);      }  }, false);复制代码
  • 设置Open graph(从浏览器分享到社交网络配置)

    代码如下

    复制代码

其他(python辅助)

  1. 这里用到了python脚本生成艺术二维码

    version, level, qr_name = myqr.run(	'https://jackluson.github.io/to-lover-demo/',	# 'https://jackluson.github.io/to-lover/',    version=1,    level='H',    picture='pic-icon.png',    colorized=True,    contrast=1.0,    brightness=1.0,    save_name='ip_jackLu.png',    save_dir=os.getcwd())复制代码
  2. 还有利用python压缩图片,与剪切音频,避免文件过大

    from glob import globfrom PIL import Imageimport pyperclipsource_dir = 'origin_images'target_dir = 'images'threshold = 1.5*1024*1024if not os.path.exists(target_dir):    os.makedirs(target_dir)filenames = glob('{}/*.[jp]*'.format(source_dir))# print(','.join(filenames))strFileNames = ''for i,filename  in enumerate(filenames):  # 拼接文件名字符串  strFileNames = strFileNames +  '"' + filename +'",'  filesize = os.path.getsize(filename)  output_filename = filename.replace(source_dir, target_dir)  # output_filename = time.strftime("%Y-%m-%d", time.localtime()) + '000' + str(i) + '.png';  print('output_filename:',output_filename)  if filesize >= threshold:    print(filename)    with Image.open(filename) as im:      width, height = im.size      new_width = width // 2      new_height = int(new_width * height * 1.0 / width)      print('adjusted size:', new_width, new_height)      resized_im = im.resize((new_width, new_height))      resized_im.save(output_filename)  else:    with Image.open(filename) as im:      im.save(output_filename)# 字符串复制到剪切板strFileNames = strFileNames.replace(source_dir + '\\', './' + target_dir + '/')print(strFileNames[0:-1]);pyperclip.copy(strFileNames[0:-1]);spam = pyperclip.paste()# 剪切音频from pydub import AudioSegmentfile_name = "./media/zui-mei-qing-lv.mp3"sound = AudioSegment.from_mp3(file_name)start_time = "0:08"stop_time = "1:37"print ("time:",start_time,"~",stop_time)start_time = (int(start_time.split(':')[0])*60+int(start_time.split(':')[1]))*1000stop_time = (int(stop_time.split(':')[0])*60+int(stop_time.split(':')[1]))*1000print("ms:",start_time,"~",stop_time)word = sound[start_time:stop_time]# save_name = "xiaye-and-anlian.mp3-"+file_name[6:]save_name = "./media/zui-mei-qing-lv-cut.mp3"print (save_name)word.export(save_name, format="mp3",tags={
    'artist': 'AppLeU0', 'album': save_name[:-4]})复制代码

最后

其他不啰嗦了,: 有问题多谢能够指出!

转载于:https://juejin.im/post/5c65307b518825622014058f

你可能感兴趣的文章
Nginx 安装
查看>>
hidesBottomBarWhenPushed 设置为NO的问题
查看>>
oracle怎样查询索引的使用情况
查看>>
select option 下拉多选单选bootstrap插件使用总结2
查看>>
alipay.trade.refund (统一收单交易退款接口)[支付宝退款]
查看>>
cisco常用命令详解
查看>>
2013多校训练赛第二场 总结
查看>>
puppeteer UI自动化测试demo(一)
查看>>
week0713.5 newspaper 安装问题
查看>>
【转】关于大型网站技术演进的思考(十五)--网站静态化处理—前后端分离—中(7)...
查看>>
小白学习之Code First(二)
查看>>
谁在追踪谁?
查看>>
HTTP请求返回状态码详解
查看>>
句柄类
查看>>
GitLab
查看>>
MySQL安装部署
查看>>
m6-第10周作业
查看>>
Salesforce Apex学习 : 利用Schema命名空间中的DescribeSObjectResult类型来获取sObject对象的基本信息...
查看>>
沃通SSL证书支持最新顶级域名
查看>>
网站建设流程图
查看>>