webvr - mobiletechcon berlin 2016
TRANSCRIPT
WebVRVirtual Reality in your browsers…
Carsten Sandtner (@casarock)
Short History Of VR
Project Headsight1961
Sensorama~1962
http
s://u
ploa
d.w
ikim
edia
.org
/wik
iped
ia/c
omm
ons/
d/dc
/Sen
sora
ma-
mor
ton-
heilig
-virt
ual-r
ealit
y-he
adse
t.jpg
„The ultimate display would, of course, be a room within which the computer can control the existence of matter. A chair displayed in such a room would be good enough to sit in. Handcuffs displayed in such a room would be confining, and a bullet displayed in
such a room would be fatal. With appropriate programming such a display could literally be the
Wonderland into which Alice walked.“
—Ivan Sutherland
Sega VR1991
Virtua Racer1992
CC
BY-
SA 3
.0, h
ttps:
//com
mon
s.w
ikim
edia
.org
/w/in
dex.
php?
curid
=141
1188
4
Pop-Cultural References
Tron (1982), Star Trek (1987), Matrix (1999)
VR Today
Oculus RiftDK1: 2013 DK2: 2014
Consumer Version: 2016 Imag
e by
Ocu
lus
VR, L
LC
Google Cardboard2014
By E
van-
Amos
http
s://c
omm
ons.
wik
imed
ia.o
rg/w
/inde
x.ph
p?cu
rid=4
5580
283
HTC Vive2016
Imag
e ©
by
HTC
Cor
pora
tion
Playstation VROct. 2016
Imag
e ©
by
Sony
Com
pute
r Ent
erta
inm
ent I
nc.
Microsoft HololensMore AR, not really VR
DevKit: 2016
VR In A Nutshell
http
s://t
witt
er.c
om/g
uyst
ufff/
stat
us/7
1307
5541
7383
9360
0/vi
deo/
1
Mobile Based Setup
http
s://d
evel
oper
.moz
illa.o
rg/e
n-U
S/do
cs/W
eb/A
PI/W
ebVR
_API
/Web
VR_c
once
pts
Computer Based Setup
http
s://d
evel
oper
.moz
illa.o
rg/e
n-U
S/do
cs/W
eb/A
PI/W
ebVR
_API
/Web
VR_c
once
pts
Sensors
http
s://d
evel
oper
.moz
illa.o
rg/e
n-U
S/do
cs/W
eb/A
PI/W
ebVR
_API
/Web
VR_c
once
pts
Field Of View
http
s://d
evel
oper
.moz
illa.o
rg/e
n-U
S/do
cs/W
eb/A
PI/W
ebVR
_API
/Web
VR_c
once
pts
Concepts For VR Apps
http
s://d
evel
oper
.moz
illa.o
rg/e
n-U
S/do
cs/W
eb/A
PI/W
ebVR
_API
/Web
VR_c
once
pts
Concepts For VR Apps
• Eye strain
• Motion Sickness
• Latency
• FPS
• Degrees of Freedom ( DoF )
• Cone of focus
• 3D Positional Audio -> Web Audio API!
http
s://m
edia
.gip
hy.c
om/m
edia
/3o6
gaVA
xUrX
lEFY
pWw
/gip
hy.g
if
What Is WebVR?
DisclaimerCurrently an Editors Draft! (V1.0 since September, 1st 2016)
https://mozvr.github.io/webvr-spec/
Available APIs• Navigator.getVRDevices
• VRDevice/HMDVRDevice
• PositionSensorVRDevice
• VRPositionState
• VREyeParameters
• VRFieldOfView/VRFieldOfViewReadOnly
Get VR Devices
navigator.getVRDevices().then(function(devices) { // Handle found Devices here... });
(HMD) VR Device
for (var i = 0; i < devices.length; ++i) { if (devices[i] instanceof HMDVRDevice) { gHMD = devices[i]; break; } }
Position Sensor
// If device found, get Position Sensor. if (gHMD) { for (var i = 0; i < devices.length; ++i) { if (devices[i] instanceof PositionSensorVRDevice
&& devices[i].hardwareUnitId === gHMD.hardwareUnitId) {
gPositionSensor = devices[i]; break; } } }
Position State
var posState = gPositionSensor.getState(); if (posState.hasPosition) { posPara.textContent = 'Position: x' + (posState.position.x) + ' y' + (posState.position.y) + ' z' + (posState.position.z); }
if (posState.hasOrientation) { orientPara.textContent = 'Orientation: x' + (posState.orientation.x) + ' y' + (posState.orientation.y) + ' z' + (posState.orientation.z); }
Eye Parameters
if (gHMD.getEyeParameters !== undefined) {
var eyeParamsL = gHMD.getEyeParameters('left'); var eyeParamsR = gHMD.getEyeParameters('right');
eyeTranslationL = eyeParamsL.eyeTranslation; eyeTranslationR = eyeParamsR.eyeTranslation; eyeFOVL = eyeParamsL.recommendedFieldOfView; eyeFOVR = eyeParamsR.recommendedFieldOfView;
} else { ... }
Field Of View
function setCustomFOV(up, right, down, left) { var testFOV = new VRFieldOfView(up, right, down, left);
gHMD.setFieldOfView(testFOV, testFOV, 0.01, 10000.0);
var lEye = gHMD.getEyeParameters('left'); var rEye = gHMD.getEyeParameters('right'); console.log(lEye.currentFieldOfView); console.log(rEye.currentFieldOfView); }
„Learn WebGL And Start Creating VR …“
Stereoscopic Rendering in WebGL
/* https://hacks.mozilla.org/2015/09/stereoscopic-rendering-in-webvr/ */ function update() { // ... other stuff happens here ... // left eye gl.viewport(0, 0, canvas.width / 2, canvas.height); mat4.multiply(mvpMatrix, leftEyeProjectionMatrix, leftEyeViewMatrix); gl.uniformMatrix4fv(uniforms.uMVPMatrixLocation, false, mvpMatrix); gl.drawElements(mode, count, type, offset);
// right eye gl.viewport(canvas.width / 2, 0, canvas.width / 2, canvas.height); mat4.multiply(mvpMatrix, rightEyeProjectionMatrix, rightEyeViewMatrix); gl.uniformMatrix4fv(uniforms.uMVPMatrixLocation, false, mvpMatrix); gl.drawElements(gl.TRIANGLES, n, gl.UNSIGNED_SHORT, 0);
requestAnimationFrame(update); }
„… or use a Boilerplate or Frameworks!“
three.js WebVR Renderer
<script src="js/three.min.js"></script> <script src="js/effects/VREffect.js"></script> <script src="js/controls/VRControls.js"></script>
<script> ... var effect = new THREE.VREffect( renderer ); ...
effect.render( scene, camera ); </script>
„Don’t reinvent the squared wheel!“
WebVR Boilerplatethree.js + webVRControls
https://github.com/borismus/webvr-boilerplate
Mozilla A-FrameBuilding blocks for the virtual reality web
– https://aframe.io/
„Use markup to create VR experiences that work across desktop, iOS, Android, and the Oculus Rift.“
Hello World
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello, World!</title> <script src="https://aframe.io/releases/0.2.0/aframe.min.js"></script> </head> <body> <a-scene> <a-box id="mybox" color="#6173F4" width="1" height="1" depth="1" position="1 1 1" rotation="0 0 0" scale="1 1 1"> </a-box> <a-sky color="#bbb"></a-sky> </a-scene> </body> </html>
Animated Box
<!DOCTYPE html> <html> <head>. . .</head> <body> <a-scene> <a-box id="mybox" color="#6173F4" width="1" height="1" depth="1" position="1 1 1" rotation="0 0 0" scale="1 1 1"> <a-animation attribute="rotation" repeat="indefinite" to="0 180 0"></a-animation> </a-box> </a-scene> </body> </html>
Pointer
<!DOCTYPE html> <html> <head>. . .</head> <body> <a-scene> <a-box id="mybox" color="#6173F4" width="1" height="1" depth="1" position="1 1 1" rotation="0 0 0" scale="1 1 1"> <a-animation attribute="rotation" repeat="indefinite" to="0 180 0"></a-animation> </a-box>
<a-camera position="0 0 0"> <a-cursor color="#0000ff"> </a-camera> </a-scene> </body> </html>
Add Events
<!DOCTYPE html> <html> <head>. . .</head> <body> <a-scene> <a-box id="mybox" color="#6173F4" width="1" height="1" depth="1" position="1 1 -5" rotation="0 0 0" scale="1 1 1"> <a-animation attribute="rotation" repeat="indefinite" to="0 180 0"></a-animation> <a-event name="mouseenter" color="#ff0000"></a-event> <a-event name="mouseleave" color="#6173F4"></a-event> </a-box> <a-camera position="0 0 0"> <a-cursor color="#0000ff"> </a-camera> <a-sky color="#bbb"></a-sky> </a-scene> </body> </html>
Add Events (Pure JS)
var box = document.querySelector('#mybox');
box.addEventListener('mouseenter', function () { box.setAttribute('material', {color: '#ff0000'}); });
box.addEventListener('mouseleave', function() { box.setAttribute('material', {color: '#6173F4'}); });
Input Devices?
Imag
e ©
201
5 M
icro
soft
Imag
e by
Ocu
lus
VR, L
LC
Imag
e ©
by
HTC
Cor
pora
tion
By E
van-
Amos
- O
wn
wor
k, C
C B
Y-SA
3.0
, http
s://c
omm
ons.
wik
imed
ia.o
rg/w
/inde
x.ph
p?cu
rid=1
8936
731
By E
van-
Amos
- O
wn
wor
k, C
C B
Y-SA
3.0
, http
s://c
omm
ons.
wik
imed
ia.o
rg/w
/inde
x.ph
p?cu
rid=1
8936
731
Why WebVR?
–Internet
„VR is just for Gaming!“
–Internet
„Using WebGL is complicated.“
Some use cases
• Immersive reportages
• 3D Handbooks/Instructions
• Panorama view without stupid plugins
• Marketing instrument. (Supplements in magazines)
Some great examples
http://www.360syria.com/
http://vrviewer.istaging.co/#!/684173
https://www.washingtonpost.com/video/mars/public/
https://s3.amazonaws.com/vr-asset-repo/heart_demo_slack.html
http://inspirit.unboring.net/
http://a-way-to-go.com/
Conclusion
VR is amazing
WebVR is amazing…
… but it’s not ready (Editors Draft, Browser support)
… and has high Hardware Requirements!
… HMD Devices are not cheap. (Except: Google Cardboard)
… and it’s a pleasure to create content!