image

by 蔡 育曄

HTML

<h1 style="text-align:center">
  Image & Map
</h1>
<hr>
<div id="container" style="float:left;width:45vw;height:45vw;background-color:pink">
  <canvas id="mycanvas"></canvas>
</div>
<div>
  <img src='https://i.imgur.com/bgynmml.png' usemap="#lightSwitch" style="width:249px;height:160px;">
</div>
<map name="lightSwitch">
  <area shape="circle" class='light' id='redlight' coords="69,79,12" href="#">
  <area shape="circle" class='light' id='greenlight' coords="181,79,12" href="#">
</map>
<!------------------------------------------------------------------->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js">
</script>

CSS

div.centerImage {
  text-align: center;
  float: left;
  width: 46vw;
}

body {
  overflow: hidden;
}

JavaScript

var camera, scene, renderer;
var pointRed, pointGreen;
var redOff = false;
var greenOff = false;
$('.light').click(function(e) {
  e.preventDefault();
	if (this.id === 'redlight') {
  	redOff = !redOff;
  } else {
  	greenOff = !greenOff;
  }
})


init();
animate();


function init() {

  var ww = $("#container").innerWidth();
  var hh = $("#container").innerHeight();
  var cc = document.getElementById('mycanvas');
  renderer = new THREE.WebGLRenderer({
    canvas: cc
  });
  renderer.setSize(ww, hh);
  //renderer.setClearColor(0x888888);
  // $("#container2").append(renderer.domElement);
  
  scene = new THREE.Scene();
  camera = new THREE.PerspectiveCamera(50, ww / hh, 1, 1000);
  camera.position.set(0, 400, 500);
	controls = new THREE.OrbitControls(camera, renderer.domElement);
  window.addEventListener('resize', onWindowResize, false);

	///////////////////////////////////////////////////////////////////
	floor = new THREE.Mesh (new THREE.PlaneGeometry(249,160), new THREE.MeshPhongMaterial({ambient:0x333333}));
  scene.add (floor);
  floor.rotation.x = -Math.PI/2;

	pointRed = new THREE.PointLight( 0xff0000, 1);
	pointRed.position.set( -249/2+69, 50, 0);
	scene.add( pointRed );
  
	pointGreen = new THREE.PointLight( 0x00ff00, 1);
	pointGreen.position.set( -249/2+181, 50, 0 );
	scene.add( pointGreen );

	// ambient light for basic brightness when lights are off
	let ambientLight = new THREE.AmbientLight( 0x404040 );
	scene.add(ambientLight);


}


function onWindowResize() {
  var ww = $("#container").innerWidth();
  var hh = $("#container").innerHeight();

  camera.aspect = ww / hh;
  camera.updateProjectionMatrix();
  renderer.setSize(ww, hh);
}

function animate() {
	pointRed.intensity = redOff ? 0 : 1;
	pointGreen.intensity = greenOff ? 0 : 1;
  
  requestAnimationFrame(animate);
  renderer.render (scene, camera);
}