mirror of
https://github.com/troisjs/trois.git
synced 2024-11-24 04:12:02 +08:00
simple vr button
This commit is contained in:
parent
abcc930246
commit
8121ed0009
91
src/components/misc/VRButton.vue
Normal file
91
src/components/misc/VRButton.vue
Normal file
@ -0,0 +1,91 @@
|
||||
<template>
|
||||
<button @click="onClick">{{ message }}</button>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// from threejs/examples/jsm/webxr/VRButton.js
|
||||
export default {
|
||||
props: {
|
||||
enterMessage: { type: String, default: 'ENTER VR' },
|
||||
exitMessage: { type: String, default: 'EXIT VR' },
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
error: '',
|
||||
xrSupport: false,
|
||||
currentSession: null,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
message() {
|
||||
if (this.xrSupport) {
|
||||
return this.currentSession ? this.exitMessage : this.enterMessage;
|
||||
} else if (this.error) {
|
||||
return this.error;
|
||||
}
|
||||
return '';
|
||||
},
|
||||
},
|
||||
created() {
|
||||
if ('xr' in navigator) {
|
||||
navigator.xr.isSessionSupported('immersive-vr').then((supported) => {
|
||||
this.xrSupport = supported;
|
||||
});
|
||||
} else {
|
||||
if (window.isSecureContext === false) {
|
||||
this.error = 'WEBXR NEEDS HTTPS';
|
||||
} else {
|
||||
this.error = 'WEBXR NOT AVAILABLE';
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
init(renderer) {
|
||||
this.renderer = renderer;
|
||||
},
|
||||
onClick() {
|
||||
if (!this.xrSupport) return;
|
||||
if (!this.renderer) return;
|
||||
|
||||
if (this.currentSession) {
|
||||
this.currentSession.end();
|
||||
} else {
|
||||
const sessionInit = { optionalFeatures: ['local-floor', 'bounded-floor', 'hand-tracking'] };
|
||||
navigator.xr.requestSession('immersive-vr', sessionInit).then(this.onSessionStarted);
|
||||
}
|
||||
},
|
||||
async onSessionStarted(session) {
|
||||
session.addEventListener('end', this.onSessionEnded);
|
||||
await this.renderer.xr.setSession(session);
|
||||
this.currentSession = session;
|
||||
},
|
||||
onSessionEnded() {
|
||||
this.currentSession.removeEventListener('end', this.onSessionEnded);
|
||||
this.currentSession = null;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
button {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
width: 100px;
|
||||
left: calc(50% - 50px);
|
||||
bottom: 20px;
|
||||
padding: 12px 6px;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 4px;
|
||||
background: rgba(0,0,0,0.1);
|
||||
color: #fff;
|
||||
font: normal 13px sans-serif;
|
||||
text-align: center;
|
||||
opacity: 0.5;
|
||||
outline: none;
|
||||
z-index: 999;
|
||||
}
|
||||
button:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
</style>
|
Loading…
Reference in New Issue
Block a user