three实现可调节参数的三维城市废墟穿梭动画效果代码
代码语言:html
所属分类:三维
代码描述:three实现可调节参数的三维城市废墟穿梭动画效果代码
代码标签: three 调节 参数 三维 城市 废墟 穿梭 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> body { margin: 0; overflow: hidden; } </style> </head> <body> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.0.99.0..js"></script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/dat.gui-min.js"></script> <script > console.clear(); window.addEventListener("DOMContentLoaded",app); function app() { var scene, camera, renderer, controls, GUI, textureLoader = new THREE.TextureLoader(), asphaltTexture, bldgTexture, bldgs = [], debris = [], debrisIdealSet = [], ambientLight, hemiLight, // user adjustable brightness = 0.5, fogDistance = 720, speed = 0.5, // should stay as is bldgColor = 0x242424, lightColor = 0x444444, skyColor = 0xaaaaaa, chunkSize = 128, chunksAtATime = 6, debrisPerChunk = 32, debrisMaxChunkAscend = 2, smBldgSize = 10, lgBldgSize = 12; class Building { constructor(x,y,z,width,height,depth,rotX = 0,rotY = 0,rotZ = 0) { this.geo = new THREE.CubeGeometry(width,height,depth); this.mat = new THREE.MeshLambertMaterial({ color: bldgColor, map: bldgTexture }); this.mat.map.wrapS = THREE.RepeatWrapping; this.mat.map.wrapT = THREE.RepeatWrapping; this.mat.map.repeat.set(1,height/width > 2 ? 3 : 2); let halfHeight = height/2, isRotated = rotX != 0 || rotY != 0 || rotZ != 0; this.mesh = new THREE.Mesh(this.geo, this.mat); this.mesh.position.set(x,isRotated ? y : y + halfHeight,z); if (isRotated) { this.geo.translate(0,halfHeight,0); this.mesh.rotation.x = rotX * Math.PI/180; this.mesh.rotation.y = rotY * Math.PI/180; this.mesh.rotation.z = rotZ * Math.PI/180; } this.mesh.castShadow = true; scene.add(this.mesh); } } class Debris { constructor(x,y,z,width,height,depth,rotX = 0,rotY = 0,rotZ = 0) { this.geo = new THREE.CubeGeometry(width,height,depth); this.mat = new THREE.MeshLambertMaterial({ color: bldgColor }); this.mesh = new THREE.Mesh(this.geo, this.mat); this.mesh.position.set(x,y,z); this.mesh.rotation.set( rotX * Math.PI/180, rotY * Math.PI/180, rotZ * Math.PI/180 ); scene.add(this.mesh); } } const randomInt = (min,max) => { return Math.floor(Math.random() * (max - min)) + min; }, randomAngle = () => { return Math.floor(Math.random() * 360); } var init = () => { // load textures asphaltTexture = textureLoader.load("https://i.ibb.co/hVK82BH/asphalt-texture.jpg"); bldgTexture = textureLoader.load("https://i.ibb.co/ZGLhtGv/building-texture.jpg"); // setup scene scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); renderer = new THREE.WebGLRenderer(); renderer.setClearColor(new THREE.Color(skyColor)); renderer.setSize(window.innerWidth, window.innerHeight); renderer.shadowMap.enabled = true; // use randomized and fixed configuration of debris particles that can be repeated for (var d = 0; d < debrisPerChunk; ++d) { let halfChunk = chunkSize/2, debrisParams = { x: randomInt(-halfChunk,halfChunk), y: randomInt(0,chunkSize * debrisMaxChunkAscend), z: randomInt(-halfChunk,halfChunk) }; debrisParams.size = Math.abs(debrisParams.x / halfChunk) * 6; debrisParams.height = debrisParams.size * randomInt(2,3); debrisIdealSet.push({ x: debrisParams.x, y: debrisParams.y, z: debrisParams.z, width: debrisParams.size, height: debrisParams.height, depth: debrisParams.size, rotX: randomAngle(), rotY: randomAngle(), rotZ: randomAngle() }); } // generate city for (var cz = 1; cz > -chunksAtATime; --cz) { var zMove = chunkSize * cz; // surface var planeGeometry = new THREE.PlaneGeometry(chunkSize,chunkSize), planeMaterial = new THREE.MeshLambertMaterial({ color: 0x969696, map: asphaltTexture }); var plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.rotation.x = -0.5 * Math.PI; .........完整代码请登录后点击上方下载按钮下载查看
网友评论0