我用WebGL打造了一款动态壁纸

发布时间 2023-07-29 17:37:45作者: 米大饭

我用WebGL打造了一款动态壁纸

简述

最近在给自己电脑换壁纸的时候发现了一张很有特点的图(就是下面这张),于是我突发奇想,要是能把这张图变成一张动态的壁纸。那该多好。于是我打算用threejs开发一个3D的动态壁纸网页。

相关技术

Vite+Vue、Threejs、TwinSpace(我自己基于Threejs封装的一个工具库)

制作步骤,流程

先参照壁纸绘制一张图,记住一定要分图层

然后将图层依次导出(记住是PNG)

接着我们创建Vue项目
npm create vite@latest SmartClock -- --template vue

创建一个绘制的图层,在网页上创建几个方块,

然后将刚刚导出的图,依次贴在方块上,然后绘制完成

这样呢,我们的一个基本样式就绘制完成了。接着呢
我们得能让他动起来,这边我们在代码中添加相关的获取时间更新的方法

  //计算时间更新
  const clockUpdate = () => {
    // 创建一个 Date 对象实例,它将自动设置为当前时间
    const now = new Date();
    // 获取当前的小时(0 到 23)
    const hours = now.getHours();
    hour.rotation.z = -Math.PI * 2 * (hours / 12);
    // 获取当前的分钟(0 到 59)
    const minutes = now.getMinutes();
    min.rotation.z = -Math.PI * 2 * (minutes / 60);
    // 获取当前的秒钟(0 到 59)
    const seconds = now.getSeconds();
    sec.rotation.z = -Math.PI * 2 * (seconds / 60);
  };

然后定时更新。
这样呢,时钟就可以自动更新了。
接着呢,我们还需要创建相应的动画。

  let num = 0;
  let way = 1;
  // let scale = 0;
  //更新转圈圈动画
  const updateAnimate = (delta) => {
    num += 1 * way;
    if (Math.abs(num) == 100) {
      way = -way;
    }

    circle1.rotation.z -= Math.sin(num / 1000) * 0.5;
    circle2.rotation.z += Math.sin(num / 1000) * Math.cos(num / 100) * 2;
    circle3.rotation.z += Math.sin(num / 2000) * 2;
    circle4.rotation.z -= Math.sin(num / 1000);
    circle5.rotation.z += Math.sin(num / 500) * 0.1;
  };

然后添加一下屏幕的鼠标位置监听就可以了,
这样一款网页动态可视化时钟就做完了。

网页效果地址

紧接着我们把web项目部署到网页上就可以了。
在线效果地址:https://sobigrice.gitee.io/smartClock

如何把网页设置成壁纸呢

众所周知MacOS/Window是没办法直接将网页设置成壁纸的。这里我们就需要用到第三方软件来设置
Mac: Plash
window: lively wallpaper / wallPaperEngine

成品

后续计划

目前这个项目我已经开源了,开源地址:https://gitee.com/soBigRice/smart-clock
后续我打算利用electron和ReactNative打造成一款多平台的壁纸时钟。。。
大家有什么想法和意见欢迎留言一起相互交流。
敬请期待