three打造一个三维图片粒子分解转场效果幻灯片
代码语言:html
所属分类:幻灯片
代码描述:three打造一个三维图片粒子分解转场效果幻灯片
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
body {
margin: 0;
width: 100%;
height: 100%;
}
canvas {
display: block;
cursor: pointer;
}
</style>
</head>
<body translate="no">
<canvas id="canvas"></canvas>
<p class="collection">
</p>
<script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/gsap.3.3.1.js"></script>
<script type="module">
import {
BufferGeometry,
Color,
DoubleSide,
Face3,
Geometry,
InstancedBufferAttribute,
InstancedMesh,
MathUtils,
MeshBasicMaterial,
Object3D,
PerspectiveCamera,
Scene,
TextureLoader,
Vector2,
Vector3,
WebGLRenderer } from
'https://unpkg.com/three@0.119.0/build/three.module.js';
function App() {
const conf = {
size: 10,
images: [
{ src: 'http://repo.bfw.wiki/bfwrepo/image/5e0c6f2cae508.png' },
{ src: 'http://repo.bfw.wiki/bfwrepo/image/5e0c6f962a0d0.png' },
] };
let renderer, scene, camera, cameraCtrl;
const screen = {
width: 0, height: 0,
wWidth: 0, wHeight: 0,
ratio: 0 };
const loader = new TextureLoader();
const textures = [];
let planes, plane1, plane2;
let progress = 0,targetProgress = 0;
const mouse = new Vector2();
init();
function init() {
renderer = new WebGLRenderer({ canvas: document.getElementById('canvas'), antialias: true });
camera = new PerspectiveCamera(50);
camera.position.z = 150;
updateSize();
window.addEventListener('resize', onResize);
Promise.all(conf.images.map(loadTexture)).then(responses => {
initScene();
initListeners();
gsap.fromTo(plane1.uProgress,
{
value: -2 },
{
value: 0,
duration: 2.5,
ease: Power4.easeOut });
requestAnimationFrame(animate);
});
}
function initScene() {
scene = new Scene();
scene.background = new Color(0);
plane1 = new AnimatedPlane({
renderer, screen,
size: conf.size,
anim: 1,
texture: textures[0] });
plane2 = new AnimatedPlane({
renderer, screen,
size: conf.size,
anim: 2,
texture: textures[1] });
setPlanesProgress(0);
planes = new Object3D();
planes.add(plane1.o3d);
planes.add(plane2.o3d);
scene.add(planes);
}
function initListeners() {
document.addEventListener('mousemove', e => {
mouse.x = e.clientX / screen.width * 2 - 1;
mouse.y = -(e.clientY / screen.height) * 2 + 1;
});
window.addEventListener('wheel', e => {
e.preventDefault();
if (e.deltaY > 0) {
targetProgress = limit(targetProgress + 1 / 20, 0, conf.images.length - 1);
} else {
targetProgress = limit(targetProgress - 1 / 20, 0, conf.images.length - 1);
}
});
document.addEventListener('click', e => {
if (e.clientY < screen.height / 2) {
navPrevious();
} else {
navNext();
}
});
document.addEventListener('keyup', e => {
if (e.keyCode === 37 || e.keyCode === 38) {
navPrevious();
} else if (e.keyCode === 39 || e.keyCode === 40) {
navNext();
}
});
}
function navNext() {
if (Number.isInteger(targetProgress)) targetProgress += 1;else
targetProgress = Math.ceil(targetProgress);
targetProgress = limit(targetProgress, 0, conf.images.length - 1);
}
function navPrevious() {
if (Number.isInteger(targetProgress)) targetProgress -= 1;else
targetProgress = Math.floor(targetProgress);
targetProgress = limit(targetProgress, 0, conf.images.length - 1);
}
function updateProgress() {
const progress1 = lerp(progress, targetProgress, 0.1);
const pdiff = progress1 - progress;.........完整代码请登录后点击上方下载按钮下载查看
网友评论0