SlideShare a Scribd company logo
1 of 152
Download to read offline
geildanke.com @ RuhrJS17 @fischaelameer
How to Make Your User Sick
in 60 Seconds
About UX Design, WebVR, and ReactVR
geildanke.com @ RuhrJS17 @fischaelameer
You Should Care About WebVR
Because You Care About Your Users.
geildanke.com @ RuhrJS17 @fischaelameer
Concepts
geildanke.com @ RuhrJS17 @fischaelameer
Concepts Code
geildanke.com @ RuhrJS17 @fischaelameer
Concepts Code Design
geildanke.com @ RuhrJS17 @fischaelameer
Virtual Reality Is Tricking Our Eyes And Brain
to Think of a 2D Image to Be in 3D.
geildanke.com @ RuhrJS17 @fischaelameer
Virtual Reality Changes The
Way We Relate to Technology.
geildanke.com @ RuhrJS17 @fischaelameer
VR Is Good For
Understanding Spatial Relationships
geildanke.com @ RuhrJS17 @fischaelameer
VR Is Good For
Multi Tasking
geildanke.com @ RuhrJS17 @fischaelameer
VR Is Good For
Simulations
geildanke.com @ RuhrJS17 @fischaelameer
What Is VR Bad At?
geildanke.com @ RuhrJS17 @fischaelameer
https://www.reddit.com/r/VRFail/comments/4p9zgj/pool_shot/
geildanke.com @ RuhrJS17 @fischaelameer
https://www.reddit.com/r/VRFail/comments/4p9zgj/pool_shot/
geildanke.com @ RuhrJS17 @fischaelameer
VR Concepts:
Stereoscopic Images
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
IPD
geildanke.com @ RuhrJS17 @fischaelameer
InterPupillary Distance
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
VR Concepts:
Tracking
geildanke.com @ RuhrJS17 @fischaelameer
Rotation Position
geildanke.com @ RuhrJS17 @fischaelameer
Rotation Position
geildanke.com @ RuhrJS17 @fischaelameer
Rotation Position
geildanke.com @ RuhrJS17 @fischaelameer
http://bit.ly/2iK1Zv7
geildanke.com @ RuhrJS17 @fischaelameer
http://bit.ly/2iK1Zv7
geildanke.com @ RuhrJS17 @fischaelameer
Rotation Position
geildanke.com @ RuhrJS17 @fischaelameer
Rotation Position
geildanke.com @ RuhrJS17 @fischaelameer
WebVR Concepts:
Tech Stack
geildanke.com @ RuhrJS17 @fischaelameer
Browser
https://github.com/mrdoob/three.js
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGL
https://github.com/mrdoob/three.js
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGL WebVR
https://github.com/mrdoob/three.js
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGL WebVR
three.js
Ricardo Cabello
https://github.com/mrdoob/three.js
geildanke.com @ RuhrJS17 @fischaelameer
https://caniuse.com/#search=webvr
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGL WebVR
three.js WebVR Polyfill
https://github.com/googlevr/webvr-polyfill
geildanke.com @ RuhrJS17 @fischaelameer
Static Image
With Fallback
geildanke.com @ RuhrJS17 @fischaelameer
Static Image
With Fallback
WebGL With Touch
And Gyroscope
geildanke.com @ RuhrJS17 @fischaelameer
Static Image
With Fallback
WebGL With Touch
And Gyroscope
Mobile & Desktop
VR Devices
geildanke.com @ RuhrJS17 @fischaelameer
WebVR Code:
Full-Sphere Video
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
x: 0, y: 0, z: 0
geildanke.com @ RuhrJS17 @fischaelameer
x: 0, y: 0, z: 0
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 );
let renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
let geometry = new THREE.SphereGeometry( 500, 60, 40 );
geometry.scale( -1, 1, 1 );
let video = document.createElement( 'video' );
let videoTexture = new THREE.VideoTexture( video );
let videoMaterial = new THREE.MeshBasicMaterial( { map: videoTexture } );
let mesh = new THREE.Mesh( geometry, videoMaterial );
function render() {
requestAnimationFrame( render );
renderer.render( scene, camera );
}
render();
geildanke.com @ RuhrJS17 @fischaelameer
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 );
let renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
let geometry = new THREE.SphereGeometry( 500, 60, 40 );
geometry.scale( -1, 1, 1 );
let video = document.createElement( 'video' );
let videoTexture = new THREE.VideoTexture( video );
let videoMaterial = new THREE.MeshBasicMaterial( { map: videoTexture } );
let mesh = new THREE.Mesh( geometry, videoMaterial );
function render() {
requestAnimationFrame( render );
renderer.render( scene, camera );
}
render();
geildanke.com @ RuhrJS17 @fischaelameer
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 );
let renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
let geometry = new THREE.SphereGeometry( 500, 60, 40 );
geometry.scale( -1, 1, 1 );
let video = document.createElement( 'video' );
let videoTexture = new THREE.VideoTexture( video );
let videoMaterial = new THREE.MeshBasicMaterial( { map: videoTexture } );
let mesh = new THREE.Mesh( geometry, videoMaterial );
function render() {
requestAnimationFrame( render );
renderer.render( scene, camera );
}
render();
geildanke.com @ RuhrJS17 @fischaelameer
let scene = new THREE.Scene();
let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 );
let renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
let geometry = new THREE.SphereGeometry( 500, 60, 40 );
geometry.scale( -1, 1, 1 );
let video = document.createElement( 'video' );
let videoTexture = new THREE.VideoTexture( video );
let videoMaterial = new THREE.MeshBasicMaterial( { map: videoTexture } );
let mesh = new THREE.Mesh( geometry, videoMaterial );
function render() {
requestAnimationFrame( render );
renderer.render( scene, camera );
}
render();
geildanke.com @ RuhrJS17 @fischaelameer
let vrDisplay;
navigator.getVRDisplays().then( function( displays ) {
if ( displays.length > 0 ) {
vrDisplay = displays[ 0 ];
} else {
console.log( 'No VR Displays found.' );
}
});
geildanke.com @ RuhrJS17 @fischaelameer
VRDisplay.isConnected
VRDisplay.isPresenting
VRDisplay.getEyeParameters()
VRDisplay.requestAnimationFrame()
geildanke.com @ RuhrJS17 @fischaelameer
vrDisplay.requestPresent( [ { source: myCanvas } ] );
geildanke.com @ RuhrJS17 @fischaelameer
myButton.addEventListener( 'click', function() {
vrDisplay.requestPresent( [ { source: myCanvas } ] );
});
geildanke.com @ RuhrJS17 @fischaelameer
myButton.addEventListener( 'click', function() {
vrDisplay.requestPresent( [ { source: myCanvas } ] )
.then( function() {
vrDisplay.requestAnimationFrame( render );
});
});
geildanke.com @ RuhrJS17 @fischaelameer
function render() {
vrDisplay.requestAnimationFrame( render );
}
geildanke.com @ RuhrJS17 @fischaelameer
function render() {
vrDisplay.requestAnimationFrame( render );
// update display pose
// update scene and meshes
}
geildanke.com @ RuhrJS17 @fischaelameer
let pose = vrDisplay.getPose();
console.log( pose.orientation );
// [ 0, 0, 0, 1 ]
// [ -0.0000724312, -0.06752134, 0.0028374712, 0.9977243 ]
console.log( pose.position );
// null
// [ 0.05234, -0.043485, 0.0003243 ]
geildanke.com @ RuhrJS17 @fischaelameer
let leftEyeParameters = vrDisplay.getEyeParameters( 'left' );
console.log( leftEyeParameters.offset );
// [ -0.03, 0, 0 ]
console.log( leftEyeParameters.renderWidth );
// 640.5
console.log( leftEyeParameters.renderHeight );
// 721
geildanke.com @ RuhrJS17 @fischaelameer
function render() {
vrDisplay.requestAnimationFrame( render );
// update display pose
// update scene and meshes
vrDisplay.submitFrame( pose );
}
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGL WebVR
three.js WebVR Polyfill
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGL WebVR
three.js WebVR Polyfill
A-Frame
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGL WebVR
three.js WebVR Polyfill
A-FrameReact VR
geildanke.com @ RuhrJS17 @fischaelameer
A-Frame
by Mozilla
geildanke.com @ RuhrJS17 @fischaelameer
<head>
<script src="aframe.js"></script>
</head>
<body>
<a-scene>
<a-assets>
<video id="video" src="video.mp4" autoplay loop></video>
</a-assets>
<a-videosphere src="#video"></a-videosphere>
</a-scene>
</body>
geildanke.com @ RuhrJS17 @fischaelameer
<head>
<script src="aframe.js"></script>
</head>
<body>
<a-scene>
<a-assets>
<video id="video" src="video.mp4" autoplay loop></video>
</a-assets>
<a-videosphere src="#video"></a-videosphere>
</a-scene>
</body>
geildanke.com @ RuhrJS17 @fischaelameer
<head>
<script src="aframe.js"></script>
</head>
<body>
<a-scene>
<a-assets>
<video id="video" src="video.mp4" autoplay loop></video>
</a-assets>
<a-videosphere src="#video"></a-videosphere>
</a-scene>
</body>
geildanke.com @ RuhrJS17 @fischaelameer
<head>
<script src="aframe.js"></script>
</head>
<body>
<a-scene>
<a-assets>
<video id="video" src="video.mp4" autoplay loop></video>
</a-assets>
<a-videosphere src="#video"></a-videosphere>
</a-scene>
</body>
<a-box> <a-cone> <a-cylinder> <a-dodecahedron>
<a-icosahedron> <a-octahedron> <a-ring> <a-sphere>
<a-tetrahedron> <a-torus-knot> <a-torus>
geildanke.com @ RuhrJS17 @fischaelameer
<a-video> <a-videosphere> <a-image> <a-sound>
<a-gltf-model> <a-obj-model> <a-text>
<a-light> <a-sky> <a-cursor>
<a-box> <a-cone> <a-cylinder> <a-dodecahedron>
<a-icosahedron> <a-octahedron> <a-ring> <a-sphere>
<a-tetrahedron> <a-torus-knot> <a-torus>
geildanke.com @ RuhrJS17 @fischaelameer
React VR
by Facebook
geildanke.com @ RuhrJS17 @fischaelameer
import React from 'react';
import { AppRegistry, VideoPano, View } from 'react-vr';
class GEILDANKE_REACTVR_PANO extends React.Component {
render() {
return (
<View>
<VideoPano source={{uri: 'video.mp4'}} />
</View>
);
}
};
AppRegistry.registerComponent('GEILDANKE_REACTVR_PANO', () => GEILDANKE_REACTVR_PANO);
geildanke.com @ RuhrJS17 @fischaelameer
import React from 'react';
import { AppRegistry, VideoPano, View } from 'react-vr';
class GEILDANKE_REACTVR_PANO extends React.Component {
render() {
return (
<View>
<VideoPano source={{uri: 'video.mp4'}} />
</View>
);
}
};
AppRegistry.registerComponent('GEILDANKE_REACTVR_PANO', () => GEILDANKE_REACTVR_PANO);
geildanke.com @ RuhrJS17 @fischaelameer
import React from 'react';
import { AppRegistry, VideoPano, View } from 'react-vr';
class GEILDANKE_REACTVR_PANO extends React.Component {
render() {
return (
<View>
<VideoPano source={{uri: 'video.mp4'}} />
</View>
);
}
};
AppRegistry.registerComponent('GEILDANKE_REACTVR_PANO', () => GEILDANKE_REACTVR_PANO);
geildanke.com @ RuhrJS17 @fischaelameer
Box Cylinder CylindricalPanel Plane Sphere
AmbientLight DirectionalLight PointLight SpotLight
Model Sound VrButton
Pano Video VideoPano
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGL WebVR
three.js WebVR Polyfill
React VR A-Frame
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGLGamepad WebVR
three.js WebVR Polyfill
React VR A-Frame
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGLGamepad Audio WebVR
three.js WebVR Polyfill
React VR A-Frame
geildanke.com @ RuhrJS17 @fischaelameer
Browser
WebGLGamepad Audio WebVR Speech
three.js WebVR Polyfill
React VR A-Frame
geildanke.com @ RuhrJS17 @fischaelameer
Libraries Like React VR
Will Not Fix Your UX Design
geildanke.com @ RuhrJS17 @fischaelameer
UX Design
For WebVR Applications
geildanke.com @ RuhrJS17 @fischaelameer
Comfort
Interpretability
Usefulness
Delight
Beau Cronin
https://medium.com/@beaucronin/the-hierarchy-of-needs-in-virtual-reality-development-4333a4833acc
geildanke.com @ RuhrJS17 @fischaelameer
Presence
Comfort
Interpretability
Usefulness
Delight
Beau Cronin
https://medium.com/@beaucronin/the-hierarchy-of-needs-in-virtual-reality-development-4333a4833acc
geildanke.com @ RuhrJS17 @fischaelameer
Presence Comfort
Interpretability
Usefulness
Delight
Safety
geildanke.com @ RuhrJS17 @fischaelameer
UX Design For WebVR
Comfort & Ergonomics
geildanke.com @ RuhrJS17 @fischaelameer
It was the pioneer days; people had to make their own interrogation rooms. Out of
cornmeal. These endless days are finally ending in a blaze. When I say, 'I love you,'
it's not because I want you or because I can't have you. It's my estimation that every
man ever got a statue made of him was one kind of sommbitch or another. Oh my god you
will never believe what happened at school today. From beneath you, it devours. I am
never gonna see a merman, ever.
It was supposed to confuse him, but it just made him peppy. It was like the Heimlich,
with stripes! How did your brain even learn human speech? I'm just so curious.
Apocalypse, we've all been there; the same old trips, why should we care? Frankly, it's
ludicrous to have these interlocking bodies and not...interlock. I just don't see why
everyone's always picking on Marie-Antoinette. You're the one freaky thing in my freaky
world that still makes sense to me. You are talking crazy-person talk.
http://www.commercekitchen.com/whedon-ipsum/
geildanke.com @ RuhrJS17 @fischaelameer
It was the pioneer days; people had to make their own interrogation rooms. Out of
cornmeal. These endless days are finally ending in a blaze. When I say, 'I love you,'
it's not because I want you or because I can't have you. It's my estimation that every
man ever got a statue made of him was one kind of sommbitch or another. Oh my god you
will never believe what happened at school today. From beneath you, it devours. I am
never gonna see a merman, ever.
It was supposed to confuse him, but it just made him peppy. It was like the Heimlich,
with stripes! How did your brain even learn human speech? I'm just so curious.
Apocalypse, we've all been there; the same old trips, why should we care? Frankly, it's
ludicrous to have these interlocking bodies and not...interlock. I just don't see why
everyone's always picking on Marie-Antoinette. You're the one freaky thing in my freaky
world that still makes sense to me. You are talking crazy-person talk.
http://www.commercekitchen.com/whedon-ipsum/
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
It was the pioneer days; people had to make their own interrogation rooms. Out of
cornmeal. These endless days are finally ending in a blaze. When I say, 'I love you,'
it's not because I want you or because I can't have you. It's my estimation that every
man ever got a statue made of him was one kind of sommbitch or another. Oh my god you
will never believe what happened at school today. From beneath you, it devours. I am
never gonna see a merman, ever.
It was supposed to confuse him, but it just made him peppy. It was like the Heimlich,
with stripes! How did your brain even learn human speech? I'm just so curious.
Apocalypse, we've all been there; the same old trips, why should we care? Frankly, it's
ludicrous to have these interlocking bodies and not...interlock. I just don't see why
everyone's always picking on Marie-Antoinette. You're the one freaky thing in my freaky
world that still makes sense to me. You are talking crazy-person talk.
http://www.commercekitchen.com/whedon-ipsum/
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
70°
geildanke.com @ RuhrJS17 @fischaelameer
130°
Comfortably bending
30° to each side
geildanke.com @ RuhrJS17 @fischaelameer
Stretching
80° to each side
https://www.youtube.com/watch?v=00vzW2-PvvE
geildanke.com @ RuhrJS17 @fischaelameer
0.5m
20m
geildanke.com @ RuhrJS17 @fischaelameer
~10ppd
60ppd
Today’s 

Pixel Density
Optimal
Pixel Density
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameerhttps://www.youtube.com/watch?v=ES9jArHRFHQ
geildanke.com @ RuhrJS17 @fischaelameer
geildanke.com @ RuhrJS17 @fischaelameer
DMM
geildanke.com @ RuhrJS17 @fischaelameer
Distance-Independent Millimeter
DMM
https://sizecalc.com
https://sizecalc.com
geildanke.com @ RuhrJS17 @fischaelameer
UX Design For WebVR
Interpretability
geildanke.com @ RuhrJS17 @fischaelameer
Use correct scales
geildanke.com @ RuhrJS17 @fischaelameer
Add feedback
geildanke.com @ RuhrJS17 @fischaelameer
Add feedback
geildanke.com @ RuhrJS17 @fischaelameer
Add feedback
geildanke.com @ RuhrJS17 @fischaelameer
Add feedback
geildanke.com @ RuhrJS17 @fischaelameer
Add gaze cues
geildanke.com @ RuhrJS17 @fischaelameer
Add gaze cues
geildanke.com @ RuhrJS17 @fischaelameer
Add gaze cues
geildanke.com @ RuhrJS17 @fischaelameer
Add gaze cues
geildanke.com @ RuhrJS17 @fischaelameer
UX Design For WebVR
Safety
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Trigger Phobias.
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Trigger Phobias.
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Move Things Fast

Towards the Camera.
Do Not Trigger Phobias.
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Attach Things

Near the Camera.
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Attach Things

Near the Camera.
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Attach Things

Near the Camera.
Respect the Personal Space.
geildanke.com @ RuhrJS17 @fischaelameerIcon made by Freepik from www.flaticon.com
geildanke.com @ RuhrJS17 @fischaelameerIcon made by Freepik from www.flaticon.com
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Use Acceleration.
https://web.colby.edu/cogblog/2016/05/09/2451/
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Use Acceleration.
https://web.colby.edu/cogblog/2016/05/09/2451/
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Move the Horizon
Or the Camera.
Do Not Use Acceleration.
https://web.colby.edu/cogblog/2016/05/09/2451/
geildanke.com @ RuhrJS17 @fischaelameer
Do Not Move the Horizon
Or the Camera.
Do Not Use Acceleration.
Keep a Low Latency
And a High Framerate.
https://web.colby.edu/cogblog/2016/05/09/2451/
geildanke.com @ RuhrJS17 @fischaelameer
Add a Stable Focus Point.
http://vtrav.com/2015/04/nose-reduces-simulator-sickness/
geildanke.com @ RuhrJS17 @fischaelameer
Add a Stable Focus Point.
http://vtrav.com/2015/04/nose-reduces-simulator-sickness/
geildanke.com @ RuhrJS17 @fischaelameer
Avoid Flicker Or Blur.
Add a Stable Focus Point.
http://vtrav.com/2015/04/nose-reduces-simulator-sickness/
geildanke.com @ RuhrJS17 @fischaelameer
Avoid Flicker Or Blur.
Add a Stable Focus Point.
Support Short Usage.
http://vtrav.com/2015/04/nose-reduces-simulator-sickness/
geildanke.com @ RuhrJS17 @fischaelameer
Abstract Patterns Are Better Than Realistic Ones.
https://blog.mozvr.com/a-painter/ http://www.kotaku.co.uk/2016/12/16/the-state-of-virtual-reality-in-2016
geildanke.com @ RuhrJS17 @fischaelameer
Abstract Patterns Are Better Than Realistic Ones.
https://blog.mozvr.com/a-painter/ http://www.kotaku.co.uk/2016/12/16/the-state-of-virtual-reality-in-2016
geildanke.com @ RuhrJS17 @fischaelameer
You Are Responsible For The
Well-Being Of Your Users.
geildanke.com @ RuhrJS17 @fischaelameer
https://www.reddit.com/r/Vive/comments/4i49d3/when_instinct_takes_over/
https://www.reddit.com/r/VRFail/comments/4s7nc1/friend_loses_his_vrginity_and_then_some_crappy/
geildanke.com @ RuhrJS17 @fischaelameer
https://www.reddit.com/r/Vive/comments/4i49d3/when_instinct_takes_over/
https://www.reddit.com/r/VRFail/comments/4s7nc1/friend_loses_his_vrginity_and_then_some_crappy/
geildanke.com @ RuhrJS17 @fischaelameer
You Are Responsible For The
Well-Being Of Your Users.
geildanke.com @ RuhrJS17 @fischaelameer
http://www.uxofvr.com/
https://webvr.rocks/
General Information
https://webvr-slack.herokuapp.com/
Community
https://www.reddit.com/r/WebVR/
https://w3c.github.io/webvr/
https://github.com/googlevr/webvr-polyfill
https://threejs.org/
API, Frameworks, Libraries
https://facebook.github.io/react-vr/
https://aframe.io/
https://geildanke.com/en/vr/
Geil,Danke!
https://bit.ly/webvrcomet
geildanke.com @ RuhrJS17 @fischaelameer
Thanks For Listening!

More Related Content

What's hot

Html5 game programming overview
Html5 game programming overviewHtml5 game programming overview
Html5 game programming overview
민태 김
 

What's hot (10)

Reactive datastore demo (2020 03-21)
Reactive datastore demo (2020 03-21)Reactive datastore demo (2020 03-21)
Reactive datastore demo (2020 03-21)
 
Why Redux-Observable?
Why Redux-Observable?Why Redux-Observable?
Why Redux-Observable?
 
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
 
Shootting Game
Shootting GameShootting Game
Shootting Game
 
Puppeteer can automate that! - Frontmania
Puppeteer can automate that! - FrontmaniaPuppeteer can automate that! - Frontmania
Puppeteer can automate that! - Frontmania
 
Android workshop
Android workshopAndroid workshop
Android workshop
 
Developing web-apps like it's 2013
Developing web-apps like it's 2013Developing web-apps like it's 2013
Developing web-apps like it's 2013
 
Vue.js + Django - configuración para desarrollo con webpack y HMR
Vue.js + Django - configuración para desarrollo con webpack y HMRVue.js + Django - configuración para desarrollo con webpack y HMR
Vue.js + Django - configuración para desarrollo con webpack y HMR
 
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)
Remote controlling Parrot AR Drone with Spring Boot & Vaadin (JavaCro15)
 
Html5 game programming overview
Html5 game programming overviewHtml5 game programming overview
Html5 game programming overview
 

Similar to How to Make Your Users Sick in 60 Seconds – About UX Design, WebVR and React VR

Webgl para JavaScripters
Webgl para JavaScriptersWebgl para JavaScripters
Webgl para JavaScripters
gerbille
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
Remy Sharp
 
Is html5-ready-workshop-110727181512-phpapp02
Is html5-ready-workshop-110727181512-phpapp02Is html5-ready-workshop-110727181512-phpapp02
Is html5-ready-workshop-110727181512-phpapp02
PL dream
 

Similar to How to Make Your Users Sick in 60 Seconds – About UX Design, WebVR and React VR (20)

An Introduction to WebVR – or How to make your user sick in 60 seconds
An Introduction to WebVR – or How to make your user sick in 60 secondsAn Introduction to WebVR – or How to make your user sick in 60 seconds
An Introduction to WebVR – or How to make your user sick in 60 seconds
 
More Ways to Make Your Users Sick – A talk about WebVR and UX Design
More Ways to Make Your Users Sick – A talk about WebVR and UX DesignMore Ways to Make Your Users Sick – A talk about WebVR and UX Design
More Ways to Make Your Users Sick – A talk about WebVR and UX Design
 
Migrating your Web app to Virtual Reality
Migrating your Web app to Virtual RealityMigrating your Web app to Virtual Reality
Migrating your Web app to Virtual Reality
 
Getting Started in VR with JS
Getting Started in VR with JSGetting Started in VR with JS
Getting Started in VR with JS
 
Goodbye, Flatland! An introduction to React VR and what it means for web dev...
Goodbye, Flatland! An introduction to React VR  and what it means for web dev...Goodbye, Flatland! An introduction to React VR  and what it means for web dev...
Goodbye, Flatland! An introduction to React VR and what it means for web dev...
 
Webgl para JavaScripters
Webgl para JavaScriptersWebgl para JavaScripters
Webgl para JavaScripters
 
Browsers with Wings
Browsers with WingsBrowsers with Wings
Browsers with Wings
 
WebXR: A New Dimension For The Web Writing Virtual and Augmented Reality Apps...
WebXR: A New Dimension For The Web Writing Virtual and Augmented Reality Apps...WebXR: A New Dimension For The Web Writing Virtual and Augmented Reality Apps...
WebXR: A New Dimension For The Web Writing Virtual and Augmented Reality Apps...
 
Writing Virtual And Augmented Reality Apps With Web Technology
Writing Virtual And Augmented Reality Apps With Web TechnologyWriting Virtual And Augmented Reality Apps With Web Technology
Writing Virtual And Augmented Reality Apps With Web Technology
 
Writing Virtual And Augmented Reality Apps With Web Technology
Writing Virtual And Augmented Reality Apps With Web TechnologyWriting Virtual And Augmented Reality Apps With Web Technology
Writing Virtual And Augmented Reality Apps With Web Technology
 
Intro to HTML5
Intro to HTML5Intro to HTML5
Intro to HTML5
 
Leaving Flatland: getting started with WebGL
Leaving Flatland: getting started with WebGLLeaving Flatland: getting started with WebGL
Leaving Flatland: getting started with WebGL
 
Augmented reality in web rtc browser
Augmented reality in web rtc browserAugmented reality in web rtc browser
Augmented reality in web rtc browser
 
Introduction to WebVR Autodesk Forge 2016
Introduction to WebVR Autodesk Forge 2016Introduction to WebVR Autodesk Forge 2016
Introduction to WebVR Autodesk Forge 2016
 
Hacking Reality: Browser-Based VR with HTML5
Hacking Reality: Browser-Based VR with HTML5Hacking Reality: Browser-Based VR with HTML5
Hacking Reality: Browser-Based VR with HTML5
 
HTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymoreHTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymore
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
 
Is html5-ready-workshop-110727181512-phpapp02
Is html5-ready-workshop-110727181512-phpapp02Is html5-ready-workshop-110727181512-phpapp02
Is html5-ready-workshop-110727181512-phpapp02
 
WebXR if X = how?
WebXR if X = how?WebXR if X = how?
WebXR if X = how?
 
I Can't Believe It's Not Flash
I Can't Believe It's Not FlashI Can't Believe It's Not Flash
I Can't Believe It's Not Flash
 

More from GeilDanke

More from GeilDanke (8)

Using New Web APIs For Your Own Pleasure – How I Wrote New Features For My Vi...
Using New Web APIs For Your Own Pleasure – How I Wrote New Features For My Vi...Using New Web APIs For Your Own Pleasure – How I Wrote New Features For My Vi...
Using New Web APIs For Your Own Pleasure – How I Wrote New Features For My Vi...
 
Using New Web APIs For Your Own Pleasure
Using New Web APIs For Your Own PleasureUsing New Web APIs For Your Own Pleasure
Using New Web APIs For Your Own Pleasure
 
Creating Augmented Reality Apps with Web Technology
Creating Augmented Reality Apps with Web TechnologyCreating Augmented Reality Apps with Web Technology
Creating Augmented Reality Apps with Web Technology
 
2016 First steps with Angular 2 – enterjs
2016 First steps with Angular 2 – enterjs2016 First steps with Angular 2 – enterjs
2016 First steps with Angular 2 – enterjs
 
2014 HTML und CSS für Designer – Pubkon
2014 HTML und CSS für Designer – Pubkon2014 HTML und CSS für Designer – Pubkon
2014 HTML und CSS für Designer – Pubkon
 
2013 Digitale Magazine erstellen - Konzeption und Redaktion
2013 Digitale Magazine erstellen - Konzeption und Redaktion2013 Digitale Magazine erstellen - Konzeption und Redaktion
2013 Digitale Magazine erstellen - Konzeption und Redaktion
 
2014 Adobe DPS Update 29
2014 Adobe DPS Update 292014 Adobe DPS Update 29
2014 Adobe DPS Update 29
 
2012 Digital Publishing IDUG Stuttgart
2012 Digital Publishing IDUG Stuttgart2012 Digital Publishing IDUG Stuttgart
2012 Digital Publishing IDUG Stuttgart
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Recently uploaded (20)

Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 

How to Make Your Users Sick in 60 Seconds – About UX Design, WebVR and React VR

  • 1. geildanke.com @ RuhrJS17 @fischaelameer How to Make Your User Sick in 60 Seconds About UX Design, WebVR, and ReactVR
  • 2. geildanke.com @ RuhrJS17 @fischaelameer You Should Care About WebVR Because You Care About Your Users.
  • 3. geildanke.com @ RuhrJS17 @fischaelameer Concepts
  • 4. geildanke.com @ RuhrJS17 @fischaelameer Concepts Code
  • 5. geildanke.com @ RuhrJS17 @fischaelameer Concepts Code Design
  • 6. geildanke.com @ RuhrJS17 @fischaelameer Virtual Reality Is Tricking Our Eyes And Brain to Think of a 2D Image to Be in 3D.
  • 7. geildanke.com @ RuhrJS17 @fischaelameer Virtual Reality Changes The Way We Relate to Technology.
  • 8. geildanke.com @ RuhrJS17 @fischaelameer VR Is Good For Understanding Spatial Relationships
  • 9. geildanke.com @ RuhrJS17 @fischaelameer VR Is Good For Multi Tasking
  • 10. geildanke.com @ RuhrJS17 @fischaelameer VR Is Good For Simulations
  • 11. geildanke.com @ RuhrJS17 @fischaelameer What Is VR Bad At?
  • 12. geildanke.com @ RuhrJS17 @fischaelameer https://www.reddit.com/r/VRFail/comments/4p9zgj/pool_shot/
  • 13. geildanke.com @ RuhrJS17 @fischaelameer https://www.reddit.com/r/VRFail/comments/4p9zgj/pool_shot/
  • 14. geildanke.com @ RuhrJS17 @fischaelameer VR Concepts: Stereoscopic Images
  • 15. geildanke.com @ RuhrJS17 @fischaelameer
  • 16. geildanke.com @ RuhrJS17 @fischaelameer
  • 17. geildanke.com @ RuhrJS17 @fischaelameer IPD
  • 18. geildanke.com @ RuhrJS17 @fischaelameer InterPupillary Distance
  • 19.
  • 20. geildanke.com @ RuhrJS17 @fischaelameer
  • 21. geildanke.com @ RuhrJS17 @fischaelameer
  • 22. geildanke.com @ RuhrJS17 @fischaelameer VR Concepts: Tracking
  • 23. geildanke.com @ RuhrJS17 @fischaelameer Rotation Position
  • 24. geildanke.com @ RuhrJS17 @fischaelameer Rotation Position
  • 25. geildanke.com @ RuhrJS17 @fischaelameer Rotation Position
  • 26. geildanke.com @ RuhrJS17 @fischaelameer http://bit.ly/2iK1Zv7
  • 27. geildanke.com @ RuhrJS17 @fischaelameer http://bit.ly/2iK1Zv7
  • 28. geildanke.com @ RuhrJS17 @fischaelameer Rotation Position
  • 29. geildanke.com @ RuhrJS17 @fischaelameer Rotation Position
  • 30. geildanke.com @ RuhrJS17 @fischaelameer WebVR Concepts: Tech Stack
  • 31. geildanke.com @ RuhrJS17 @fischaelameer Browser https://github.com/mrdoob/three.js
  • 32. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGL https://github.com/mrdoob/three.js
  • 33. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGL WebVR https://github.com/mrdoob/three.js
  • 34. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGL WebVR three.js Ricardo Cabello https://github.com/mrdoob/three.js
  • 35. geildanke.com @ RuhrJS17 @fischaelameer https://caniuse.com/#search=webvr
  • 36. geildanke.com @ RuhrJS17 @fischaelameer
  • 37. geildanke.com @ RuhrJS17 @fischaelameer
  • 38. geildanke.com @ RuhrJS17 @fischaelameer
  • 39. geildanke.com @ RuhrJS17 @fischaelameer
  • 40. geildanke.com @ RuhrJS17 @fischaelameer
  • 41. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGL WebVR three.js WebVR Polyfill https://github.com/googlevr/webvr-polyfill
  • 42. geildanke.com @ RuhrJS17 @fischaelameer Static Image With Fallback
  • 43. geildanke.com @ RuhrJS17 @fischaelameer Static Image With Fallback WebGL With Touch And Gyroscope
  • 44. geildanke.com @ RuhrJS17 @fischaelameer Static Image With Fallback WebGL With Touch And Gyroscope Mobile & Desktop VR Devices
  • 45. geildanke.com @ RuhrJS17 @fischaelameer WebVR Code: Full-Sphere Video
  • 46.
  • 47.
  • 48. geildanke.com @ RuhrJS17 @fischaelameer
  • 49. geildanke.com @ RuhrJS17 @fischaelameer
  • 50. geildanke.com @ RuhrJS17 @fischaelameer x: 0, y: 0, z: 0
  • 51. geildanke.com @ RuhrJS17 @fischaelameer x: 0, y: 0, z: 0
  • 52. geildanke.com @ RuhrJS17 @fischaelameer
  • 53. geildanke.com @ RuhrJS17 @fischaelameer let scene = new THREE.Scene(); let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 ); let renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); let geometry = new THREE.SphereGeometry( 500, 60, 40 ); geometry.scale( -1, 1, 1 ); let video = document.createElement( 'video' ); let videoTexture = new THREE.VideoTexture( video ); let videoMaterial = new THREE.MeshBasicMaterial( { map: videoTexture } ); let mesh = new THREE.Mesh( geometry, videoMaterial ); function render() { requestAnimationFrame( render ); renderer.render( scene, camera ); } render();
  • 54. geildanke.com @ RuhrJS17 @fischaelameer let scene = new THREE.Scene(); let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 ); let renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); let geometry = new THREE.SphereGeometry( 500, 60, 40 ); geometry.scale( -1, 1, 1 ); let video = document.createElement( 'video' ); let videoTexture = new THREE.VideoTexture( video ); let videoMaterial = new THREE.MeshBasicMaterial( { map: videoTexture } ); let mesh = new THREE.Mesh( geometry, videoMaterial ); function render() { requestAnimationFrame( render ); renderer.render( scene, camera ); } render();
  • 55. geildanke.com @ RuhrJS17 @fischaelameer let scene = new THREE.Scene(); let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 ); let renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); let geometry = new THREE.SphereGeometry( 500, 60, 40 ); geometry.scale( -1, 1, 1 ); let video = document.createElement( 'video' ); let videoTexture = new THREE.VideoTexture( video ); let videoMaterial = new THREE.MeshBasicMaterial( { map: videoTexture } ); let mesh = new THREE.Mesh( geometry, videoMaterial ); function render() { requestAnimationFrame( render ); renderer.render( scene, camera ); } render();
  • 56. geildanke.com @ RuhrJS17 @fischaelameer let scene = new THREE.Scene(); let camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 10000 ); let renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild( renderer.domElement ); let geometry = new THREE.SphereGeometry( 500, 60, 40 ); geometry.scale( -1, 1, 1 ); let video = document.createElement( 'video' ); let videoTexture = new THREE.VideoTexture( video ); let videoMaterial = new THREE.MeshBasicMaterial( { map: videoTexture } ); let mesh = new THREE.Mesh( geometry, videoMaterial ); function render() { requestAnimationFrame( render ); renderer.render( scene, camera ); } render();
  • 57. geildanke.com @ RuhrJS17 @fischaelameer let vrDisplay; navigator.getVRDisplays().then( function( displays ) { if ( displays.length > 0 ) { vrDisplay = displays[ 0 ]; } else { console.log( 'No VR Displays found.' ); } });
  • 58. geildanke.com @ RuhrJS17 @fischaelameer VRDisplay.isConnected VRDisplay.isPresenting VRDisplay.getEyeParameters() VRDisplay.requestAnimationFrame()
  • 59. geildanke.com @ RuhrJS17 @fischaelameer vrDisplay.requestPresent( [ { source: myCanvas } ] );
  • 60. geildanke.com @ RuhrJS17 @fischaelameer myButton.addEventListener( 'click', function() { vrDisplay.requestPresent( [ { source: myCanvas } ] ); });
  • 61. geildanke.com @ RuhrJS17 @fischaelameer myButton.addEventListener( 'click', function() { vrDisplay.requestPresent( [ { source: myCanvas } ] ) .then( function() { vrDisplay.requestAnimationFrame( render ); }); });
  • 62. geildanke.com @ RuhrJS17 @fischaelameer function render() { vrDisplay.requestAnimationFrame( render ); }
  • 63. geildanke.com @ RuhrJS17 @fischaelameer function render() { vrDisplay.requestAnimationFrame( render ); // update display pose // update scene and meshes }
  • 64. geildanke.com @ RuhrJS17 @fischaelameer let pose = vrDisplay.getPose(); console.log( pose.orientation ); // [ 0, 0, 0, 1 ] // [ -0.0000724312, -0.06752134, 0.0028374712, 0.9977243 ] console.log( pose.position ); // null // [ 0.05234, -0.043485, 0.0003243 ]
  • 65. geildanke.com @ RuhrJS17 @fischaelameer let leftEyeParameters = vrDisplay.getEyeParameters( 'left' ); console.log( leftEyeParameters.offset ); // [ -0.03, 0, 0 ] console.log( leftEyeParameters.renderWidth ); // 640.5 console.log( leftEyeParameters.renderHeight ); // 721
  • 66. geildanke.com @ RuhrJS17 @fischaelameer function render() { vrDisplay.requestAnimationFrame( render ); // update display pose // update scene and meshes vrDisplay.submitFrame( pose ); }
  • 67. geildanke.com @ RuhrJS17 @fischaelameer
  • 68. geildanke.com @ RuhrJS17 @fischaelameer
  • 69. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGL WebVR three.js WebVR Polyfill
  • 70. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGL WebVR three.js WebVR Polyfill A-Frame
  • 71. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGL WebVR three.js WebVR Polyfill A-FrameReact VR
  • 72. geildanke.com @ RuhrJS17 @fischaelameer A-Frame by Mozilla
  • 73. geildanke.com @ RuhrJS17 @fischaelameer <head> <script src="aframe.js"></script> </head> <body> <a-scene> <a-assets> <video id="video" src="video.mp4" autoplay loop></video> </a-assets> <a-videosphere src="#video"></a-videosphere> </a-scene> </body>
  • 74. geildanke.com @ RuhrJS17 @fischaelameer <head> <script src="aframe.js"></script> </head> <body> <a-scene> <a-assets> <video id="video" src="video.mp4" autoplay loop></video> </a-assets> <a-videosphere src="#video"></a-videosphere> </a-scene> </body>
  • 75. geildanke.com @ RuhrJS17 @fischaelameer <head> <script src="aframe.js"></script> </head> <body> <a-scene> <a-assets> <video id="video" src="video.mp4" autoplay loop></video> </a-assets> <a-videosphere src="#video"></a-videosphere> </a-scene> </body>
  • 76. geildanke.com @ RuhrJS17 @fischaelameer <head> <script src="aframe.js"></script> </head> <body> <a-scene> <a-assets> <video id="video" src="video.mp4" autoplay loop></video> </a-assets> <a-videosphere src="#video"></a-videosphere> </a-scene> </body>
  • 77. <a-box> <a-cone> <a-cylinder> <a-dodecahedron> <a-icosahedron> <a-octahedron> <a-ring> <a-sphere> <a-tetrahedron> <a-torus-knot> <a-torus>
  • 78. geildanke.com @ RuhrJS17 @fischaelameer <a-video> <a-videosphere> <a-image> <a-sound> <a-gltf-model> <a-obj-model> <a-text> <a-light> <a-sky> <a-cursor> <a-box> <a-cone> <a-cylinder> <a-dodecahedron> <a-icosahedron> <a-octahedron> <a-ring> <a-sphere> <a-tetrahedron> <a-torus-knot> <a-torus>
  • 79. geildanke.com @ RuhrJS17 @fischaelameer React VR by Facebook
  • 80. geildanke.com @ RuhrJS17 @fischaelameer import React from 'react'; import { AppRegistry, VideoPano, View } from 'react-vr'; class GEILDANKE_REACTVR_PANO extends React.Component { render() { return ( <View> <VideoPano source={{uri: 'video.mp4'}} /> </View> ); } }; AppRegistry.registerComponent('GEILDANKE_REACTVR_PANO', () => GEILDANKE_REACTVR_PANO);
  • 81. geildanke.com @ RuhrJS17 @fischaelameer import React from 'react'; import { AppRegistry, VideoPano, View } from 'react-vr'; class GEILDANKE_REACTVR_PANO extends React.Component { render() { return ( <View> <VideoPano source={{uri: 'video.mp4'}} /> </View> ); } }; AppRegistry.registerComponent('GEILDANKE_REACTVR_PANO', () => GEILDANKE_REACTVR_PANO);
  • 82. geildanke.com @ RuhrJS17 @fischaelameer import React from 'react'; import { AppRegistry, VideoPano, View } from 'react-vr'; class GEILDANKE_REACTVR_PANO extends React.Component { render() { return ( <View> <VideoPano source={{uri: 'video.mp4'}} /> </View> ); } }; AppRegistry.registerComponent('GEILDANKE_REACTVR_PANO', () => GEILDANKE_REACTVR_PANO);
  • 83. geildanke.com @ RuhrJS17 @fischaelameer Box Cylinder CylindricalPanel Plane Sphere AmbientLight DirectionalLight PointLight SpotLight Model Sound VrButton Pano Video VideoPano
  • 84. geildanke.com @ RuhrJS17 @fischaelameer
  • 85. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGL WebVR three.js WebVR Polyfill React VR A-Frame
  • 86. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGLGamepad WebVR three.js WebVR Polyfill React VR A-Frame
  • 87. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGLGamepad Audio WebVR three.js WebVR Polyfill React VR A-Frame
  • 88. geildanke.com @ RuhrJS17 @fischaelameer Browser WebGLGamepad Audio WebVR Speech three.js WebVR Polyfill React VR A-Frame
  • 89. geildanke.com @ RuhrJS17 @fischaelameer Libraries Like React VR Will Not Fix Your UX Design
  • 90. geildanke.com @ RuhrJS17 @fischaelameer UX Design For WebVR Applications
  • 91. geildanke.com @ RuhrJS17 @fischaelameer Comfort Interpretability Usefulness Delight Beau Cronin https://medium.com/@beaucronin/the-hierarchy-of-needs-in-virtual-reality-development-4333a4833acc
  • 92. geildanke.com @ RuhrJS17 @fischaelameer Presence Comfort Interpretability Usefulness Delight Beau Cronin https://medium.com/@beaucronin/the-hierarchy-of-needs-in-virtual-reality-development-4333a4833acc
  • 93. geildanke.com @ RuhrJS17 @fischaelameer Presence Comfort Interpretability Usefulness Delight Safety
  • 94. geildanke.com @ RuhrJS17 @fischaelameer UX Design For WebVR Comfort & Ergonomics
  • 95. geildanke.com @ RuhrJS17 @fischaelameer It was the pioneer days; people had to make their own interrogation rooms. Out of cornmeal. These endless days are finally ending in a blaze. When I say, 'I love you,' it's not because I want you or because I can't have you. It's my estimation that every man ever got a statue made of him was one kind of sommbitch or another. Oh my god you will never believe what happened at school today. From beneath you, it devours. I am never gonna see a merman, ever. It was supposed to confuse him, but it just made him peppy. It was like the Heimlich, with stripes! How did your brain even learn human speech? I'm just so curious. Apocalypse, we've all been there; the same old trips, why should we care? Frankly, it's ludicrous to have these interlocking bodies and not...interlock. I just don't see why everyone's always picking on Marie-Antoinette. You're the one freaky thing in my freaky world that still makes sense to me. You are talking crazy-person talk. http://www.commercekitchen.com/whedon-ipsum/
  • 96. geildanke.com @ RuhrJS17 @fischaelameer It was the pioneer days; people had to make their own interrogation rooms. Out of cornmeal. These endless days are finally ending in a blaze. When I say, 'I love you,' it's not because I want you or because I can't have you. It's my estimation that every man ever got a statue made of him was one kind of sommbitch or another. Oh my god you will never believe what happened at school today. From beneath you, it devours. I am never gonna see a merman, ever. It was supposed to confuse him, but it just made him peppy. It was like the Heimlich, with stripes! How did your brain even learn human speech? I'm just so curious. Apocalypse, we've all been there; the same old trips, why should we care? Frankly, it's ludicrous to have these interlocking bodies and not...interlock. I just don't see why everyone's always picking on Marie-Antoinette. You're the one freaky thing in my freaky world that still makes sense to me. You are talking crazy-person talk. http://www.commercekitchen.com/whedon-ipsum/
  • 97. geildanke.com @ RuhrJS17 @fischaelameer
  • 98. geildanke.com @ RuhrJS17 @fischaelameer It was the pioneer days; people had to make their own interrogation rooms. Out of cornmeal. These endless days are finally ending in a blaze. When I say, 'I love you,' it's not because I want you or because I can't have you. It's my estimation that every man ever got a statue made of him was one kind of sommbitch or another. Oh my god you will never believe what happened at school today. From beneath you, it devours. I am never gonna see a merman, ever. It was supposed to confuse him, but it just made him peppy. It was like the Heimlich, with stripes! How did your brain even learn human speech? I'm just so curious. Apocalypse, we've all been there; the same old trips, why should we care? Frankly, it's ludicrous to have these interlocking bodies and not...interlock. I just don't see why everyone's always picking on Marie-Antoinette. You're the one freaky thing in my freaky world that still makes sense to me. You are talking crazy-person talk. http://www.commercekitchen.com/whedon-ipsum/
  • 99. geildanke.com @ RuhrJS17 @fischaelameer
  • 100. geildanke.com @ RuhrJS17 @fischaelameer
  • 101. geildanke.com @ RuhrJS17 @fischaelameer
  • 102. geildanke.com @ RuhrJS17 @fischaelameer
  • 103. geildanke.com @ RuhrJS17 @fischaelameer 70°
  • 104. geildanke.com @ RuhrJS17 @fischaelameer 130° Comfortably bending 30° to each side
  • 105. geildanke.com @ RuhrJS17 @fischaelameer Stretching 80° to each side https://www.youtube.com/watch?v=00vzW2-PvvE
  • 106. geildanke.com @ RuhrJS17 @fischaelameer 0.5m 20m
  • 107. geildanke.com @ RuhrJS17 @fischaelameer ~10ppd 60ppd Today’s 
 Pixel Density Optimal Pixel Density
  • 108. geildanke.com @ RuhrJS17 @fischaelameer
  • 109. geildanke.com @ RuhrJS17 @fischaelameer
  • 110. geildanke.com @ RuhrJS17 @fischaelameerhttps://www.youtube.com/watch?v=ES9jArHRFHQ
  • 111. geildanke.com @ RuhrJS17 @fischaelameer
  • 112. geildanke.com @ RuhrJS17 @fischaelameer DMM
  • 113. geildanke.com @ RuhrJS17 @fischaelameer Distance-Independent Millimeter DMM
  • 116. geildanke.com @ RuhrJS17 @fischaelameer UX Design For WebVR Interpretability
  • 117. geildanke.com @ RuhrJS17 @fischaelameer Use correct scales
  • 118. geildanke.com @ RuhrJS17 @fischaelameer Add feedback
  • 119. geildanke.com @ RuhrJS17 @fischaelameer Add feedback
  • 120. geildanke.com @ RuhrJS17 @fischaelameer Add feedback
  • 121. geildanke.com @ RuhrJS17 @fischaelameer Add feedback
  • 122. geildanke.com @ RuhrJS17 @fischaelameer Add gaze cues
  • 123. geildanke.com @ RuhrJS17 @fischaelameer Add gaze cues
  • 124. geildanke.com @ RuhrJS17 @fischaelameer Add gaze cues
  • 125. geildanke.com @ RuhrJS17 @fischaelameer Add gaze cues
  • 126. geildanke.com @ RuhrJS17 @fischaelameer UX Design For WebVR Safety
  • 127. geildanke.com @ RuhrJS17 @fischaelameer Do Not Trigger Phobias.
  • 128. geildanke.com @ RuhrJS17 @fischaelameer Do Not Trigger Phobias.
  • 129. geildanke.com @ RuhrJS17 @fischaelameer Do Not Move Things Fast
 Towards the Camera. Do Not Trigger Phobias.
  • 130. geildanke.com @ RuhrJS17 @fischaelameer Do Not Attach Things
 Near the Camera.
  • 131. geildanke.com @ RuhrJS17 @fischaelameer Do Not Attach Things
 Near the Camera.
  • 132. geildanke.com @ RuhrJS17 @fischaelameer Do Not Attach Things
 Near the Camera. Respect the Personal Space.
  • 133. geildanke.com @ RuhrJS17 @fischaelameerIcon made by Freepik from www.flaticon.com
  • 134. geildanke.com @ RuhrJS17 @fischaelameerIcon made by Freepik from www.flaticon.com
  • 135.
  • 136.
  • 137. geildanke.com @ RuhrJS17 @fischaelameer Do Not Use Acceleration. https://web.colby.edu/cogblog/2016/05/09/2451/
  • 138. geildanke.com @ RuhrJS17 @fischaelameer Do Not Use Acceleration. https://web.colby.edu/cogblog/2016/05/09/2451/
  • 139. geildanke.com @ RuhrJS17 @fischaelameer Do Not Move the Horizon Or the Camera. Do Not Use Acceleration. https://web.colby.edu/cogblog/2016/05/09/2451/
  • 140. geildanke.com @ RuhrJS17 @fischaelameer Do Not Move the Horizon Or the Camera. Do Not Use Acceleration. Keep a Low Latency And a High Framerate. https://web.colby.edu/cogblog/2016/05/09/2451/
  • 141. geildanke.com @ RuhrJS17 @fischaelameer Add a Stable Focus Point. http://vtrav.com/2015/04/nose-reduces-simulator-sickness/
  • 142. geildanke.com @ RuhrJS17 @fischaelameer Add a Stable Focus Point. http://vtrav.com/2015/04/nose-reduces-simulator-sickness/
  • 143. geildanke.com @ RuhrJS17 @fischaelameer Avoid Flicker Or Blur. Add a Stable Focus Point. http://vtrav.com/2015/04/nose-reduces-simulator-sickness/
  • 144. geildanke.com @ RuhrJS17 @fischaelameer Avoid Flicker Or Blur. Add a Stable Focus Point. Support Short Usage. http://vtrav.com/2015/04/nose-reduces-simulator-sickness/
  • 145. geildanke.com @ RuhrJS17 @fischaelameer Abstract Patterns Are Better Than Realistic Ones. https://blog.mozvr.com/a-painter/ http://www.kotaku.co.uk/2016/12/16/the-state-of-virtual-reality-in-2016
  • 146. geildanke.com @ RuhrJS17 @fischaelameer Abstract Patterns Are Better Than Realistic Ones. https://blog.mozvr.com/a-painter/ http://www.kotaku.co.uk/2016/12/16/the-state-of-virtual-reality-in-2016
  • 147. geildanke.com @ RuhrJS17 @fischaelameer You Are Responsible For The Well-Being Of Your Users.
  • 148. geildanke.com @ RuhrJS17 @fischaelameer https://www.reddit.com/r/Vive/comments/4i49d3/when_instinct_takes_over/ https://www.reddit.com/r/VRFail/comments/4s7nc1/friend_loses_his_vrginity_and_then_some_crappy/
  • 149. geildanke.com @ RuhrJS17 @fischaelameer https://www.reddit.com/r/Vive/comments/4i49d3/when_instinct_takes_over/ https://www.reddit.com/r/VRFail/comments/4s7nc1/friend_loses_his_vrginity_and_then_some_crappy/
  • 150. geildanke.com @ RuhrJS17 @fischaelameer You Are Responsible For The Well-Being Of Your Users.
  • 151. geildanke.com @ RuhrJS17 @fischaelameer http://www.uxofvr.com/ https://webvr.rocks/ General Information https://webvr-slack.herokuapp.com/ Community https://www.reddit.com/r/WebVR/ https://w3c.github.io/webvr/ https://github.com/googlevr/webvr-polyfill https://threejs.org/ API, Frameworks, Libraries https://facebook.github.io/react-vr/ https://aframe.io/ https://geildanke.com/en/vr/ Geil,Danke! https://bit.ly/webvrcomet
  • 152. geildanke.com @ RuhrJS17 @fischaelameer Thanks For Listening!