threejs实现三维图片卷起动画效果代码

代码语言:html

所属分类:三维

代码描述:threejs实现三维图片卷起动画效果代码

代码标签: three 三维 图片 卷起 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>

  <meta charset="UTF-8">

  
  
<style>
@import url('https://fonts.googleapis.com/css2?family=Lora&display=swap');

canvas {
  display: block;
  width: 100%;
  height: 100vh;
  background: black;
  font-family: lora, serif;
  cursor: -webkit-grab;
  cursor: grab;
}

#el_hero {
  color: white;
  position: fixed; top: 0; left: 0;;
  font: 1em lora, serif;
  mix-blend-mode: difference;
}

a {
  color: white;
}
</style>


</head>

<body >
  <div id='el_hero'>

</div>

<!-- -->
  <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/es-module-shims.js"></script>
<script type='importmap-shim'>
  {
    "imports": {
      "three": "https://unpkg.com/three@0.139.0/build/three.module.js",
      "three/": "https://unpkg.com/three@0.139.0/"
    }
  }
</script>
<script defer type='module-shim'>
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'

// ----
// main
// ----

const renderer = new THREE.WebGL1Renderer({ alpha: true }); // wgl 1
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(60, 2, .1, 100);
const controls = new OrbitControls(camera, renderer.domElement);

camera.position.set(0, 0, 1);
controls.enableDamping = true;

const light = new THREE.DirectionalLight('tan', 5);
light.position.set(1, 2, 1);
scene.add(light);
scene.add(new THREE.AmbientLight('tan', 1));

const { mat } = await (async function () {
  // photo by Vladislav Nahorny - https://unsplash.com/photos/gn23A8X3IDI
  const img_url = '//repo.bfw.wiki/bfwrepo/image/625a2a9c4cc77.png';
  const tex = await new THREE.TextureLoader().loadAsync(img_url);
  const img = tex.image;

  const cell_sz = 8; // px 
  const n_col = img.width / cell_sz | 0;
  const n_row = img.height / cell_sz | 0;
  const n_inst = n_col * n_row;

  const img_ratio = n_col / n_row;
  const plane_height = 1;
  const plane_width = plane_height * img_ratio;
  const inst_width = plane_width / n_col;
  const inst_height = plane_height / n_row;

  const geom = new THREE.PlaneGeometry(inst_width, inst_height);
  const inst_ids = new Float32Array(n_inst).map((_, i) => i);
  geom.setAttribute('inst_id', new THREE.InstancedBufferAttribute(inst_ids, 1, false, 1));
  // 0---1
  // |   |   (plane geom pos attr layout)
  // 2---3
  const vert_ids = new Float32Array([0, 1, 2, 3]);
  geom.setAttribute('vert_id', new THREE.BufferAttribute(vert_ids, 1, false));

  const shader = THREE.ShaderLib.lambert;
  const mat = new THREE.ShaderMaterial({
    lights: true,
    side: THREE.DoubleSide,
    defines: { USE_UV: true, USE_MAP: true },
    uniforms: THREE.UniformsUtils.merge([shader.uniforms, {
      map: { value: tex },
      time: { value: 0 },
    }]),
    vertexShader: `
    uniform float time;
    attribute float inst_id; // wgl1 attr.........完整代码请登录后点击上方下载按钮下载查看

网友评论0