three实现三维海洋石头堆积的时钟显示时间指针走动效果代码
代码语言:html
所属分类:三维
代码描述:three实现三维海洋石头堆积的时钟显示时间指针走动效果代码
代码标签: three 三维 海洋 石头 堆积 时钟 显示 时间 指针 走动
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> @import url("https://fonts.googleapis.com/css2?family=Lato&display=swap"); * { margin: 0; padding: 0; box-sizing: border-box; } *::before, *::after { box-sizing: border-box; } html, body { overscroll-behavior-x: none; overscroll-behavior-y: none; scroll-behavior: smooth; } body { font-family: "Lato", sans-serif; position: relative; width: 100%; max-width: 100vw; height: auto; min-height: 100vh; text-align: center; overflow-x: hidden; background: rgb(255, 255, 255); color: gray; } canvas { -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; position: fixed; width: 100%; max-width: 100vw; height: auto; min-height: 100vh; top: 0; left: 0; z-index: 0; } main { position: relative; } section { position: relative; width: 100vw; min-height: 100vh; display: grid; place-items: center; } </style> </head> <body translate="no"> <!-- Sea Glass Clock Copyright (c) 2024 by Wakana Y.K. (https://codepen.io/wakana-k/pen/oNrVwjY) webgpu_shadowmap_opacity demo --> <!-- using three.js --> <main> <section> <div> <p>Loading...</p> </div> </section> </main> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/es-module-shims.1.6.3.js"></script> <script type="importmap"> { "imports": { "three": "//repo.bfw.wiki/bfwrepo/js/module/three/build/168/three.webgpu.js", "three/tsl": "//repo.bfw.wiki/bfwrepo/js/module/three/build/168/three.webgpu.js", "three/addons/": "//repo.bfw.wiki/bfwrepo/js/module/three/examples/168/jsm/" } } </script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/perlin-min.js"></script> <script type="module"> /*! Sea Glass Clock Copyright (c) 2024 by Wakana Y.K. (https://codepen.io/wakana-k/pen/oNrVwjY) */ "use strict"; console.clear(); import * as THREE from "three"; import { Fn, vec4 } from "three/tsl"; import { OrbitControls } from "three/addons/controls/OrbitControls.js"; import { ParametricGeometry } from "three/addons/geometries/ParametricGeometry.js"; import * as BufferGeometryUtils from "three/addons/utils/BufferGeometryUtils.js"; (function () { let camera, scene, renderer, controls; let geometry, material, mesh; let color, colors = []; const clock = {}; const MIDNIGHT = Math.PI * -0.5; let a, r, b, c; // for parametric params init(); obj(); function updateClockTime() { const date = new Date(); const milliseconds = date.getMilliseconds(); const seconds = date.getSeconds() + milliseconds / 1000; const minutes = date.getMinutes() + seconds / 60; const hours = (date.getHours() % 12) + minutes / 60; clock.hourHand.rotation.z = MIDNIGHT - (Math.PI * 2 * hours) / 12 + Math.PI / 2; clock.minuteHand.rotation.z = MIDNIGHT - (Math.PI * 2 * minutes) / 60 + Math.PI / 2; clock.secondHand.rotation.z = MIDNIGHT - (Math.PI * 2 * seconds) / 60 + Math.PI / 2; } function shuffleColors(num = 12) { let tempColors = []; for (let i = 0; i < num; i++) { tempColors.push(new THREE.Color().setHSL((1 / num) * i, 1, 0.6)); } return tempColors.sort((a, b) => 0.5 - Math.random()); // array shuffle } function distortion(geo) { let k = 1; for (let i = 0; i < geo.attributes.position.count; i++) { let vertex = new THREE.Vector3(); vertex.fromBufferAttribute(geo.getAttribute("position"), i); //console.log(noise.perlin3(vertex.x * k, vertex.y * k, vertex.z * k)); vertex .normalize() .multiplyScalar( 0.3 + 0.03 * noise.perlin3(vertex.x * k, vertex.y * k, vertex.z * k) ); geo.attributes.position.setX(i, vertex.x); geo.attributes.position.setY(i, vertex.y); geo.attributes.position.setZ(i, vertex.z); } geo.computeVertexNormals(); geo.verticesNeedUpdate = true; geo.normalsNeedUpdate = true; return geo; } function obj() { // background geometry = new THREE.PlaneGeometry(200, 200); material = new THREE.MeshPhysicalMaterial({ color: 0xffffff, side: THREE.DoubleSide }); mesh = new THREE.Mesh(geometry, material); mesh.position.set(0, 0, -1); mesh.receiveShadow = true; scene.add(mesh); // shadow node const customShadow = Fn(([color, opacity = 0.8]) => { return vec4(color, opacity); }); // clock index geometry = new THREE.SphereGeometry(0.3, 32, 32); geometry = distortion(geometry); geometry.translate(0, 3, 0); material = new THREE.MeshPhysicalMaterial({ transparent: true, reflectivity: 0.8, //0.2 envMapIntensity: 1, //0.9 clearcoat: 5, //1 clearcoatRoughness: 0, //color: 0xff0000, emissive: 0x000000, emissiveIntensity: 0.5, transmission: 0, //1 opacity: 0.95, metalness: 0, roughness: 0.03, //0.05 ior: 0, //2 thickness: 1, //0.01 iridescence: 1, iridescenceIOR: 2.333, //1 or 2.333 dispersion: 5, side: THREE.BackSide }); // colors colors = shuffleColors(12); for (let i = 0; i < 12; i++) { geometry = geometry.clone(); geometry.rotateZ((Math.PI * 2) / 12); material = material.clone(); //color = new THREE.Color(Math.random() * 0xffffff); //color = new THREE.Color().setHSL(Math.random(), 1, 0.5); color = colors.pop(); material.color.set(color); //material.emissive.set(color);.........完整代码请登录后点击上方下载按钮下载查看
网友评论0