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