Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >外网爆火的“量子纠缠”前端代码已开源,抢鲜体验!

外网爆火的“量子纠缠”前端代码已开源,抢鲜体验!

作者头像
测试蔡坨坨
发布于 2023-11-27 09:21:37
发布于 2023-11-27 09:21:37
3K00
代码可运行
举报
运行总次数:0
代码可运行

“阅读本文大概需要4分钟。

前言

你好,我是测试蔡坨坨。

这两天被一段纯前端代码实现的炫酷网页版量子纠缠效果刷屏了。

原视频如下:

其作者是国外的一名程序员,也是艺术家,一经发布就一夜爆火。

作者的推文:

从视频中可以看出,当我们打开两个窗口时,两个量子之间竟然还存在相互纠缠,简直把前端代码发挥到了极致,如此奇妙的效果到底是如何实现的呢?

作者为给粉丝一个答复,开源了一个简易版本的实现效果,虽然没有原视频那么炫酷,但是基本原理应该差不多,话不多说,我们一起来看下它到底是如何实现的。

下载项目

GitHub仓库地址:https://github.com/bgstaal/multipleWindow3dScene

从项目简介中得知作者是使用three.jslocalStorage实现在同一源上跨窗口设置3D场景。

我们将项目克隆至本地:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/bgstaal/multipleWindow3dScene.git

首先看项目的目录结构,可以发现它是纯js实现的,主要文件包括:

  • index.html
  • main.js
  • WindowManager.js

启动项目

打开index.html入口文件,可以发现这里直接在根目录下给项目开个端口就能启用。

那么如何开端口呢?

推荐使用Live Server插件,在扩展商店中搜索Live Server并点击安装:

安装完成后,右下角就会出现一个Go live的按钮,点击按钮,就能给项目开启一个5500的端口:

在浏览器中访问项目127.0.0.1:5500,同时打开两个窗口,可以看到两个窗口都能感知到对方的存在:

这到底是如何实现的呢?接着我们就打开代码来一探究竟。

源码解析

index.html

首先在index.html文件中引入了一个压缩版的three.js,这个库就是用来生成网页3D模型的,也就是项目中生成旋转立方体需要用到的库。接着就是引入main.js文件,可以看出项目的主要逻辑就是在这个文件里面。

main.js
定义变量

打开main.js文件,首先是定义了一些变量,比如:把THREE库赋值给t变量;一些存放3D场景的变量;当前时间的变量,后续每个立方体旋转相同的角度也是通过这个时间来同步的:

init()项目初始化

在网页加载成功后触发onload方法,判断当前dom是否可见,可见则执行init()初始化方法:

初始化场景和渲染器

init()方法中首先是通过setupScene()函数创建场景和渲染器:

  • 先设置了一个正交相机camera,并定义相机的位置
  • 再创建场景scene对象,把相机添加到场景对象中
  • 之后就是创建renderer渲染对象和world对象,并将渲染器的dom元素添加到页面中
初始化窗口管理器

在setupWindowManager()函数中创建了一个窗口管理器实例,并初始化了窗口并添加到窗口池中:

窗口管理器就是一个名为WindowManager的类,用于管理窗口的创建、更新和删除等操作,也是最核心的实现。内部先用#号开头定义了一些私有变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#windows; // 存储所有窗口的数组
#count; // 当前窗口的数量
#id; // 当前窗口的唯一标识
#winData; // 当前窗口的数据,包括形状、自定义数据等
#winShapeChangeCallback; // 当前窗口形状发生变化时的回调函数
#winChangeCallback; // 当前窗口列表发生变化时的回调函数

再通过addEventListener()监听storage本地存储数据是否发生变化,改变就触发回调函数winChangeCallback(),刷新渲染立方体的位置:

这也是多窗口为何能感知其他窗口发生变化的原因,其实就是每添加一个新窗口,它就会计算窗口内生成的立方体的位置信息并添加到本地存储里,其他窗口监听到storage的改变就会刷新渲染立方体的位置:

我们再来看看localStorage里面到底存了哪些数据:

  • 每个窗口唯一的id标识
  • 立方体的位置和大小,包括距离屏幕左上角的x轴(window.screenLeft)、y轴位置(window.screenTop),浏览器窗口的w宽(window.innerWidth)、h高(window.innerHeight)

然后就是通过beforeunload方法监听窗口是否关闭,关闭就删除本地存储里面那个对应立方体的数据:

更新立方体位置和数量

updateNumberOfCubes()更新当前页面立方体的数量和位置,首先通过窗口管理器的getWindows()方法获取到所有立方体的数组,接着遍历这个数组,然后动态创建立方体并根据窗口位置更新其在场景中的位置:

调整窗口大小

通过resize()方法调整渲染窗口的大小,获取当前窗口的innerWidth和innerHeight,再使用window.addEventListener('resize', resize)来动态监听窗口大小的改变,在窗口大小发生改变时重新设置相机的宽高比和渲染器的大小,以适应新窗口的尺寸:

循环渲染

render()函数实现渲染:

render()方法通过获取当前时间,再计算出每个立方体每一帧的动画,并渲染到页面上:

这里还使用到了浏览器的requestAnimationFrame()方法,这个方法的作用就是在render()方法在下一次浏览器重绘之前执行,通常是每秒执行60次,以匹配大多数显示器的刷新率,起到了优化动画性能的作用:

以上就是量子纠缠源码的实现原理,想要了解更多源码内容,自己去GitHub下载吧,拜了个拜~

以上,完。

脚踏实地,仰望星空,和坨坨一起学习软件测试,升职加薪!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试蔡坨坨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2023年08月 Three.js专题-基本概念和使用
Three.js是一个用于创建和呈现3D图形的JavaScript库。它提供了一组易于使用的工具和API,使得开发人员可以轻松地在Web应用程序中创建复杂的3D场景和动画。Three.js可以与其他JavaScript库和框架一起使用,如jQuery和React等。它是一个开源项目,有一个活跃的社区在支持和扩展它。
愚公搬代码
2025/05/28
950
【愚公系列】2023年08月 Three.js专题-基本概念和使用
【愚公系列】2023年08月 Three.js专题-几何体
几何体是指由点、线、面所构成的空间实体。其中,点、线、面是几何体的基本元素,几何体包括球体、立方体、圆锥体、圆柱体、棱柱、棱锥、棱台等。这些几何体都有自己的特定形状和特征,可以应用于各种数学、物理和工程领域。
愚公搬代码
2025/05/28
610
【愚公系列】2023年08月 Three.js专题-几何体
【愚公系列】2023年08月 Three.js专题-场景
场景是指某个特定环境中出现的情景、事件和人物。它通常指现实生活中的某种情境或虚构世界中的场景,如戏剧、电影、小说、游戏等。在不同的领域和文化中,场景的概念和应用也不尽相同。在设计与艺术领域中,场景指的是特定的环境或氛围,如展示场所、街头表演、舞台设计等;在市场营销中,场景通常指的是一个为特定产品或服务所设计的环境和情境,以便引起消费者的积极反应和购买欲望。
愚公搬代码
2025/05/28
600
【愚公系列】2023年08月 Three.js专题-场景
【愚公系列】2023年08月 Three.js专题-材质
材质是指制造物品所使用的原料或物质的种类,常见的材质包括金属、塑料、木材、玻璃、石头等。材质的选择取决于所制造物品的用途、设计和预算等因素。不同的材质有不同的特点和优缺点,如金属通常较为坚固,但较重且易锈蚀;塑料轻便且不易损坏,但耐久性较差。材质也会影响制造物品的外观和质感,如木材可以赋予物品自然美感,而玻璃则可以营造现代感。
愚公搬代码
2025/05/28
600
【愚公系列】2023年08月 Three.js专题-材质
前端量子纠缠源码公布!效果炸裂!
最近,程序员群里流行一个比较火的一个视频,尤其是很多前端程序员都不由的赞叹此视频。视频内容是一个完全由前端完成的类似"量子纠缠"效果的项目。看完之后很多人表示前端白学了。原视频如下,作者为nonfigurativ。想象一下,当你在多个显示器前操作,每个显示器就像是一个窗口,通过这些窗口你可以观察到同一个3D场景的不同部分,而这一切都实现了无缝连接。这不仅仅是技术上的创新,更是用户体验上的大跃进!
希里安
2023/11/28
1.2K0
前端量子纠缠源码公布!效果炸裂!
Three.js 实现 360 度全景浏览的最简单方式
一般我们拍照都是拍一个方向,而全景图是拍上下左右前后 6 个方向,360 度,这样能够立体的记录所在的场景。
神说要有光zxg
2021/12/04
4.9K0
Three.js 实现 360 度全景浏览的最简单方式
全网最火爆的 "量子纠缠" 网页版
纯前端实现的量子纠缠效果视频在网络上迅速传播开来。视频中,作者在两个窗口中打开了相同的网页,然后在两个窗口中同时移动鼠标。
Tinywan
2023/11/28
1.3K0
全网最火爆的 "量子纠缠" 网页版
【愚公系列】2023年08月 Three.js专题-相机
相机是一种用来记录图像或视频的设备。现代相机通常由镜头、图像传感器、取景器、快门和图像处理器等部件组成。相机可以拍摄各种类型的照片,包括家庭照片、肖像照片、风景照片、动物照片和艺术照片等。现在,许多相机还具有额外的功能,例如视频录制、自动对焦和无线连接等。随着技术的发展,相机变得更加便携和高质量,已成为记录和分享生活的重要工具。
愚公搬代码
2025/05/28
800
【愚公系列】2023年08月 Three.js专题-相机
使用Three.js构建基础3D场景 | 《Three.js零基础直通03》
这是我们开始使用Three.js的第一个小节,我们回顾一下用Web开发最经典的方式来使用它,一个<script>标签。
大帅老猿
2022/06/06
5.9K0
使用Three.js构建基础3D场景 | 《Three.js零基础直通03》
three.js 新手指南
在这个分步指南中,我们将使用一个基于 WebGL 的 3D 图形的框架 three.js, 创建一个 3D 版本的 Treehouse 徽标。你可以通过点击或者拖拽鼠标使相机旋转!你也可以使用鼠标滚轮进行缩放。
疯狂的技术宅
2019/03/27
8.2K0
three.js 新手指南
Hello,Three.js | 快速开始
由于Three.js官网位于国外,访问速度较慢,因此,为了方便开发者经常参考文档和示例,我们可以考虑将Three.js官网部署到本地。这样,可以在本地快速访问文档和示例,提高工作效率。
不惑
2024/04/22
3350
Hello,Three.js | 快速开始
第1章 开启Threejs之旅(二)
为了方便实验,我们提供了2个简单的框架供你使用。你只要改变其中的一些代码或者参数,就能够得到实验的结果。第一个框架的效果是显示一个绿色的正方体,
webvrmodel模型网
2022/05/14
1.4K0
第1章 开启Threejs之旅(二)
『Three.js』起飞!
我习惯使用 vs code 编写前端代码,如果是用原生三件套学习,我还会使用 Live Server 插件辅助开发。
德育处主任
2022/09/23
11K0
『Three.js』起飞!
使用Three.js渲染器创建炫酷3D场景
在当今数字化的时代,3D图形技术正以其独特的魅力在各个领域掀起波澜。从影视制作到游戏开发,从虚拟现实到网页交互,3D场景以其强烈的视觉冲击力和沉浸式的体验,成为了吸引用户、传达信息的重要手段。而Three.js,作为一款功能强大且广受欢迎的JavaScript 3D库,为我们提供了便捷、高效的途径来创建令人炫目的3D场景。本文将深入探讨使用Three.js渲染器创建炫酷3D场景的方方面面,带领读者领略这一领域的无限可能。
Front_Yue
2025/03/14
2900
使用Three.js渲染器创建炫酷3D场景
web网站使用three.js来绘制三维图形
最近项目中在地图中显示三维河床的功能,最终实现是用three.js来实现绘制的。这里记录一下整体的调用过程。
china马斯克
2024/08/05
5700
『Three.js』几个简单的入门动画(新手篇)
如果对上面的代码还不太理解,可以先看看 《『Three.js』起飞!》 ,坐标轴方面可以看看 《『Three.js』辅助坐标轴》 。
德育处主任
2022/09/09
2.7K0
『Three.js』几个简单的入门动画(新手篇)
深入分析:GitHub Trending 项目 "multipleWindow3dScene" - plus studio
这是由chatGPT生成的文章,内容是关于GitHub Trending 项目 "multipleWindow3dScene"的深入分析,分享链接ChatGPT
plus sign
2024/02/29
2540
Threejs入门之二:引用Threejs并创建第一个3D图形
1.新建一个文件夹,命名为threejs_demo,在该文件夹下新建一个lib文件夹,将前面下载的threejs源码中的build文件夹中的three.module.js文件拷贝到lib文件夹下 2.用vscode打开新建的文件夹,在根目录下新建一个index.html文件和一个index.js文件 3.在index.html中引入threejs,方式如下:
九仞山
2023/04/30
2.1K1
Threejs入门之二:引用Threejs并创建第一个3D图形
【Three.js基础】创建场景、渲染场景、创建轨道控制器
WebGL(Web Graphics Library)是一种 JavaScript API,用于在任何兼容的 Web 浏览器中呈现交互式 3D 和 2D 图形,不需要插件,即专门处理计算或处理3D图像的JS API。
不叫猫先生
2023/11/14
5490
【Three.js基础】创建场景、渲染场景、创建轨道控制器
一个简单的案例,理解threejs中几个基本概念
种种原因吧,需要在和大伙分享Elasticsearch的间隙,也来分享一下threejs的一些用法。有一个小小愿望,希望这个threejs教程最终也能成一个系列。 随着浏览器性能的不断提升,以及对webgl的支持,在浏览器上展示3d模型早已不是痴人说梦,不过如果使用原生的webgl的话,开发起来难度还是略大,一个常见的解决方案就是使用threejs,这是一个封装的库,使用它我们可以更好的在网页上实现3d效果,threejs地址为https://github.com/mrdoob/three.js。
江南一点雨
2018/12/21
2.1K0
一个简单的案例,理解threejs中几个基本概念
推荐阅读
相关推荐
【愚公系列】2023年08月 Three.js专题-基本概念和使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验