Browse Source

change main page

Gregg Tavares 6 years ago
parent
commit
6b1afd4496
3 changed files with 256 additions and 29 deletions
  1. 1 1
      build/templates/index.template
  2. 193 0
      threejs/background-v01.html
  3. 62 28
      threejs/background.html

+ 1 - 1
build/templates/index.template

@@ -80,7 +80,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       </div>
       </div>
       {{{content}}}
       {{{content}}}
       <div>
       <div>
-      3d scene by: <a href="https://sketchfab.com/elsergio217">elsergio217</a>
+      flamingo by: <a href="http://mirada.com/">mirada</a>
       </div>
       </div>
     </div>
     </div>
   </div>
   </div>

+ 193 - 0
threejs/background-v01.html

@@ -0,0 +1,193 @@
+<!-- Licensed under a BSD license. See license.html for license -->
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
+    <title>Three.js - Fundamentals</title>
+    <link type="text/css" href="resources/threejs-tutorials.css" rel="stylesheet" />
+    <style>
+    html, body {
+      margin: 0;
+      height: 100%;
+    }
+    canvas {
+      width: 100%;
+      height: 100%;
+      display: block;
+    }
+    </style>
+  </head>
+  <body>
+    <canvas id="c"></canvas>
+  </body>
+<script src="resources/threejs/r102/three.min.js"></script>
+<script src="resources/threejs/r102/js/controls/OrbitControls.js"></script>
+<script src="resources/threejs/r102/js/shaders/SSAOShader.js"></script>
+<script src="resources/threejs/r102/js/shaders/CopyShader.js"></script>
+<script src="resources/threejs/r102/js/postprocessing/EffectComposer.js"></script>
+<script src="resources/threejs/r102/js/postprocessing/RenderPass.js"></script>
+<script src="resources/threejs/r102/js/postprocessing/ShaderPass.js"></script>
+<script src="resources/threejs/r102/js/postprocessing/MaskPass.js"></script>
+<script src="resources/threejs/r102/js/postprocessing/SSAOPass.js"></script>
+<script src="resources/threejs/r102/js/loaders/GLTFLoader.js"></script>
+<script>
+'use strict';
+
+/* global THREE */
+
+function main() {
+  const canvas = document.querySelector('#c');
+  const renderer = new THREE.WebGLRenderer({canvas: canvas});
+  const scene = new THREE.Scene();
+
+  const aspect = 2;  // the canvas default
+  const fov = 35;
+  const near = 0.1;
+  const far = 5000;
+  const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
+  camera.position.x = -0.;
+  camera.position.y = 350;
+  camera.position.z = 40.;
+
+  const useFog = true;
+  const useOrbitCamera = false;
+  const showHelpers = false;
+  const camSpeed = 0.2;
+
+  if (useOrbitCamera) {
+    const controls = new THREE.OrbitControls(camera);
+    controls.target.set(0, 100.01, 0.2);
+    controls.update();
+  }
+
+  renderer.gammaInput = true;
+  renderer.gammaOutput = true;
+  renderer.shadowMap.enabled = true;
+
+  const hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 0.6);
+  hemiLight.color.setHSL(0.6, 1, 0.6);
+  hemiLight.groundColor.setHSL(0.095, 1, 0.75);
+  hemiLight.position.set(0, 50, 0);
+  scene.add(hemiLight);
+
+  if (showHelpers) {
+    const hemiLightHelper = new THREE.HemisphereLightHelper(hemiLight, 10);
+    scene.add(hemiLightHelper);
+  }
+
+  const dirLight = new THREE.DirectionalLight(0xffffff, 1);
+  dirLight.color.setHSL(0.1, 1, 0.95);
+  dirLight.position.set(-300, 220, 245);
+  scene.add(dirLight);
+  dirLight.castShadow = true;
+  dirLight.shadow.mapSize.width = 2048;
+  dirLight.shadow.mapSize.height = 2048;
+  const d = 350;
+  dirLight.shadow.camera.left = -d;
+  dirLight.shadow.camera.right = d;
+  dirLight.shadow.camera.top = d;
+  dirLight.shadow.camera.bottom = -d;
+  dirLight.shadow.camera.near = 100;
+  dirLight.shadow.camera.far = 950;
+  dirLight.shadow.bias = -0.005;
+
+  if (showHelpers) {
+    const dirLightHeper = new THREE.DirectionalLightHelper(dirLight, 10);
+    scene.add(dirLightHeper);
+  }
+
+  const loader = new THREE.GLTFLoader();
+  const camRadius = 600;
+  const camHeight = 160;
+  const camTarget = [0, 30, 0];
+  const fogNear = 1350;
+  const fogFar = 1500;
+  loader.load('resources/models/mountain_landscape/scene.gltf', (gltf) => {
+    gltf.scene.traverse((child) => {
+      if ( child.isMesh ) {
+        child.castShadow = true;
+        child.receiveShadow = true;
+      }
+    });
+    scene.add(gltf.scene);
+  });
+
+  window.s = scene;
+
+  if (useFog) {
+    const vertexShader = `
+    varying vec3 vWorldPosition;
+    void main() {
+      vec4 worldPosition = modelMatrix * vec4( position, 1.0 );
+      vWorldPosition = worldPosition.xyz;
+      gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
+    }
+    `;
+
+    const fragmentShader = `
+    uniform vec3 topColor;
+    uniform vec3 bottomColor;
+    uniform float offset;
+    uniform float exponent;
+    varying vec3 vWorldPosition;
+    void main() {
+      float h = normalize( vWorldPosition + offset ).y;
+      gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h , 0.0), exponent ), 0.0 ) ), 1.0 );
+    }
+    `;
+
+    const uniforms = {
+      topColor:    { value: new THREE.Color(0x88AABB) },
+      bottomColor: { value: new THREE.Color(0xEFCB7F) },
+      offset:      { value: 730 },
+      exponent:    { value: 0.3 },
+    };
+    uniforms.topColor.value.copy(hemiLight.color);
+    scene.fog = new THREE.Fog(scene.background, fogNear, fogFar);
+    scene.fog.color.copy(uniforms.bottomColor.value);
+    const skyGeo = new THREE.SphereBufferGeometry(4000, 32, 15);
+    const skyMat = new THREE.ShaderMaterial( { vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: uniforms, side: THREE.BackSide } );
+    const sky = new THREE.Mesh( skyGeo, skyMat );
+    scene.add(sky);
+  }
+
+  function resizeRendererToDisplaySize(renderer) {
+    const canvas = renderer.domElement;
+    const width = canvas.clientWidth;
+    const height = canvas.clientHeight;
+    if (width === canvas.width && height === canvas.height) {
+      return false;
+    }
+
+    renderer.setSize(width, height, false);
+    return true;
+  }
+
+  function render(time) {
+    time *= 0.001;
+    time += 80;
+
+    if (resizeRendererToDisplaySize(renderer)) {
+      camera.aspect = canvas.clientWidth / canvas.clientHeight;
+      camera.updateProjectionMatrix();
+    }
+
+    if (!useOrbitCamera) {
+      const angle = Math.sin(time * camSpeed) + Math.PI * .75;
+      camera.position.set(Math.cos(angle) * camRadius, camHeight, Math.sin(angle) * camRadius);
+      camera.lookAt(...camTarget);
+    }
+
+    renderer.render(scene, camera);
+
+    requestAnimationFrame(render);
+  }
+
+  requestAnimationFrame(render);
+}
+
+main();
+</script>
+</html>
+

+ 62 - 28
threejs/background.html

@@ -46,18 +46,19 @@ function main() {
   const near = 0.1;
   const near = 0.1;
   const far = 5000;
   const far = 5000;
   const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
   const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
-  camera.position.x = -0.;
-  camera.position.y = 350;
-  camera.position.z = 40.;
+  camera.position.set(-580, 55, 390);
 
 
+  const maxFovX = 40;
+  const numBirds = 40;
+  const minMax = 700;
+  const birdSpeed = 100;
   const useFog = true;
   const useFog = true;
-  const useOrbitCamera = false;
+  const useOrbitCamera = true;
   const showHelpers = false;
   const showHelpers = false;
-  const camSpeed = 0.2;
 
 
   if (useOrbitCamera) {
   if (useOrbitCamera) {
     const controls = new THREE.OrbitControls(camera);
     const controls = new THREE.OrbitControls(camera);
-    controls.target.set(0, 100.01, 0.2);
+    controls.target.set(0, 0, 0);
     controls.update();
     controls.update();
   }
   }
 
 
@@ -66,8 +67,8 @@ function main() {
   renderer.shadowMap.enabled = true;
   renderer.shadowMap.enabled = true;
 
 
   const hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 0.6);
   const hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 0.6);
-  hemiLight.color.setHSL(0.6, 1, 0.6);
-  hemiLight.groundColor.setHSL(0.095, 1, 0.75);
+  hemiLight.color.setHSL(0.6, 1, 0.5);
+  hemiLight.groundColor.setHSL(0.095, 1, 0.5);
   hemiLight.position.set(0, 50, 0);
   hemiLight.position.set(0, 50, 0);
   scene.add(hemiLight);
   scene.add(hemiLight);
 
 
@@ -97,20 +98,48 @@ function main() {
     scene.add(dirLightHeper);
     scene.add(dirLightHeper);
   }
   }
 
 
+  const birds = [];
   const loader = new THREE.GLTFLoader();
   const loader = new THREE.GLTFLoader();
-  const camRadius = 600;
-  const camHeight = 160;
-  const camTarget = [0, 30, 0];
   const fogNear = 1350;
   const fogNear = 1350;
   const fogFar = 1500;
   const fogFar = 1500;
-  loader.load('resources/models/mountain_landscape/scene.gltf', (gltf) => {
-    gltf.scene.traverse((child) => {
-      if ( child.isMesh ) {
-        child.castShadow = true;
-        child.receiveShadow = true;
-      }
-    });
-    scene.add(gltf.scene);
+
+  function rand(min, max) {
+    if (min === undefined) {
+      min = 0;
+      max = 1;
+    } else if (max === undefined) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.random() * (max - min);
+  }
+
+  loader.load( 'resources/models/flamingo/Flamingo.glb', (gltf) => {
+    const orig = gltf.scene.children[0];
+    orig.castShadow = true;
+    orig.receiveShadow = true;
+
+    for (let i = 0; i < numBirds; ++i) {
+      const u = i / (numBirds - 1);
+      const mesh = orig.clone();
+      mesh.position.set(
+        rand(-150, 150),
+        (u * 2 - 1) * 200,
+        (minMax * 2 * i * 1.7) % (minMax * 2) - minMax / 2,
+      );
+      scene.add(mesh);
+      mesh.material = mesh.material.clone();
+      mesh.material.color.setHSL(rand(), 1, 0.8);
+
+      const mixer = new THREE.AnimationMixer(mesh);
+      mixer.clipAction(gltf.animations[0]).setDuration(1).play();
+      mixer.update(rand(10));
+      mixer.timeScale = rand(0.9, 1.1);
+      birds.push({
+        mixer,
+        mesh,
+      });
+    }
   });
   });
 
 
   window.s = scene;
   window.s = scene;
@@ -146,7 +175,7 @@ function main() {
     uniforms.topColor.value.copy(hemiLight.color);
     uniforms.topColor.value.copy(hemiLight.color);
     scene.fog = new THREE.Fog(scene.background, fogNear, fogFar);
     scene.fog = new THREE.Fog(scene.background, fogNear, fogFar);
     scene.fog.color.copy(uniforms.bottomColor.value);
     scene.fog.color.copy(uniforms.bottomColor.value);
-    const skyGeo = new THREE.SphereBufferGeometry(4000, 32, 15);
+    const skyGeo = new THREE.SphereBufferGeometry(3000, 32, 15);
     const skyMat = new THREE.ShaderMaterial( { vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: uniforms, side: THREE.BackSide } );
     const skyMat = new THREE.ShaderMaterial( { vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: uniforms, side: THREE.BackSide } );
     const sky = new THREE.Mesh( skyGeo, skyMat );
     const sky = new THREE.Mesh( skyGeo, skyMat );
     scene.add(sky);
     scene.add(sky);
@@ -164,19 +193,24 @@ function main() {
     return true;
     return true;
   }
   }
 
 
-  function render(time) {
-    time *= 0.001;
-    time += 80;
+  let then = 0;
+  function render(now) {
+    now *= 0.001;
+    const deltaTime = now - then;
+    then = now;
 
 
     if (resizeRendererToDisplaySize(renderer)) {
     if (resizeRendererToDisplaySize(renderer)) {
-      camera.aspect = canvas.clientWidth / canvas.clientHeight;
+      const aspect = canvas.clientWidth / canvas.clientHeight;
+      const fovX = THREE.Math.radToDeg(2 * Math.atan(Math.tan(THREE.Math.degToRad(fov) * 0.5) * aspect));
+      const newFovY = THREE.Math.radToDeg(2 * Math.atan(Math.tan(THREE.Math.degToRad(maxFovX) * .5) / aspect));
+      camera.fov = fovX > maxFovX ? newFovY : fov;
+      camera.aspect = aspect;
       camera.updateProjectionMatrix();
       camera.updateProjectionMatrix();
     }
     }
 
 
-    if (!useOrbitCamera) {
-      const angle = Math.sin(time * camSpeed) + Math.PI * .75;
-      camera.position.set(Math.cos(angle) * camRadius, camHeight, Math.sin(angle) * camRadius);
-      camera.lookAt(...camTarget);
+    for (const {mesh, mixer} of birds) {
+      mixer.update(deltaTime);
+      mesh.position.z = (mesh.position.z + minMax + mixer.timeScale * birdSpeed * deltaTime) % (minMax * 2) - minMax;
     }
     }
 
 
     renderer.render(scene, camera);
     renderer.render(scene, camera);