Turn and Nod

inspired by black and white (Michael Jackson)

by jmchen

HTML

<div id="info">Turn & Nod ...</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js"></script>
<script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/OrbitControls.js">
</script>

CSS

#info {
  position: absolute;
  top: 0px;
  width: 100%;
  padding: 10px;
  text-align: center;
  color: #ffff00
}

body {
  overflow: hidden;
}

JavaScript

// black or white
// MV ; https://www.youtube.com/watch?v=F2AitTPI5U0
// 5:30 or so

var camera, scene, renderer, geometry, material, mesh, light, controls;
var clock = new THREE.Clock();

var stick = new THREE.Object3D();
var quats = [];
var keys = [];
var actionStart;
var period = 5; // 8 beats = 5 seconds


init();
animate();

// keys & euler angles
// interpolate using quaternion

function setKeys() {
  //////////////////////////////////////////////////////////////
  // Euler orientations
  var euler0 = new THREE.Euler(0, 0, 0);     // start
  var euler1 = new THREE.Euler(.3, 0, 0);   // beat 1
  var euler2 = new THREE.Euler(0.0, 0, 0);  // beat 2
  var euler25 = new THREE.Euler(0.0, -1.57, 0);
  var euler3 = new THREE.Euler(.3, -1.57, 0, 'YXZ');  // beat 3
  var euler4 = new THREE.Euler(0.0, -1.57, 0);  // beat 4
  var euler45 = new THREE.Euler(0.0, 0, 0);
  var euler5= new THREE.Euler(.3, 0, 0);   // beat 5
  var euler6= new THREE.Euler(0.0, 0, 0);  // beat 6
  var euler65 = new THREE.Euler(0.0, 1.57, 0);
  var euler7= new THREE.Euler(.3, 1.57, 0, 'YXZ');  // beat 7
  var euler8= new THREE.Euler(0.0, 1.57, 0);  // beat 8

  // set keys & quats
  // keys array set in normalized time (beats)
  keys.push(0, 0.05, 1.05, 1.5, 2.05, 3.05, 3.5, 4.05, 5.05, 5.5, 6.05, 7.05);
	for (var i =0;i < keys.length; i++)
    keys[i] *= period/8;  // two bars, 8 beats, real time
  
  quats.push((new THREE.Quaternion()).setFromEuler(euler0));
  quats.push((new THREE.Quaternion()).setFromEuler(euler1));
  quats.push((new THREE.Quaternion()).setFromEuler(euler2));
  quats.push((new THREE.Quaternion()).setFromEuler(euler25));
  quats.push((new THREE.Quaternion()).setFromEuler(euler3));
  quats.push((new THREE.Quaternion()).setFromEuler(euler4));
  quats.push((new THREE.Quaternion()).setFromEuler(euler45));
  quats.push((new THREE.Quaternion()).setFromEuler(euler5));
  quats.push((new THREE.Quaternion()).setFromEuler(euler6));
  quats.push((new...