SlideShare ist ein Scribd-Unternehmen logo
1 von 149
Downloaden Sie, um offline zu lesen
@ïŹschaelameergeildanke.com #JSCamp
Writing WebXR Apps ‹
with Web Technology
React 360
WebXR Device API
React 360
UX Design for WebXR
WebXR Device API
React 360
WebXR
WebXR
WebVR
WebXR
WebVR WebAR
WebXR
WebVR WebAR
Created by Laura HernĂĄndez from the Noun Project
Created by Laura HernĂĄndez from the Noun Project
Completely DigitalVirtual Reality
Virtual Overlay
Augmented Reality:
Virtual and Real World Coincide
Mixed Reality
WebXR
WebVR WebAR
WebXR Device API
Detect AR/VR Devices
!11
WebXR Device API
Detect AR/VR Devices
!11
Get Device’s Capabilities
WebXR Device API
Detect AR/VR Devices
!11
Get Device’s Capabilities
Get Device’s Orientation/Position
WebXR Device API
Detect AR/VR Devices
!11
Get Device’s Capabilities
Get Device’s Orientation/Position
Display Images With A Fitting Frame Rate
WebVR API
WebVR API
WebXR Device API
WebXR Device API
Supports Augmented Reality
!13
WebXR Device API
Supports Augmented Reality
!13
Clean, Consistent, Predictable
WebXR Device API
Supports Augmented Reality
!13
Clean, Consistent, Predictable
Better Browser Optimizations
WebXR Device API
Supports Augmented Reality
!13
Clean, Consistent, Predictable
Better Browser Optimizations
Unified Input Model
Lifetime of a WebXR App
Request XR Device
Lifetime of a WebXR App
Request XR Device
Reveal XR Functionality
Lifetime of a WebXR App
Request XR Device
Reveal XR Functionality
Request XR Session
Lifetime of a WebXR App
Request XR Device
Reveal XR Functionality
Request XR Session
Run Render Loop
Request a XR Devices
navigator.xr.requestDevice().then(device => {
if (device) {
handleXRAvailable(device);
}
}).catch(error =>
console.error('Unable to request an XR device: ', error);
});
Request a XR Devices
navigator.xr.requestDevice().then(device => {
if (device) {
handleXRAvailable(device);
}
}).catch(error =>
console.error('Unable to request an XR device: ', error);
});
Check XR Session Support
let xrDevice = null;
function handleXRAvailable(device) {
xrDevice = device;
xrDevice.supportsSession({exclusive: true}).then(() => {
addWebXRButtonToPage();
}).catch((error) => {
console.log('Session not supported: ' + error);
});
}
Check XR Session Support
let xrDevice = null;
function handleXRAvailable(device) {
xrDevice = device;
xrDevice.supportsSession({exclusive: true}).then(() => {
addWebXRButtonToPage();
}).catch((error) => {
console.log('Session not supported: ' + error);
});
}
Request a XR Session
function beginXRSession() {
let canvas = document.createElement('canvas');
let context = canvas.getContext('xrpresent');
document.body.appendChild(canvas);
xrDevice.requestSession({exclusive: true, outputContext: context})
.then(onSessionStarted)
.catch((error) => {console.log('requestSession failed: ' + error);});
}
Start a XR Session
let xrSession = null;
let xrFrameOfReference = null;
function onSessionStarted(session) {
xrSession = session;
xrSession.requestFrameOfReference('eyeLevel')
.then((frameOfReference) => {xrFrameOfReference = frameOfReference;})
.then(setupWebGLLayer)
.then(() => {xrSession.requestAnimationFrame(onRenderFrame);});
}
Start a XR Session
let xrSession = null;
let xrFrameOfReference = null;
function onSessionStarted(session) {
xrSession = session;
xrSession.requestFrameOfReference('eyeLevel')
.then((frameOfReference) => {xrFrameOfReference = frameOfReference;})
.then(setupWebGLLayer)
.then(() => {xrSession.requestAnimationFrame(onRenderFrame);});
}
Start a XR Session
let xrSession = null;
let xrFrameOfReference = null;
function onSessionStarted(session) {
xrSession = session;
xrSession.requestFrameOfReference('eyeLevel')
.then((frameOfReference) => {xrFrameOfReference = frameOfReference;})
.then(setupWebGLLayer)
.then(() => {xrSession.requestAnimationFrame(onRenderFrame);});
}
Setup an XRLayer
let glCanvas = document.createElement('canvas');
let glContext = glCanvas.getContext('webgl');
function setupWebGLLayer() {
return glContext.setCompatibleXRDevice(xrDevice).then(() => {
xrSession.baseLayer = new XRWebGLLayer(xrSession, glContext);
});
}
Setup an XRLayer
let glCanvas = document.createElement('canvas');
let glContext = glCanvas.getContext('webgl');
function setupWebGLLayer() {
return glContext.setCompatibleXRDevice(xrDevice).then(() => {
xrSession.baseLayer = new XRWebGLLayer(xrSession, glContext);
});
}
Start a XR Session
let xrSession = null;
let xrFrameOfReference = null;
function onSessionStarted(session) {
xrSession = session;
xrSession.requestFrameOfReference('eyeLevel')
.then((frameOfReference) => {xrFrameOfReference = frameOfReference;})
.then(setupWebGLLayer)
.then(() => {xrSession.requestAnimationFrame(onRenderFrame);});
}
Start the Render Loop
function onRenderFrame(timestamp, xrFrame) {
let pose = xrFrame.getDevicePose(xrFrameOfReference);
if (pose) {
for (let view of xrFrame.views) {
// Draw something
}
}
// Input device code
xrSession.requestAnimationFrame(onRenderFrame);
}
Start the Render Loop
function onRenderFrame(timestamp, xrFrame) {
let pose = xrFrame.getDevicePose(xrFrameOfReference);
if (pose) {
for (let view of xrFrame.views) {
// Draw something
}
}
// Input device code
xrSession.requestAnimationFrame(onRenderFrame);
}
Start the Render Loop
function onRenderFrame(timestamp, xrFrame) {
let pose = xrFrame.getDevicePose(xrFrameOfReference);
if (pose) {
for (let view of xrFrame.views) {
// Draw something
}
}
// Input device code
xrSession.requestAnimationFrame(onRenderFrame);
}
Start the Render Loop
function onRenderFrame(timestamp, xrFrame) {
let pose = xrFrame.getDevicePose(xrFrameOfReference);
if (pose) {
for (let view of xrFrame.views) {
// Draw something
}
}
// Input device code
xrSession.requestAnimationFrame(onRenderFrame);
}
Exit the WebXR Session
function endXRSession() {
if (xrSession) {xrSession.end().then(onSessionEnd);}
}
function onSessionEnd() {
xrSession = null;
window.requestAnimationFrame(onDrawFrame);
}
Exit the WebXR Session
function endXRSession() {
if (xrSession) {xrSession.end().then(onSessionEnd);}
}
function onSessionEnd() {
xrSession = null;
window.requestAnimationFrame(onDrawFrame);
}
Fallback: Magic Window
let mwCanvas = document.createElement('canvas');
let mwContext = mwCanvas.getContext('xrpresent');
document.body.appendChild(mwCanvas);
function beginMagicWindowXRSession() {
xrDevice.requestSession({exclusive: false, outputContext: mwContext})
.then(OnSessionStarted)
.catch((error) => {console.log('requestSession failed: ' + error);});
}
Fallback: Magic Window
let mwCanvas = document.createElement('canvas');
let mwContext = mwCanvas.getContext('xrpresent');
document.body.appendChild(mwCanvas);
function beginMagicWindowXRSession() {
xrDevice.requestSession({exclusive: false, outputContext: mwContext})
.then(OnSessionStarted)
.catch((error) => {console.log('requestSession failed: ' + error);});
}
On Page Load:
Magic Window
On Page Load:
Magic Window
exclusive sessions are supported
On Page Load:
Magic Window
exclusive sessions are supported
Render a
"Start VR" Button
6DOF VR Headset
Created by Hans Gerhard Meier, Bence Bezeredy, Laura HernĂĄndez, Anil, Sachin Modgekar, Ben Davis from the Noun Project
6DOF VR Headset
AR-ready Smartphone
Created by Hans Gerhard Meier, Bence Bezeredy, Laura HernĂĄndez, Anil, Sachin Modgekar, Ben Davis from the Noun Project
6DOF VR Headset
AR-ready Smartphone
3DOF VR Headset
Created by Hans Gerhard Meier, Bence Bezeredy, Laura HernĂĄndez, Anil, Sachin Modgekar, Ben Davis from the Noun Project
Progressive Enhancement
6DOF VR Headset
AR-ready Smartphone
3DOF VR Headset
Created by Hans Gerhard Meier, Bence Bezeredy, Laura HernĂĄndez, Anil, Sachin Modgekar, Ben Davis from the Noun Project
Progressive Enhancement
6DOF VR Headset
AR-ready Smartphone
3DOF VR Headset
WebXR Polyfill
Created by Hans Gerhard Meier, Bence Bezeredy, Laura HernĂĄndez, Anil, Sachin Modgekar, Ben Davis from the Noun Project
Progressive Enhancement
6DOF VR Headset
AR-ready Smartphone
3DOF VR Headset
Magic Window
WebXR Polyfill
Created by Hans Gerhard Meier, Bence Bezeredy, Laura HernĂĄndez, Anil, Sachin Modgekar, Ben Davis from the Noun Project
Progressive Enhancement
6DOF VR Headset
AR-ready Smartphone
3DOF VR Headset
Magic Window
Gyroscope
WebXR Polyfill
Created by Hans Gerhard Meier, Bence Bezeredy, Laura HernĂĄndez, Anil, Sachin Modgekar, Ben Davis from the Noun Project
Progressive Enhancement
6DOF VR Headset
AR-ready Smartphone
3DOF VR Headset
Magic Window
Gyroscope
WebXR Polyfill
Static Image
Created by Hans Gerhard Meier, Bence Bezeredy, Laura HernĂĄndez, Anil, Sachin Modgekar, Ben Davis from the Noun Project
The Future: Augmented Reality
AR Session
The Future: Augmented Reality
AR Session Hit Test
The Future: Augmented Reality
AR Session Hit Test AR Anchors
React 360
https://facebook.github.io/react-360/
React 360
https://aframe.io/
A-Frame
React 360 Full-Sphere Gallery
$ npm install -g react-360-cli
React 360 Full-Sphere Gallery
$ npm install -g react-360-cli
$ react-360 init HelloJSCampBarcelona
React 360 Full-Sphere Gallery
$ npm install -g react-360-cli
$ react-360 init HelloJSCampBarcelona
$ cd HelloJSCampBarcelona
React 360 Full-Sphere Gallery
$ npm install -g react-360-cli
$ react-360 init HelloJSCampBarcelona
$ cd HelloJSCampBarcelona
$ npm start
React 360 Full-Sphere Gallery
$ npm install -g react-360-cli
$ react-360 init HelloJSCampBarcelona
$ cd HelloJSCampBarcelona
$ npm start
React 360 Full-Sphere Gallery
http://localhost:8081/index.html
React 360 Application
React 360 Application React 360 Runtime
React 360 Application React 360 Runtime
Renders 3D Objects
Keeps A High Frame Rate
Web Worker Environment
.
├── __tests__
├── client.js
├── index.html
├── index.js
├── node_modules
├── package.json
├── rn-cli.config.js
└── static_assets
React 360 Full-Sphere Gallery
.
├── __tests__
├── client.js
├── index.html
├── index.js
├── node_modules
├── package.json
├── rn-cli.config.js
└── static_assets
React 360 Full-Sphere Gallery
.
├── __tests__
├── client.js
├── index.html
├── index.js
├── node_modules
├── package.json
├── rn-cli.config.js
└── static_assets
React 360 Full-Sphere Gallery
.
├── __tests__
├── client.js
├── index.html
├── index.js
├── node_modules
├── package.json
├── rn-cli.config.js
└── static_assets
React 360 Full-Sphere Gallery
<body>
<div id="container"></div>
<script src="./client.bundle?platform=vr"></script>
<script>
React360.init(
'index.bundle?platform=vr&dev=true',
document.getElementById('container')
);
</script>
</body>
index.html
<body>
<div id="container"></div>
<script src="./client.bundle?platform=vr"></script>
<script>
React360.init(
'index.bundle?platform=vr&dev=true',
document.getElementById('container')
);
</script>
</body>
index.html
<body>
<div id="container"></div>
<script src="./client.bundle?platform=vr"></script>
<script>
React360.init(
'index.bundle?platform=vr&dev=true',
document.getElementById('container')
);
</script>
</body>
index.html
client.js
import { ReactInstance } from 'react-360-web'
function init(bundle, parent, options = {}) {
const r360 = new ReactInstance(bundle, parent, ‹
{ fullScreen: true, 
options })
r360.renderToSurface(
r360.createRoot('HelloJSCampBarcelona', {}),
r360.getDefaultSurface()
)
r360.compositor.setBackground(r360.getAssetURL(‘360_world.jpg'))
}
window.React360 = { init }
client.js
import { ReactInstance } from 'react-360-web'
function init(bundle, parent, options = {}) {
const r360 = new ReactInstance(bundle, parent, ‹
{ fullScreen: true, 
options })
r360.renderToSurface(
r360.createRoot('HelloJSCampBarcelona', {}),
r360.getDefaultSurface()
)
r360.compositor.setBackground(r360.getAssetURL(‘360_world.jpg'))
}
window.React360 = { init }
client.js
import { ReactInstance } from 'react-360-web'
function init(bundle, parent, options = {}) {
const r360 = new ReactInstance(bundle, parent, ‹
{ fullScreen: true, 
options })
r360.renderToSurface(
r360.createRoot('HelloJSCampBarcelona', {}),
r360.getDefaultSurface()
)
r360.compositor.setBackground(r360.getAssetURL(‘360_world.jpg'))
}
window.React360 = { init }
client.js
import { ReactInstance } from 'react-360-web'
function init(bundle, parent, options = {}) {
const r360 = new ReactInstance(bundle, parent, ‹
{ fullScreen: true, 
options })
r360.renderToSurface(
r360.createRoot('HelloJSCampBarcelona', {}),
r360.getDefaultSurface()
)
r360.compositor.setBackground(r360.getAssetURL(‘360_world.jpg'))
}
window.React360 = { init }
client.js
import { ReactInstance } from 'react-360-web'
function init(bundle, parent, options = {}) {
const r360 = new ReactInstance(bundle, parent, ‹
{ fullScreen: true, 
options })
r360.renderToSurface(
r360.createRoot('HelloJSCampBarcelona', {}),
r360.getDefaultSurface()
)
r360.compositor.setBackground(r360.getAssetURL(‘360_world.jpg'))
}
window.React360 = { init }
index.js
export default class HelloJSCampBarcelona extends React.Component {
render() {
return (
<View style={styles.panel}>
<View style={styles.greetingBox}>
<Text style={styles.greeting}>Welcome to React 360</Text>
</View>
</View>
)
}
}
AppRegistry.registerComponent('HelloJSCampBarcelona', () =>
HelloChainReactPortland)
client.js


r360.renderToSurface(
r360.createRoot('HelloJSCampBarcelona', {
photos: [
{ uri: './static_assets/1.jpg', title: 'Boat', format: '2D' },
{ uri: './static_assets/2.jpg', title: 'Beach', format: '2D' },
{ uri: './static_assets/3.jpg', title: 'OnsieJS', format: '2D' },
],
}),
r360.getDefaultSurface(),
)


index.js
<View style={styles.wrapper}>
<Background uri={current.uri} format={current.format} />
<View style={styles.controls}>
<VrButton onClick={this._prevPhoto} style={styles.button}>
<Text style={styles.buttonText}>{'<'}</Text>
</VrButton>
<View><Text style={styles.title}>{current.title}</Text></View>
<VrButton onClick={this._nextPhoto} style={styles.button}>
<Text style={styles.buttonText}>{'>'}</Text>
</VrButton>
</View>
</View>
index.js
<View style={styles.wrapper}>
<Background uri={current.uri} format={current.format} />
<View style={styles.controls}>
<VrButton onClick={this._prevPhoto} style={styles.button}>
<Text style={styles.buttonText}>{'<'}</Text>
</VrButton>
<View><Text style={styles.title}>{current.title}</Text></View>
<VrButton onClick={this._nextPhoto} style={styles.button}>
<Text style={styles.buttonText}>{'>'}</Text>
</VrButton>
</View>
</View>
index.js
class Background extends React.Component {
constructor(props) {
super()
Environment.setBackgroundImage(props.uri, {format: props.format})
}
componentWillReceiveProps(nxtPrps) {
if (nxtPrps.uri !== this.props.uri ||
nxtPrps.format !== this.props.format) {
Environment.setBackgroundImage(nxtPrps.uri, {format: nxtPrps.format})
}
}
render() { return null }
}
index.js
state = { index: 0 }
_prevPhoto = () => {
let next = this.state.index - 1;
if (next < 0) { next += this.props.photos.length }
this.setState({ index: next })
}
_nextPhoto = () => {
this.setState({ index: this.state.index + 1 })
}
index.js
render() {
const current = this.props.photos[
this.state.index % this.props.photos.length
]
return (
<View style={styles.wrapper}>
<Background uri={current.uri} format={current.format} />


)
}
UX Design for WebXR Apps
Do Not Apply 2D Patterns
No Established Patterns Yet
UX Design Best-Practises
Add Feedback, Respond Immediately
Add Feedback
Add Feedback
Add Feedback
Add Feedback
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.
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.
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.
UX Design Best-Practises
Add Feedback, Respond Immediately
Guide Users with Gaze Cues
Add Gaze Cues
Add Gaze Cues
Add Gaze Cues
Add Gaze Cues
UX Design Best-Practises
Add Feedback, Respond Immediately
Guide Users with Gaze Cues
Provide Information in Context
DoDon’t
Interpretability
Usefulness
Delight
Beau Cronin
https://medium.com/@beaucronin/the-hierarchy-of-needs-in-virtual-reality-development-4333a4833acc
Comfort
Presence
Interpretability
Usefulness
Delight
Beau Cronin
https://medium.com/@beaucronin/the-hierarchy-of-needs-in-virtual-reality-development-4333a4833acc
Comfort
Presence
Interpretability
Usefulness
Delight
Beau Cronin
Comfort & Safety
https://medium.com/@beaucronin/the-hierarchy-of-needs-in-virtual-reality-development-4333a4833acc
Comfort and Safety in AR
There is No Optimal AR Environment
Comfort and Safety in AR
There is No Optimal AR Environment
Consider a User’s Movement
https://giphy.com/gifs/hyperrpg-vr-ouch-3oKIPAKenYskqXzYnC
https://giphy.com/gifs/hyperrpg-vr-ouch-3oKIPAKenYskqXzYnC
Comfort and Safety in AR
There is No Optimal AR Environment
Consider a User’s Movement
Avoid Fatiguing your Users
Comfort and Safety in VR
Do Not Trigger Phobias
Comfort and Safety in VR
Do Not Trigger Phobias
Do Not Move Things Fast Towards the Camera
Comfort and Safety in VR
Do Not Trigger Phobias
Do Not Move Things Fast Towards the Camera
Respect a User’s Safe Space
https://www.reddit.com/r/VRFail/comments/4s7nc1/friend_loses_his_vrginity_and_then_some_crappy/
https://www.reddit.com/r/VRFail/comments/4s7nc1/friend_loses_his_vrginity_and_then_some_crappy/
https://www.techradar.com/
https://www.reddit.com/r/VRFail/comments/4p9zgj/pool_shot/
https://www.reddit.com/r/VRFail/comments/4p9zgj/pool_shot/
Prevent Simulation Sickness
Do Not Move the Horizon or the Camera
Prevent Simulation Sickness
Do Not Move the Horizon or the Camera
Do Not Use Acceleration
https://web.colby.edu/cogblog/2016/05/09/2451/
https://web.colby.edu/cogblog/2016/05/09/2451/
Prevent Simulation Sickness
Do Not Move the Horizon or the Camera
Do Not Use Acceleration
Avoid Flicker and Blur
Prevent Simulation Sickness
Do Not Move the Horizon or the Camera
Do Not Use Acceleration
Avoid Flicker and Blur
Add a Stable Focus Point
@ïŹschaelameergeildanke.com #JSCamp
Respect Your Users!
Test Your Product on a Diverse Audience.
@ïŹschaelameergeildanke.com #JSCamp
Get Involved!
https://github.com/immersive-web/webxr
https://github.com/facebook/react-360
https://github.com/mozilla/aframe-xr

Weitere Àhnliche Inhalte

Was ist angesagt?

Docker 101: Introduction to Docker
Docker 101: Introduction to DockerDocker 101: Introduction to Docker
Docker 101: Introduction to Docker
Docker, Inc.
 
Drone CI/CD è‡Șć‹•ćŒ–æžŹè©ŠćŠéƒšçœČ
Drone CI/CD è‡Șć‹•ćŒ–æžŹè©ŠćŠéƒšçœČDrone CI/CD è‡Șć‹•ćŒ–æžŹè©ŠćŠéƒšçœČ
Drone CI/CD è‡Șć‹•ćŒ–æžŹè©ŠćŠéƒšçœČ
Bo-Yi Wu
 

Was ist angesagt? (20)

Vue Vuex 101
Vue Vuex 101Vue Vuex 101
Vue Vuex 101
 
Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)
 
Hyperledger Fabric practice (v2.0)
Hyperledger Fabric practice (v2.0) Hyperledger Fabric practice (v2.0)
Hyperledger Fabric practice (v2.0)
 
Virtualization, Containers, Docker and scalable container management services
Virtualization, Containers, Docker and scalable container management servicesVirtualization, Containers, Docker and scalable container management services
Virtualization, Containers, Docker and scalable container management services
 
Powershell training material
Powershell training materialPowershell training material
Powershell training material
 
CQRS + Event Sourcing in PHP
CQRS + Event Sourcing in PHPCQRS + Event Sourcing in PHP
CQRS + Event Sourcing in PHP
 
【de:code 2020】 Azure Bot Services ă‚’äœżăŁăŠ Teams bot を開ç™șする
【de:code 2020】 Azure Bot Services ă‚’äœżăŁăŠ Teams bot を開ç™șする【de:code 2020】 Azure Bot Services ă‚’äœżăŁăŠ Teams bot を開ç™șする
【de:code 2020】 Azure Bot Services ă‚’äœżăŁăŠ Teams bot を開ç™șする
 
From Zero to Docker
From Zero to DockerFrom Zero to Docker
From Zero to Docker
 
Docker 101: Introduction to Docker
Docker 101: Introduction to DockerDocker 101: Introduction to Docker
Docker 101: Introduction to Docker
 
Intégration de SonarQube dans GitLab ci
Intégration de SonarQube dans GitLab ciIntégration de SonarQube dans GitLab ci
Intégration de SonarQube dans GitLab ci
 
Docker in real life
Docker in real lifeDocker in real life
Docker in real life
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 
우아한 ëȘšë…žëŠŹìŠ€
우아한 ëȘšë…žëŠŹìŠ€ìš°ì•„í•œ ëȘšë…žëŠŹìŠ€
우아한 ëȘšë…žëŠŹìŠ€
 
Drone CI/CD è‡Șć‹•ćŒ–æžŹè©ŠćŠéƒšçœČ
Drone CI/CD è‡Șć‹•ćŒ–æžŹè©ŠćŠéƒšçœČDrone CI/CD è‡Șć‹•ćŒ–æžŹè©ŠćŠéƒšçœČ
Drone CI/CD è‡Șć‹•ćŒ–æžŹè©ŠćŠéƒšçœČ
 
Introduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate WorkshopIntroduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate Workshop
 
Azure AD B2CにIdPをè‰Č々べçč‹ă„でみる
Azure AD B2CにIdPをè‰Č々べçč‹ă„でみるAzure AD B2CにIdPをè‰Č々べçč‹ă„でみる
Azure AD B2CにIdPをè‰Č々べçč‹ă„でみる
 
Firebase in action 2021
Firebase in action 2021Firebase in action 2021
Firebase in action 2021
 
MVC, MVVM, ReactorKit, VIPERë„Œ ê±°ìł RIB ì •ì°©êž°
MVC, MVVM, ReactorKit, VIPERë„Œ ê±°ìł RIB ì •ì°©êž°MVC, MVVM, ReactorKit, VIPERë„Œ ê±°ìł RIB ì •ì°©êž°
MVC, MVVM, ReactorKit, VIPERë„Œ ê±°ìł RIB ì •ì°©êž°
 
From docker to kubernetes: running Apache Hadoop in a cloud native way
From docker to kubernetes: running Apache Hadoop in a cloud native wayFrom docker to kubernetes: running Apache Hadoop in a cloud native way
From docker to kubernetes: running Apache Hadoop in a cloud native way
 
Getting Started with React.js
Getting Started with React.jsGetting Started with React.js
Getting Started with React.js
 

Ähnlich wie WebXR: A New Dimension For The Web Writing Virtual and Augmented Reality Apps With Web Technology

Bringing Virtual Reality to the Web: VR, WebGL and CSS – Together At Last!
Bringing Virtual Reality to the Web: VR, WebGL and CSS – Together At Last!Bringing Virtual Reality to the Web: VR, WebGL and CSS – Together At Last!
Bringing Virtual Reality to the Web: VR, WebGL and CSS – Together At Last!
FITC
 
Creating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todayCreating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of today
gerbille
 
Firefox OS learnings & visions, WebAPIs - budapest.mobile
Firefox OS learnings & visions, WebAPIs - budapest.mobileFirefox OS learnings & visions, WebAPIs - budapest.mobile
Firefox OS learnings & visions, WebAPIs - budapest.mobile
Robert Nyman
 

Ähnlich wie WebXR: A New Dimension For The Web Writing Virtual and Augmented Reality Apps With Web Technology (20)

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
 
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
 
Drones, Flying robots and Javascript
Drones, Flying robots and JavascriptDrones, Flying robots and Javascript
Drones, Flying robots and Javascript
 
WebVR - MobileTechCon Berlin 2016
WebVR - MobileTechCon Berlin 2016WebVR - MobileTechCon Berlin 2016
WebVR - MobileTechCon Berlin 2016
 
How to Make Your Users Sick in 60 Seconds – About UX Design, WebVR and React VR
How to Make Your Users Sick in 60 Seconds – About UX Design, WebVR and React VRHow to Make Your Users Sick in 60 Seconds – About UX Design, WebVR and React VR
How to Make Your Users Sick in 60 Seconds – About UX Design, WebVR and React VR
 
WebXR if X = how?
WebXR if X = how?WebXR if X = how?
WebXR if X = how?
 
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
 
Up And Running With Web VR Fall 2014
Up And Running With Web VR Fall 2014Up And Running With Web VR Fall 2014
Up And Running With Web VR Fall 2014
 
Introduction to Immersive Web
Introduction to Immersive WebIntroduction to Immersive Web
Introduction to Immersive Web
 
PWA 與 Service Worker
PWA 與 Service WorkerPWA 與 Service Worker
PWA 與 Service Worker
 
Bringing Virtual Reality to the Web: VR, WebGL and CSS – Together At Last!
Bringing Virtual Reality to the Web: VR, WebGL and CSS – Together At Last!Bringing Virtual Reality to the Web: VR, WebGL and CSS – Together At Last!
Bringing Virtual Reality to the Web: VR, WebGL and CSS – Together At Last!
 
Creating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of todayCreating the interfaces of the future with the APIs of today
Creating the interfaces of the future with the APIs of today
 
Getting Started with Web VR
Getting Started with Web VR Getting Started with Web VR
Getting Started with Web VR
 
codebits 2009 HTML5 JS APIs
codebits 2009 HTML5 JS APIscodebits 2009 HTML5 JS APIs
codebits 2009 HTML5 JS APIs
 
Intro to HTML5
Intro to HTML5Intro to HTML5
Intro to HTML5
 
Por que Criamos uma Ferramenta de Load Testing utilizando Playwright e AWS Ba...
Por que Criamos uma Ferramenta de Load Testing utilizando Playwright e AWS Ba...Por que Criamos uma Ferramenta de Load Testing utilizando Playwright e AWS Ba...
Por que Criamos uma Ferramenta de Load Testing utilizando Playwright e AWS Ba...
 
Firefox OS learnings & visions, WebAPIs - budapest.mobile
Firefox OS learnings & visions, WebAPIs - budapest.mobileFirefox OS learnings & visions, WebAPIs - budapest.mobile
Firefox OS learnings & visions, WebAPIs - budapest.mobile
 
NodeJS: the good parts? A skeptic’s view (devnexus2014)
NodeJS: the good parts? A skeptic’s view (devnexus2014)NodeJS: the good parts? A skeptic’s view (devnexus2014)
NodeJS: the good parts? A skeptic’s view (devnexus2014)
 
Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016
 

Mehr von GeilDanke

Mehr von GeilDanke (11)

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
 
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
 
Goodbye, Flatland! An introduction to WebVR and what it means for web developers
Goodbye, Flatland! An introduction to WebVR and what it means for web developersGoodbye, Flatland! An introduction to WebVR and what it means for web developers
Goodbye, Flatland! An introduction to WebVR and what it means for web developers
 
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...
 
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
 

KĂŒrzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

KĂŒrzlich hochgeladen (20)

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
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...
 
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
 
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
 
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
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
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...
 
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
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 

WebXR: A New Dimension For The Web Writing Virtual and Augmented Reality Apps With Web Technology