creating the interfaces of the future with the apis of today

40
Create the interfaces of the future with the web APIs of today @gebill e

Upload: gerbille

Post on 07-Nov-2014

6.715 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Creating the interfaces of the future with the APIs of today

Create the interfaces of the future with the web APIs of today

@gebille

Page 2: Creating the interfaces of the future with the APIs of today

Two “futuristic” interfaces using web APIs

Page 3: Creating the interfaces of the future with the APIs of today

+ web sockets + device orientation =

+ WebGL!!

Page 4: Creating the interfaces of the future with the APIs of today

remote.js teapot.js

server.jsα, β, ɣ α, β, ɣ

Page 5: Creating the interfaces of the future with the APIs of today

web sockets

Page 6: Creating the interfaces of the future with the APIs of today

var websocketServerUrl = 'ws://10.112.0.139:8080/';window.addEventListener('DOMContentLoaded', function init() {  //init websocket connections  //device orientation sync socket  var ws = new WebSocket(websocketServerUrl);  ws.onopen = function() {    ws.opened = true;  };  //listen to device orientation  window.addEventListener('deviceorientation', function(e) {    if (ws.opened) {      ws.send(JSON.stringify({        alpha: e.alpha,        beta: e.beta,        gamma: e.gamma      }));    }  });});

remote.js:

Page 7: Creating the interfaces of the future with the APIs of today

server.js:

// ws servervar ws = require('websocket-server');var wsServer = ws.createServer();wsServer.addListener('connection', function(connection){  connection.addListener('message', function(msg) {    wsServer.broadcast(msg);  });});wsServer.listen(8080);

Page 8: Creating the interfaces of the future with the APIs of today

teapot.js:

window.addEventListener('DOMContentLoaded', function init() {  //connect to server using websockets  var ws = new WebSocket('ws://10.112.0.139:8080/');  ws.onopen = function() {    ws.onmessage = function(e) {      var data = JSON.parse(e.data),          avalue = data.alpha / 180 * Math.PI,          bvalue = data.beta / 180 * Math.PI,          gvalue = data.gamma / 180 * Math.PI;                teapot.rotation.set(gvalue, avalue, -bvalue);     };   };});

Page 9: Creating the interfaces of the future with the APIs of today
Page 10: Creating the interfaces of the future with the APIs of today

socket.io

Page 11: Creating the interfaces of the future with the APIs of today

device orientation

Page 12: Creating the interfaces of the future with the APIs of today

  //listen to device orientation  window.addEventListener('deviceorientation', function(e) {    angles.innerHTML = 'alpha: ' + e.alpha + ', beta: ' + e.beta + ', gamma: ' + e.gamma;    if (ws.opened) {      ws.send(JSON.stringify({        alpha: e.alpha,        beta: e.beta,        gamma: e.gamma      }));    }  });

remote.js:

Page 13: Creating the interfaces of the future with the APIs of today
Page 14: Creating the interfaces of the future with the APIs of today
Page 15: Creating the interfaces of the future with the APIs of today
Page 16: Creating the interfaces of the future with the APIs of today
Page 17: Creating the interfaces of the future with the APIs of today

slideshare.net/gerbille/device-disorientation

Page 18: Creating the interfaces of the future with the APIs of today

WebGL

Page 19: Creating the interfaces of the future with the APIs of today

three.js

Page 20: Creating the interfaces of the future with the APIs of today
Page 21: Creating the interfaces of the future with the APIs of today

// scene sizevar WIDTH = 724, HEIGHT = 512;// get the DOM element to attach tovar container = $('container');// create a WebGL renderer, set its size and append it to the DOMvar renderer = new THREE.WebGLRenderer();renderer.setSize(WIDTH, HEIGHT);renderer.setClearColorHex(0x111111, 1);renderer.clear();container.appendChild(renderer.domElement);// create a scenevar scene = new THREE.Scene();

Page 22: Creating the interfaces of the future with the APIs of today

// camera settings: fov, aspect ratio, near, farvar FOV = 45, ASPECT = WIDTH / HEIGHT, NEAR = 0.1, FAR = 10000;// create a camera and position camera on z axis (starts at 0,0,0)var camera = new THREE.PerspectiveCamera( FOV, ASPECT, NEAR, FAR);camera.position.z = 100;// add the camera to the scenescene.add(camera);// create some lights, position them and add it to the scenevar spotlight = new THREE.SpotLight();spotlight.position.set( 170, 330, -160 );scene.add(spotlight);ambilight = new THREE.AmbientLight(0x333333);scene.add(ambilight);//enable shadows on the rendererrenderer.shadowMapEnabled = true;

Page 23: Creating the interfaces of the future with the APIs of today

// add an object (teapot) to the scenevar teapot;

var loader = new THREE.JSONLoader(),  createScene = function createScene( geometry ) {      var material = new THREE.MeshFaceMaterial();      teapot = new THREE.Mesh( geometry, material );       teapot.scale.set(8, 8, 8);         teapot.position.set( 0, -10, 0 );      scene.add( teapot );          console.log('matrix ' + teapot.matrix);    console.log('rotation ' + teapot.rotation.x);  };

loader.load('teapot-model.js', createScene );

// drawrenderer.render(scene, camera);animate();

//animatefunction animate() {    requestAnimationFrame(animate);    renderer.render(scene, camera);}

Page 24: Creating the interfaces of the future with the APIs of today
Page 25: Creating the interfaces of the future with the APIs of today

+ getUserMedia =

+ WebGL!!

Page 26: Creating the interfaces of the future with the APIs of today

getUserMedia

Page 27: Creating the interfaces of the future with the APIs of today

var video = document.getElementById("camera");navigator.getUserMedia({ video: true }, function(stream) {    video.src = window.URL.createObjectURL(stream) || stream;}, function() {    //error...});

<video id="camera" autoplay></video>

** to make sure your code works in ALL browsers add these two lines:

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;

Page 28: Creating the interfaces of the future with the APIs of today
Page 29: Creating the interfaces of the future with the APIs of today

headtrackr.js

Page 30: Creating the interfaces of the future with the APIs of today

<canvas id="inputCanvas" width="320" height="240" style="display:none"></canvas><video id="inputVideo" autoplay loop></video><script>  var videoInput = document.getElementById('inputVideo');  var canvasInput = document.getElementById('inputCanvas');  var htracker = new headtrackr.Tracker();  htracker.init(videoInput, canvasInput);  htracker.start();</script>

Page 31: Creating the interfaces of the future with the APIs of today

// set up camera controller for head-coupled perspectiveheadtrackr.controllers.three.realisticAbsoluteCameraControl(camera, 27, [0,0,50], new THREE.Vector3(0,0,0), {damping : 0.5}); * @param {THREE.PerspectiveCamera} camera * @param {number} scaling size of screen in 3d-model relative to vertical size of computer screen in real life * @param {array} fixedPosition array (x,y,z) w/ the position of the real life screen in the 3d-model space coordinates * @param {THREE.Vector3} lookAt the object/position the camera should be pointed towards * @param {object} params optional object with optional parameters

Page 32: Creating the interfaces of the future with the APIs of today

document.addEventListener('headtrackingEvent', function(event) {scene.fog = new THREE.Fog(0x000000, 1+(event.z*27), 3000+(event.z*27));}, false);* x : position of head in cm's right of camera as seen from users point of view (see figure)* y : position of head in cm's above camera (see figure)* z : position of head in cm's distance from camera (see figure)

Page 33: Creating the interfaces of the future with the APIs of today

WebGL

Page 34: Creating the interfaces of the future with the APIs of today

three.js

Page 35: Creating the interfaces of the future with the APIs of today

//top wallplane1 = new THREE.Mesh(new THREE.PlaneGeometry(500, 3000, 5, 15), new THREE.MeshBasicMaterial({color: 0xcccccc, wireframe : true }));plane1.rotation.x = Math.PI/2;plane1.position.y = 250;plane1.position.z = 50-1500;scene.add(plane1);

Page 36: Creating the interfaces of the future with the APIs of today

 var geometry = new THREE.Geometry();    geometry.vertices.push(new THREE.Vertex(new THREE.Vector3(0, 0, -80000)));    geometry.vertices.push(new THREE.Vertex(new THREE.Vector3(0, 0, z)));    var line = new THREE.Line(geometry, new THREE.LineBasicMaterial({color: 0xeeeeee }));    line.position.x = x;    line.position.y = y;    scene.add(line);

Page 37: Creating the interfaces of the future with the APIs of today
Page 38: Creating the interfaces of the future with the APIs of today

github.com/auduno/headtrackr

auduno.github.com/headtrackr/examples/targets.html

github.com/luzc/wiimote

slideshare.net/gerbille/device-disorientation

Page 39: Creating the interfaces of the future with the APIs of today

shinydemos.com/touch-tracker

github.com/operasoftware

Page 40: Creating the interfaces of the future with the APIs of today

@gerbille

github.com/luzc

slideshare.net/gerbille