three.js 制作3D相册

article/2025/10/12 12:36:59

效果图:
由于博客限制了图片大小,动画质量不太好,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在线效果:
https://static-mp-df787464-d77c-4180-83c3-6e7add40073e.next.bspapp.com/

参考了three.js 官方代码

<!-- 源码下载地址  https://pan.baidu.com/s/1AVB71AjEX06wpc4wbcV_tQ?pwd=l9zp --><!DOCTYPE html>
<html><head><title>three.js css3d - periodic table</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><style>html, body {height: 100%;}body {background-color: #000000;margin: 0;font-family: Helvetica, sans-serif;;overflow: hidden;}a {color: #ffffff;}#info {position: absolute;width: 100%;color: #ffffff;padding: 5px;font-family: Monospace;font-size: 13px;font-weight: bold;text-align: center;z-index: 1;}#menu {position: absolute;bottom: 20px;width: 100%;text-align: center;}.element {width: 120px;height: 160px;box-shadow: 0px 0px 12px rgba(0,255,255,0.5);border: 1px solid rgba(127,255,255,0.25);text-align: center;cursor: default;}.element:hover {box-shadow: 0px 0px 12px rgba(0,255,255,0.75);border: 1px solid rgba(127,255,255,0.75);}.element .number {position: absolute;top: 20px;right: 20px;font-size: 12px;color: rgba(127,255,255,0.75);}.element .symbol {position: absolute;top: 40px;left: 0px;right: 0px;font-size: 60px;font-weight: bold;color: rgba(255,255,255,0.75);text-shadow: 0 0 10px rgba(0,255,255,0.95);}.element .details {position: absolute;bottom: 15px;left: 0px;right: 0px;font-size: 12px;color: rgba(127,255,255,0.75);}button {color: rgba(127,255,255,0.75);background: transparent;outline: 1px solid rgba(127,255,255,0.75);border: 0px;padding: 5px 10px;cursor: pointer;}button:hover {background-color: rgba(0,255,255,0.5);}button:active {color: #000000;background-color: rgba(0,255,255,0.75);}</style></head><body><script src="../build/three.js"></script><script src="js/libs/tween.min.js"></script><script src="js/controls/TrackballControls.js"></script><script src="js/renderers/CSS3DRenderer.js"></script><div id="info"><a href="http://threejs.org" target="_blank" rel="noopener">three.js css3d</a> - periodic table. <a href="https://plus.google.com/113862800338869870683/posts/QcFk5HrWran" target="_blank" rel="noopener">info</a>.</div><div id="container"></div><div id="menu"><button id="table">TABLE</button><button id="sphere">SPHERE</button><button id="helix">HELIX</button><button id="grid">GRID</button></div><script>var table = ["H", "Hydrogen", "1.00794", 1, 1,"He", "Helium", "4.002602", 18, 1,"Li", "Lithium", "6.941", 1, 2,"Be", "Beryllium", "9.012182", 2, 2,"B", "Boron", "10.811", 13, 2,"C", "Carbon", "12.0107", 14, 2,"N", "Nitrogen", "14.0067", 15, 2,"O", "Oxygen", "15.9994", 16, 2,"F", "Fluorine", "18.9984032", 17, 2,"Ne", "Neon", "20.1797", 18, 2,"Na", "Sodium", "22.98976...", 1, 3,"Mg", "Magnesium", "24.305", 2, 3,"Al", "Aluminium", "26.9815386", 13, 3,"Si", "Silicon", "28.0855", 14, 3,"P", "Phosphorus", "30.973762", 15, 3,"S", "Sulfur", "32.065", 16, 3,"Cl", "Chlorine", "35.453", 17, 3,"Ar", "Argon", "39.948", 18, 3,"K", "Potassium", "39.948", 1, 4,"Ca", "Calcium", "40.078", 2, 4,"Sc", "Scandium", "44.955912", 3, 4,"Ti", "Titanium", "47.867", 4, 4,"V", "Vanadium", "50.9415", 5, 4,"Cr", "Chromium", "51.9961", 6, 4,"Mn", "Manganese", "54.938045", 7, 4,"Fe", "Iron", "55.845", 8, 4,"Co", "Cobalt", "58.933195", 9, 4,"Ni", "Nickel", "58.6934", 10, 4,"Cu", "Copper", "63.546", 11, 4,"Zn", "Zinc", "65.38", 12, 4,"Ga", "Gallium", "69.723", 13, 4,"Ge", "Germanium", "72.63", 14, 4,"As", "Arsenic", "74.9216", 15, 4,"Se", "Selenium", "78.96", 16, 4,"Br", "Bromine", "79.904", 17, 4,"Kr", "Krypton", "83.798", 18, 4,"Rb", "Rubidium", "85.4678", 1, 5,"Sr", "Strontium", "87.62", 2, 5,"Y", "Yttrium", "88.90585", 3, 5,"Zr", "Zirconium", "91.224", 4, 5,"Nb", "Niobium", "92.90628", 5, 5,"Mo", "Molybdenum", "95.96", 6, 5,"Tc", "Technetium", "(98)", 7, 5,"Ru", "Ruthenium", "101.07", 8, 5,"Rh", "Rhodium", "102.9055", 9, 5,"Pd", "Palladium", "106.42", 10, 5,"Ag", "Silver", "107.8682", 11, 5,"Cd", "Cadmium", "112.411", 12, 5,"In", "Indium", "114.818", 13, 5,"Sn", "Tin", "118.71", 14, 5,"Sb", "Antimony", "121.76", 15, 5,"Te", "Tellurium", "127.6", 16, 5,"I", "Iodine", "126.90447", 17, 5,"Xe", "Xenon", "131.293", 18, 5,"Cs", "Caesium", "132.9054", 1, 6,"Ba", "Barium", "132.9054", 2, 6,"La", "Lanthanum", "138.90547", 4, 9,"Ce", "Cerium", "140.116", 5, 9,"Pr", "Praseodymium", "140.90765", 6, 9,"Nd", "Neodymium", "144.242", 7, 9,"Pm", "Promethium", "(145)", 8, 9,"Sm", "Samarium", "150.36", 9, 9,"Eu", "Europium", "151.964", 10, 9,"Gd", "Gadolinium", "157.25", 11, 9,"Tb", "Terbium", "158.92535", 12, 9,"Dy", "Dysprosium", "162.5", 13, 9,"Ho", "Holmium", "164.93032", 14, 9,"Er", "Erbium", "167.259", 15, 9,"Tm", "Thulium", "168.93421", 16, 9,"Yb", "Ytterbium", "173.054", 17, 9,"Lu", "Lutetium", "174.9668", 18, 9,"Hf", "Hafnium", "178.49", 4, 6,"Ta", "Tantalum", "180.94788", 5, 6,"W", "Tungsten", "183.84", 6, 6,"Re", "Rhenium", "186.207", 7, 6,"Os", "Osmium", "190.23", 8, 6,"Ir", "Iridium", "192.217", 9, 6,"Pt", "Platinum", "195.084", 10, 6,"Au", "Gold", "196.966569", 11, 6,"Hg", "Mercury", "200.59", 12, 6,"Tl", "Thallium", "204.3833", 13, 6,"Pb", "Lead", "207.2", 14, 6,"Bi", "Bismuth", "208.9804", 15, 6,"Po", "Polonium", "(209)", 16, 6,"At", "Astatine", "(210)", 17, 6,"Rn", "Radon", "(222)", 18, 6,"Fr", "Francium", "(223)", 1, 7,"Ra", "Radium", "(226)", 2, 7,"Ac", "Actinium", "(227)", 4, 10,"Th", "Thorium", "232.03806", 5, 10,"Pa", "Protactinium", "231.0588", 6, 10,"U", "Uranium", "238.02891", 7, 10,"Np", "Neptunium", "(237)", 8, 10,"Pu", "Plutonium", "(244)", 9, 10,"Am", "Americium", "(243)", 10, 10,"Cm", "Curium", "(247)", 11, 10,"Bk", "Berkelium", "(247)", 12, 10,"Cf", "Californium", "(251)", 13, 10,"Es", "Einstenium", "(252)", 14, 10,"Fm", "Fermium", "(257)", 15, 10,"Md", "Mendelevium", "(258)", 16, 10,"No", "Nobelium", "(259)", 17, 10,"Lr", "Lawrencium", "(262)", 18, 10,"Rf", "Rutherfordium", "(267)", 4, 7,"Db", "Dubnium", "(268)", 5, 7,"Sg", "Seaborgium", "(271)", 6, 7,"Bh", "Bohrium", "(272)", 7, 7,"Hs", "Hassium", "(270)", 8, 7,"Mt", "Meitnerium", "(276)", 9, 7,"Ds", "Darmstadium", "(281)", 10, 7,"Rg", "Roentgenium", "(280)", 11, 7,"Cn", "Copernicium", "(285)", 12, 7,"Nh", "Nihonium", "(286)", 13, 7,"Fl", "Flerovium", "(289)", 14, 7,"Mc", "Moscovium", "(290)", 15, 7,"Lv", "Livermorium", "(293)", 16, 7,"Ts", "Tennessine", "(294)", 17, 7,"Og", "Oganesson", "(294)", 18, 7];var camera, scene, renderer;var controls;var objects = [];var targets = { table: [], sphere: [], helix: [], grid: [] };init();animate();function init() {camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 10000 );camera.position.z = 3000;scene = new THREE.Scene();// tablefor ( var i = 0; i < table.length; i += 5 ) {var element = document.createElement( 'div' );element.className = 'element';element.style.backgroundColor = 'rgba(0,127,127,' + ( Math.random() * 0.5 + 0.25 ) + ')';var number = document.createElement( 'div' );number.className = 'number';number.textContent = (i/5) + 1;element.appendChild( number );var symbol = document.createElement( 'div' );symbol.className = 'symbol';symbol.textContent = table[ i ];element.appendChild( symbol );var details = document.createElement( 'div' );details.className = 'details';details.innerHTML = table[ i + 1 ] + '<br>' + table[ i + 2 ];element.appendChild( details );var object = new THREE.CSS3DObject( element );object.position.x = Math.random() * 4000 - 2000;object.position.y = Math.random() * 4000 - 2000;object.position.z = Math.random() * 4000 - 2000;scene.add( object );objects.push( object );//var object = new THREE.Object3D();object.position.x = ( table[ i + 3 ] * 140 ) - 1330;object.position.y = - ( table[ i + 4 ] * 180 ) + 990;targets.table.push( object );}// spherevar vector = new THREE.Vector3();var spherical = new THREE.Spherical();for ( var i = 0, l = objects.length; i < l; i ++ ) {var phi = Math.acos( -1 + ( 2 * i ) / l );var theta = Math.sqrt( l * Math.PI ) * phi;var object = new THREE.Object3D();spherical.set( 800, phi, theta );object.position.setFromSpherical( spherical );vector.copy( object.position ).multiplyScalar( 2 );object.lookAt( vector );targets.sphere.push( object );}// helixvar vector = new THREE.Vector3();var cylindrical = new THREE.Cylindrical();for ( var i = 0, l = objects.length; i < l; i ++ ) {var theta = i * 0.175 + Math.PI;var y = - ( i * 8 ) + 450;var object = new THREE.Object3D();cylindrical.set( 900, theta, y );object.position.setFromCylindrical( cylindrical );vector.x = object.position.x * 2;vector.y = object.position.y;vector.z = object.position.z * 2;object.lookAt( vector );targets.helix.push( object );}// gridfor ( var i = 0; i < objects.length; i ++ ) {var object = new THREE.Object3D();object.position.x = ( ( i % 5 ) * 400 ) - 800;object.position.y = ( - ( Math.floor( i / 5 ) % 5 ) * 400 ) + 800;object.position.z = ( Math.floor( i / 25 ) ) * 1000 - 2000;targets.grid.push( object );}//renderer = new THREE.CSS3DRenderer();renderer.setSize( window.innerWidth, window.innerHeight );document.getElementById( 'container' ).appendChild( renderer.domElement );//controls = new THREE.TrackballControls( camera, renderer.domElement );controls.rotateSpeed = 0.5;controls.minDistance = 500;controls.maxDistance = 6000;controls.addEventListener( 'change', render );var button = document.getElementById( 'table' );button.addEventListener( 'click', function ( event ) {transform( targets.table, 2000 );}, false );var button = document.getElementById( 'sphere' );button.addEventListener( 'click', function ( event ) {transform( targets.sphere, 2000 );}, false );var button = document.getElementById( 'helix' );button.addEventListener( 'click', function ( event ) {transform( targets.helix, 2000 );}, false );var button = document.getElementById( 'grid' );button.addEventListener( 'click', function ( event ) {transform( targets.grid, 2000 );}, false );transform( targets.table, 2000 );//window.addEventListener( 'resize', onWindowResize, false );}function transform( targets, duration ) {TWEEN.removeAll();for ( var i = 0; i < objects.length; i ++ ) {var object = objects[ i ];var target = targets[ i ];new TWEEN.Tween( object.position ).to( { x: target.position.x, y: target.position.y, z: target.position.z }, Math.random() * duration + duration ).easing( TWEEN.Easing.Exponential.InOut ).start();new TWEEN.Tween( object.rotation ).to( { x: target.rotation.x, y: target.rotation.y, z: target.rotation.z }, Math.random() * duration + duration ).easing( TWEEN.Easing.Exponential.InOut ).start();}new TWEEN.Tween( this ).to( {}, duration * 2 ).onUpdate( render ).start();}function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );render();}function animate() {requestAnimationFrame( animate );TWEEN.update();controls.update();}function render() {renderer.render( scene, camera );}</script></body>
</html>

http://chatgpt.dhexx.cn/article/ktfntpqA.shtml

相关文章

3d相册

页面脚本 我的图片是是本地的&#xff0c;大家可以放上自己喜爱的图片 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>3d相册</title></head><style>#box1 {/* 宽 */width: 300px;/* 高 */height: …

HTML实现3D相册

今天&#xff0c;我给大家分享一个3D相册的代码 废话不说先上效果图&#xff1a; 先新建两个文件夹&#xff0c;一个叫css&#xff0c;另一个叫img&#xff0c;如下图&#xff1a; 先新建一个文本文档&#xff0c;输入下面的代码&#xff1a; <!DOCTYPE html> <html…

教你零基础制作3D旋转相册(送给那个她~)

3D立体相册&#xff1f;   是的&#xff0c;相信大家或多或少的会在一些地方看到某些程序员用代码给自己女朋友写3D立体相册&#xff0c;那么你会不会也想自己手动敲出那些炫酷的代码呢&#xff1f;   那你是找对地方了。废话不多说&#xff0c;今天为大家分享利用html实现…

【3D相册】零基础完成3D相册并配上背景音乐

文章目录 一、前言二、准备工作1、新建文件夹2、准备素材对于图片的处理对于音乐的处理 三、代码工作1、python处理6张图片1.1代码运行1.2 放入背景图片 2、写html文件2.1 更换音乐素材 3、运行main.html 四、推荐阅读 一、前言 帮助好哥们整的一个小相册&#xff0c;给他写个…

斐波那契数列求和公式

斐波那契数列指的是这样一个数列&#xff1a;1、1、2、3、5、8、13、21、……    这个数列从第三项开始&#xff0c;每一项都等于前两项之和。它的通项公式为:(见下图)&#xff08;又叫“比内公式”&#xff0c;是用无理数表示有理数的一个范例。&#xff09; 斐波那契数列求…

斐波那契数列之python(5种方法)

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、因数学家列昂纳多斐波那契&#xff08;Leonardoda Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个数列&#xff1a;1、1、2、…

斐波那契数列(C/C++)

目录 背景介绍 解法1&#xff1a;非数组非递归 解法2&#xff1a;数组非递归 解法3&#xff1a;非数组递归 解法4&#xff1a;数组递归 背景介绍 斐波那契数列&#xff0c;又称黄金分割数列&#xff0c;指的是这样一个数列&#xff1a;0、1、1、2、3、5、8、13、21、34、…

关于斐波那契数列通项公式证明以及推广

在我们中学的时候老师都会举一个著名的兔子繁殖的例子&#xff1a;一般而言&#xff0c;兔子在出生两个月后&#xff0c;就有繁殖能力&#xff0c;一对兔子每个月能生出一对小兔子来。如果所有兔子都不死&#xff0c;那么一年以后可以繁殖多少对兔子&#xff1f;而这个问题就是…

斐波那契数列的四种解法

题目描述 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个数列&a…

斐波那契数列通项公式的求法

以下两种方法其实是一样的 1、方法一 其实所有人都知道T(n) T(n-1) T(n-2), T(1) T(2)1,T(n)也是一个斐波那契数列&#xff0c;求解时间复杂度的本质也就是求数列通项&#xff0c;结果MB的一个通项就把我难住了&#xff0c;只好回来google一下&#xff0c;把高中数学用的求…

【算法】斐波那契数列通项公式

特征方程和通项公式 如果数列 a n a_n an​的递推公式&#xff1a; a n c 1 a n − 1 c 2 a n − 2 a_nc_1a_{n-1}c_2a_{n-2} an​c1​an−1​c2​an−2​------(1) 根据待定系数法&#xff0c;假设 a n − x a n − 1 y ( a n − 1 − x a n − 2 ) a_n-xa_{n-1}y(a_{n-1…

斐波那契数列通项公式的推导证明----举一反三

斐波那契数列通项公式的推导证明----举一反三 1-前言2-斐波那契2-1-什么是斐波那契2-2-通项公式的证明2-3-举一反三 1-前言 2021年5月20号的那天&#xff0c;有对象的都忙着约会秀恩爱&#xff0c;而我这样的单身狗&#xff0c;只能自己学习沉淀自己&#xff0c;为梦想而奔波&a…

七种方式求斐波那契(Fibonacci)数列通项

一&#xff1a;递归实现   使用公式f[n]f[n-1]f[n-2]&#xff0c;依次递归计算&#xff0c;递归结束条件是f[1]1&#xff0c;f[2]1。 二&#xff1a;数组实现   空间复杂度和时间复杂度都是0(n)&#xff0c;效率一般&#xff0c;比递归来得快。 三&#xff1a;vector<in…

响应式 - 基于尺寸的响应式内边距

前言 为了衬托一个响应式宽度的图像元素&#xff0c;需要添加相对的内边距。如果使用静态的宽度内边距&#xff0c;图像内边距在较小的浏览器窗口中可能会显得过大&#xff0c;从而与其他附近元素相互挤压&#xff0c;甚至可能将图像挤出屏幕。 准备工作 理解盒模型属性的计算…

响应式 - 基于min-width和max-width属性的响应式布局

前言 响应式布局的很多解决方案都相当复杂&#xff0c;但是本节中的方法却非常简单。该方法通过在3个浮动元素上设置min-width和max-width属性来实现响应式布局。只要采用CSS中这个非常简单的响应式布局特性&#xff0c;就能够适应移动设备和不同尺寸的计算机屏幕。 准备工作 …

【愚公系列】2023年07月 WPF+上位机+工业互联 002-WPF布局控件

文章目录 前言一、WPF布局控件1.无边框设计2.理解布局2.1 WPF的布局处理2.1 布局原则2.3 布局过程 3.布局控件3.1 Grid控件3.1.1 属性3.1.2 案例 3.2 StackPanel控件3.2.1 属性3.2.2 案例 3.3 DockPanel3.3.1 属性3.3.2 案例 3.4 WrapPanel3.4.1 属性3.4.2 案例 3.5 UniformGri…

WordPress响应式主题:Three/博客/CMS/博客导航三合一主题

效果演示:http://cxyo.vip/ 下载地址在最后面 主题使用说明 1、首页设置 ①选择首页布局&#xff1a;博客布局或杂志布局或博客导航&#xff0c;默认博客布局&#xff0c;若选择杂志布局或博客导航后&#xff0c;必须设置CMS/导航布局后才能正常显示&#xff0c;否则会错位。…

使用dedecms构建响应式站点(二)——系统设置

在上一篇文章中&#xff0c;我们介绍了使用dedecms构建响应式站点的安装部分&#xff0c;这一次&#xff0c;我们来讲讲dedecms系统安装后的初始状态下如何进行各项系统设置。 进入管理后台后&#xff0c;我们会看到系统的管理菜单&#xff0c;如下图所示&#xff1a; 通过菜单…

浏览器请求与响应全过程详解

3. 浏览器请求与响应全过程详解 前言 当在浏览器上输入一个网站链接时&#xff0c;它是如何运行将网页内容呈现在我们的浏览器上的呢&#xff1f; 本文旨在对www.yangoogle.com网页进行详细分析&#xff0c;了解浏览器展示内容的整个流程。下图是在网上检索到一个较清晰的流程…