three打造3d礼盒礼物点击破碎效果
代码语言:html
所属分类:三维
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
body {
margin: 0;
overflow: hidden;
}
</style>
</head>
<body translate="no">
<script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/three.js"></script>
<script >
window.addEventListener("DOMContentLoaded", app);
function app() {
var scene,
camera,
renderer,
present,
raycaster = new THREE.Raycaster(),
intersects,
pointer = new THREE.Vector2(),
init = () => {
// setup
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);
renderer = new THREE.WebGLRenderer();
renderer.setClearColor(new THREE.Color(0xf98686));
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
// present
present = new Present(12, 7);
scene.add(present.mesh);
// ambient light
let ambientLight = new THREE.AmbientLight(0xffffff);
ambientLight.name = "Ambient Light";
scene.add(ambientLight);
// directional light
let directionLight = new THREE.DirectionalLight(0xffffff, 0.7);
directionLight.name = "Directional Light";
directionLight.position.set(10, 20, 0);
directionLight.castShadow = true;
directionLight.shadow.mapSize = new THREE.Vector2(1024, 1024);
scene.add(directionLight);
// camera
camera.position.set(30, 30, 30);
camera.lookAt(scene.position);
// render
document.body.appendChild(renderer.domElement);
renderScene();
},
renderScene = () => {
if (present)
present.openLoop();
renderer.render(scene, camera);
requestAnimationFrame(renderScene);
},
adjustWindow = () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
},
updateRaycaster = e => {
pointer.x = e.clientX / window.innerWidth * 2 - 1;
pointer.y = -(e.clientY / window.innerHeight) * 2 + 1;
raycaster.setFromCamera(pointer, camera);
intersects = raycaster.intersectObjects(present.mesh.children, true);
intersects = intersects.filter(
child => child.object.type == "Mesh");
},
presentActive = e => {
if (present && (intersects.length || e.keyCode == 32))
present.open();
},
presentHover = e => {
updateRaycaster(e);
renderer.domElement.style.cursor = intersects.length ? "pointer" : "default";
};
init();
window.addEventListener("resize", adjustWindow);
document.addEventListener("click", presentActive);
window.addEventListener("keydown", presentActive);
window.addEventListener("mousemove", presentHover, false);
}
class Present {
constructor(sideWidth = 7, divisions = 5) {
this.sideWidth = sideWidth;
this.divisions = divisions;
this.effectFadeSpeed = 0.02;
this.effectMoveSpeed = 0.8;
this.effectRotateSpeed = 0.1;
this.openSpeed = 4;
this.openTim.........完整代码请登录后点击上方下载按钮下载查看
网友评论0