Browse Source

add missing files

Gregg Tavares 6 years ago
parent
commit
527a353fe2

BIN
threejs/resources/images/label-sorting-issue.png


+ 195 - 0
threejs/threejs-align-html-to-3d-w-sorting.html

@@ -0,0 +1,195 @@
+<!-- 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 - Align HTML Elements w/hiding</title>
+    <style>
+    body {
+        margin: 0;
+    }
+    #c {
+        width: 100%;  /* let our container decide our size */
+        height: 100%;
+        display: block;
+    }
+    #container {
+      position: relative;  /* makes this the origin of its children */
+      width: 100vw;
+      height: 100vh;
+      overflow: hidden;
+    }
+    #labels {
+      position: absolute;  /* let us position ourself inside the container */
+      z-index: 0;          /* make a new stacking context so children don't sort with rest of page */
+      left: 0;             /* make our position the top left of the container */
+      top: 0;
+      color: white;
+    }
+    #labels>div {
+      white-space: nowrap;
+      position: absolute;  /* let us position them inside the container */
+      left: 0;             /* make their default position the top left of the container */
+      top: 0;
+      cursor: pointer;     /* change the cursor to a hand when over us */
+      font-size: large;
+      user-select: none;   /* don't let the text get selected */
+      text-shadow:         /* create a black outline */
+        -1px -1px 0 #000,
+         0   -1px 0 #000,
+         1px -1px 0 #000,
+         1px  0   0 #000,
+         1px  1px 0 #000,
+         0    1px 0 #000,
+        -1px  1px 0 #000,
+        -1px  0   0 #000;
+    }
+    #labels>div:hover {
+      color: red;
+    }
+    </style>
+  </head>
+  <body>
+    <div id="container">
+      <canvas id="c"></canvas>
+      <div id="labels"></div>
+    </div>
+  </body>
+<script src="resources/threejs/r102/three.min.js"></script>
+<script src="resources/threejs/r102/js/controls/OrbitControls.js"></script>
+<script>
+'use strict';
+
+/* global THREE */
+
+function main() {
+  const canvas = document.querySelector('#c');
+  const renderer = new THREE.WebGLRenderer({canvas: canvas});
+
+  const fov = 75;
+  const aspect = 2;  // the canvas default
+  const near = 1.1;
+  const far = 20;
+  const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
+  camera.position.z = 7;
+
+  const controls = new THREE.OrbitControls(camera, canvas);
+  controls.target.set(0, 0, 0);
+  controls.update();
+
+  const scene = new THREE.Scene();
+
+  {
+    const color = 0xFFFFFF;
+    const intensity = 1;
+    const light = new THREE.DirectionalLight(color, intensity);
+    light.position.set(-1, 2, 4);
+    scene.add(light);
+  }
+
+  const boxWidth = 1;
+  const boxHeight = 1;
+  const boxDepth = 1;
+  const geometry = new THREE.BoxGeometry(boxWidth, boxHeight, boxDepth);
+
+  const labelContainerElem = document.querySelector('#labels');
+
+  function makeInstance(geometry, color, x, name) {
+    const material = new THREE.MeshPhongMaterial({color});
+
+    const cube = new THREE.Mesh(geometry, material);
+    scene.add(cube);
+
+    cube.position.x = x;
+
+    const elem = document.createElement('div');
+    elem.textContent = name;
+    labelContainerElem.appendChild(elem);
+
+    return {cube, elem};
+  }
+
+  const cubes = [
+    makeInstance(geometry, 0x44aa88,  0, 'Aqua Colored Box'),
+    makeInstance(geometry, 0x8844aa, -2, 'Purple Colored Box'),
+    makeInstance(geometry, 0xaa8844,  2, 'Gold Colored Box'),
+  ];
+
+  function resizeRendererToDisplaySize(renderer) {
+    const canvas = renderer.domElement;
+    const width = canvas.clientWidth;
+    const height = canvas.clientHeight;
+    const needResize = canvas.width !== width || canvas.height !== height;
+    if (needResize) {
+      renderer.setSize(width, height, false);
+    }
+    return needResize;
+  }
+
+  const tempV = new THREE.Vector3();
+  const raycaster = new THREE.Raycaster();
+
+  function render(time) {
+    time *= 0.001;
+
+    if (resizeRendererToDisplaySize(renderer)) {
+      const canvas = renderer.domElement;
+      camera.aspect = canvas.clientWidth / canvas.clientHeight;
+      camera.updateProjectionMatrix();
+    }
+
+    cubes.forEach((cubeInfo, ndx) => {
+      const {cube, elem} = cubeInfo;
+      const speed = 1 + ndx * .1;
+      const rot = time * speed;
+      cube.rotation.x = rot;
+      cube.rotation.y = rot;
+
+      // get the position of the center of the cube
+      cube.updateWorldMatrix(true, false);
+      cube.getWorldPosition(tempV);
+
+      // get the normalized screen coordinate of that position
+      // x and y will be in the -1 to +1 range with x = -1 being
+      // on the left and y = -1 being on the bottom
+      tempV.project(camera);
+
+      // ask the raycaster for all the objects that intersect
+      // from the eye toward this object's position
+      raycaster.setFromCamera(tempV, camera);
+      const intersectedObjects = raycaster.intersectObjects(scene.children);
+      // We're visible if the first intersection is this object.
+      const show = intersectedObjects.length && cube === intersectedObjects[0].object;
+
+      if (!show || Math.abs(tempV.z) > 1) {
+        // hide the label
+        elem.style.display = 'none';
+      } else {
+        // unhide the label
+        elem.style.display = '';
+
+        // convert the normalized position to CSS coordinates
+        const x = (tempV.x *  .5 + .5) * canvas.clientWidth;
+        const y = (tempV.y * -.5 + .5) * canvas.clientHeight;
+
+        // move the elem to that position
+        elem.style.transform = `translate(-50%, -50%) translate(${x}px,${y}px)`;
+
+        // set the zIndex for sorting
+        elem.style.zIndex = (-tempV.z * .5 + .5) * 100000 | 0;
+      }
+    });
+
+    renderer.render(scene, camera);
+
+    requestAnimationFrame(render);
+  }
+
+  requestAnimationFrame(render);
+}
+
+main();
+</script>
+</html>
+

+ 158 - 0
threejs/threejs-canvas-textured-cube-qix.html

@@ -0,0 +1,158 @@
+<!-- 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 - Canvas Textured Cube</title>
+    <style>
+    body {
+        margin: 0;
+    }
+    #c {
+        width: 100vw;
+        height: 100vh;
+        display: block;
+    }
+    </style>
+  </head>
+  <body>
+    <canvas id="c"></canvas>
+  </body>
+<script src="resources/threejs/r102/three.min.js"></script>
+<script>
+'use strict';
+
+/* global THREE */
+
+function main() {
+  const canvas = document.querySelector('#c');
+  const renderer = new THREE.WebGLRenderer({canvas: canvas});
+
+  const fov = 75;
+  const aspect = 2;  // the canvas default
+  const near = 0.1;
+  const far = 5;
+  const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
+  camera.position.z = 2;
+
+  const scene = new THREE.Scene();
+
+  const boxWidth = 1;
+  const boxHeight = 1;
+  const boxDepth = 1;
+  const geometry = new THREE.BoxGeometry(boxWidth, boxHeight, boxDepth);
+
+  const cubes = [];  // just an array we can use to rotate the cubes
+  const ctx = document.createElement('canvas').getContext('2d');
+  ctx.canvas.width = 256;
+  ctx.canvas.height = 256;
+  ctx.fillStyle = '#FFF';
+  ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
+  const texture = new THREE.CanvasTexture(ctx.canvas);
+
+  const material = new THREE.MeshBasicMaterial({
+    map: texture,
+  });
+  const cube = new THREE.Mesh(geometry, material);
+  scene.add(cube);
+  cubes.push(cube);  // add to our list of cubes to rotate
+
+  function resizeRendererToDisplaySize(renderer) {
+    const canvas = renderer.domElement;
+    const width = canvas.clientWidth;
+    const height = canvas.clientHeight;
+    const needResize = canvas.width !== width || canvas.height !== height;
+    if (needResize) {
+      renderer.setSize(width, height, false);
+    }
+    return needResize;
+  }
+
+  function rand(min, max) {
+  if (max === undefined) {
+    max = min;
+    min = 0;
+  }
+    return Math.random() * (max - min) + min;
+  }
+
+  function randVelocity() {
+    return rand(2, 4) * (rand(2) < 1 ? -1 : 1);
+  }
+
+  const maxLines = 60;
+  const points = [
+    { position: [rand(256), rand(256)], direction: [randVelocity(), randVelocity()]},
+    { position: [rand(256), rand(256)], direction: [randVelocity(), randVelocity()]},
+  ];
+  const lineHistory = [];
+  let lineCursor = 0;
+
+  function drawCurrentLine() {
+    const line = lineHistory[lineCursor];
+    ctx.beginPath();
+    ctx.moveTo(...line[0]);
+    ctx.lineTo(...line[1]);
+    ctx.stroke();
+  }
+
+  function drawLines(time) {
+    points.forEach((point) => {
+      point.position.forEach((position, ndx) => {
+        const newPosition = position + point.direction[ndx];
+        if (newPosition > 255) {
+          point.direction[ndx] = rand(-2, -4);
+        } else if (newPosition < 0) {
+          point.direction[ndx] = rand( 2,  4);
+        }
+        point.position[ndx] = newPosition;
+      });
+    });
+    if (lineHistory.length === maxLines) {
+      ctx.lineWidth = 3;
+      ctx.strokeStyle = '#FFF';
+      drawCurrentLine();
+    }
+    lineHistory[lineCursor] = points.map(point => point.position.slice());
+    ctx.lineWidth = 1;
+    ctx.strokeStyle = hsl(time, 1, .5);
+    drawCurrentLine();
+    lineCursor = (lineCursor + 1) % maxLines;
+  }
+
+  function hsl(h, s, l) {
+    return `hsl(${h * 360 | 0},${s * 100 | 0}%,${l * 100 | 0}%)`;
+  }
+
+  function render(time) {
+    time *= 0.001;
+
+    if (resizeRendererToDisplaySize(renderer)) {
+      const canvas = renderer.domElement;
+      camera.aspect = canvas.clientWidth / canvas.clientHeight;
+      camera.updateProjectionMatrix();
+    }
+
+    drawLines(time * 0.1);
+    texture.needsUpdate = true;
+
+    cubes.forEach((cube, ndx) => {
+      const speed = .2 + ndx * .1;
+      const rot = time * speed;
+      cube.rotation.x = rot;
+      cube.rotation.y = rot;
+    });
+
+    renderer.render(scene, camera);
+
+    requestAnimationFrame(render);
+  }
+
+  requestAnimationFrame(render);
+}
+
+main();
+</script>
+</html>
+