three打造日出草坪小草摆动三维效果
代码语言:html
所属分类:三维
代码描述:three打造日出草坪小草摆动三维效果,可以360拖动
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> body { background-color: #fff; margin: 0; overflow: hidden; } .label { position: absolute; top: 0; left: 0; padding: 5px 15px; color: #fff; font-size: 13px; background-color: rgba(0, 0, 0, .15); } .instructions { position: absolute; bottom: 0%; left: 0; padding: 5px 15px; color: #fff; font-size: 13px; background-color: rgba(0, 0, 0, .15); } canvas { display: block; } </style> </head> <body translate="no"> <canvas id="canvas"></canvas> <div class="label"> Logo </div> <div class="instructions"> WASD/ARROW KEYS TO MOVE, MOUSE TO LOOK </div> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/three.109.js"></script> <script src="//repo.bfw.wiki/bfwrepo/js/OrbitControls.js"></script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/Stats-16.js"></script> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/dat.gui-min.js"></script> <script> var canvas = document.getElementById("canvas"); const mobile = (navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i) ); //Variables for blade mesh var joints = 4; var bladeWidth = 0.12; var bladeHeight = 1; //Patch side length var width = 120; //Number of vertices on ground plane side var resolution = 32; //Distance between two ground plane vertices var delta = width/resolution; //Radius of the sphere onto which the ground plane is bended var radius = 120; //User movement speed var speed = 1.5; //The global coordinates //The geometry never leaves a box of width*width around (0, 0) //But we track where in space the camera would be globally var pos = new THREE.Vector2(0, 0); //Number of blades var instances = 40000; if (mobile) { instances = 7000; width = 50; } //Sun //Height over horizon in range [0, PI/2.0] var elevation = 0.3; //Rotation around Y axis in range [0, 2*PI] var azimuth = 2.0; //Lighting variables for grass var ambientStrength = 0.6; var translucencyStrength = 1.4; var specularStrength = 0.5; var diffuseStrength = 2.2; var shininess = 256; var sunColour = new THREE.Vector3(1.0, 1.0, 1.0); var specularColour = new THREE.Vector3(1.0, 1.0, 1.0); //Camera rotate var rotate = false; //Initialise three.js. There are two scenes which are drawn after one another with clear() called manually at the start of each frame //Grass scene var scene = new THREE.Scene(); //Sky scene var backgroundScene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer({ antialias: true, canvas: canvas }); renderer.outputEncoding = THREE.sRGBEncoding; renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(window.innerWidth, window.innerHeight); //Camera const FOV = 45; var camera = new THREE.PerspectiveCamera(FOV, window.innerWidth / window.innerHeight, 1, 20000); camera.position.set(-70, 0, -50); camera.lookAt(new THREE.Vector3(0, 0, 0)); scene.add(camera); backgroundScene.add(camera); //Light for ground plane var ambientLight = new THREE.AmbientLight(0xffffff, 0.5); scene.add(ambientLight); //OrbitControls.js for camera manipulation controls = new THREE.OrbitControls(camera, renderer.domElement); controls.autoRotate = rotate; controls.autoRotateSpeed = 1.0; controls.maxDistance = 65.0; if (mobile) { controls.maxDistance = 25.0; } controls.minDistance = 5.0; //Disable keys to stop arrow keys from moving the camera controls.enableKeys = false; controls.update(); const stats = new Stats(); stats.showPanel(0); stats.domElement.style.position = 'absolute'; stats.domElement.style.right = '0px'; stats.domElement.style.bottom = '0px'; document.body.appendChild(stats.domElement); //************* GUI *************** var gui = new dat.GUI(); gui.add(this, 'radius').min(85).max(1000).step(5); gui.add(this, 'speed').min(0.5).max(10).step(0.01); gui.add(this, 'elevation').min(0.0).max(Math.PI/2.0).step(0.01).listen().onChange(function(value) { updateSunPosition(); }); gui.add(this, 'azimuth').min(0.0).max(Math.PI*2.0).step(0.01).listen().onChange(function(value) { updateSunPosition(); }); gui.close(); window.addEventListener('resize', onWindowResize, false); function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); backgroundMaterial.uniforms.resolution.value = new THREE.Vector2(canvas.width, canvas.height); } //************** Sky ************** //https://discourse.threejs.org/t/how-do-i-use-my-own-custom-shader-as-a-scene-background/13598/2 const backgroundMaterial = new THREE.ShaderMaterial({ uniforms: { sunDirection: { type: 'vec3', value: new THREE.Vector3(Math.sin(azimuth), Math.sin(elevation), -Math.cos(azimuth))}, resolution: { type: 'vec2', value: new THREE.Vector2(canvas.width, canvas.height)} }, vertexShader: ` varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4( position, 1.0 ); } `, fragmentShader: ` varying vec2 vUv; uniform vec2 resolution; uniform vec3 sunDirection; const vec3 skyColour = 0.5 * vec3(0.09, 0.33, 0.81); //Darken sky when looking up vec3 getSkyColour(vec3 rayDir){ return mix(skyColour, 0.2*skyColour, rayDir.y); } //https://iquilezles.org/www/articles/fog/fog.htm vec3 applyFog(vec3 rgb, vec3 rayOri, vec3 rayDir, vec3 sunDir){ //Make horizon more hazy float dist = 4000.0; if(abs(rayDir.y) < 0.0001){rayDir.y = 0.0001;} //Rate of fade float b = 0.2; float fogAmount = pow(1.0-rayDir.y, 4.0);//1.0 * exp(-rayOri.y*b) * (1.0-exp(-dist*rayDir.y*b))/rayDir.y; float sunAmount = max( dot( rayDir, sunDir ), 0.0 ); vec3 fogColor = mix( vec3(0.5,0.6,0.7), vec3(1.0), pow(sunAmount, 16.0) ); return mix(rgb, fogColor, clamp(fogAmount, 0.0, 1.0)); } vec3 ACESFilm(vec3 x){ float a = 2.51; float b = 0.03; float c = 2.43; float d = 0.59; float e = 0.14; return clamp((x*(a*x+b))/(x*(c*x+d)+e), 0.0, 1.0); } vec3 rayDirection(float fieldOfView, vec2 fragCoord) { vec2 xy = fragCoord - resolution.xy / 2.0; float z = (0.5 * resolution.y) / tan(radians(fieldOfView) / 2.0); return normalize(vec3(xy, -z)); } //https://www.geertarien.com/blog/2017/07/30/breakdown-of-the-lookAt-function-in-OpenGL/ mat3 lookAt(vec3 camera, vec3 at, vec3 up){ vec3 zaxis = normalize(at-camera); vec3 xaxis = normalize(cross(zaxis, up)); vec3 yaxis = cross(xaxis, zaxis); return mat3(xaxis, yaxis, -zaxis); } float getGlow(float dist, float radius, float intensity){ dist = max(dist, 1e-6); return pow(radius/dist, intensity); } void main() { vec3 target = vec3(0.0, 0.0, 0.0); vec3 up = vec3(0.0, 1.0, 0.0); vec3 rayDir = rayDirection(45.0, gl_FragCoord.xy); //Get the view matrix from the camera orientation mat3 viewMatrix_ = lookAt(cameraPosition, target, up); //Transform the ray to point in the correct direction rayDir = viewMatrix_ * rayDir; vec3 sunDir = normalize(sunDirection); vec3 col = getSkyColour(rayDir); float mu = dot(sunDir, rayDir); //Draw sun col += getGlow(1.0-mu, 0.000015, 0.9); col += applyFog(col, vec3(0,1000,0), rayDir, sunDir); gl_FragColor = vec4(col, 1.0 ); } ` }); backgroundMaterial.depthWrite = false; var backgroundGeometry = new THREE.PlaneBufferGeometry(2, 2, 1, 1); var background = new THREE.Mesh(backgroundGeometry, backgroundMaterial); backgroundScene.add(background); renderer.autoClear = false; //************** Ground ************** //Ground material is a modification of the existing THREE.MeshPhongMaterial rather than one from scratch var groundBaseGeometry = new THREE.PlaneBufferGeometry(width, width, resolution, resolution); groundBaseGeometry.lookAt(new THREE.Vector3(0, 1, 0)); groundBaseGeometry.verticesNeedUpdate = true; var groundGeometry = new THREE.PlaneBufferGeometry(width, width, resolution, resolution); groundGeometry.addAttribute('basePosition', groundBaseGeometry.getAttribute("position")); groundGeometry.lookAt(new THREE.Vector3(0, 1, 0)); groundGeometry.verticesNeedUpdate = true; var groundMaterial = new THREE.MeshPhongMaterial({ color: 0x000300 }); var groundVertexPrefix = ` attribute vec3 basePosition; uniform float delta; uniform float posX; uniform float posZ; uniform float radius; uniform float width; .........完整代码请登录后点击上方下载按钮下载查看
网友评论0