This repository has been archived by the owner. It is now read-only.
Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign up| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <title>WebVR UI | Custom DOM Example</title> | |
| <meta charset="utf-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| <!-- Origin Trial Token, feature = WebVR, origin = https://googlevr.github.io, expires = 2017-06-13 --> | |
| <meta http-equiv="origin-trial" data-feature="WebVR" data-expires="2017-06-13" content="Av+kmgEvMcHg6hEKdPiW32muXnGZKlucZCp/BTvMrkLVNStJVsHV3TPz34LmJ5mESRnfUEIVVYHFgHNEpqguhgIAAABReyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXZyLmdpdGh1Yi5pbzo0NDMiLCJmZWF0dXJlIjoiV2ViVlIiLCJleHBpcnkiOjE0OTczMTIwMDB9"> | |
| <style> | |
| html, body { | |
| width: 100%; | |
| height: 100%; | |
| background-color: #000; | |
| color: #fff; | |
| margin: 0; | |
| padding: 0; | |
| overflow: hidden; | |
| position: relative; | |
| font-family: 'Karla', sans-serif; | |
| } | |
| canvas { | |
| position: absolute; | |
| top: 0; | |
| } | |
| p { | |
| margin:0; | |
| } | |
| #ui { | |
| color: white; | |
| text-align: center; | |
| z-index: 1; | |
| position: absolute; | |
| top: 40%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| min-width: 300px; | |
| } | |
| #button { | |
| margin-top: 40px; | |
| margin-bottom: 20px; | |
| } | |
| a { | |
| color: white; | |
| } | |
| </style> | |
| <!-- three.js library --> | |
| <script src="node_modules/three/build/three.js"></script> | |
| <!-- VRControls.js applies the WebVR transformations to a three.js camera object. --> | |
| <script src="node_modules/three/examples/js/controls/VRControls.js"></script> | |
| <!-- VREffect.js handles stereo camera setup and rendering. --> | |
| <script src="node_modules/three/examples/js/effects/VREffect.js"></script> | |
| <!-- A polyfill for the WebVR API. --> | |
| <script src="node_modules/webvr-polyfill/build/webvr-polyfill.js"></script> | |
| <!-- Include WebVR UI --> | |
| <script src="../build/webvr-ui.js"></script> | |
| </head> | |
| <body> | |
| <div id="ui"> | |
| <h1>WebVR UI Custom DOM Example</h1> | |
| <p>Example showing how to use the library with custom dom elements</p> | |
| <button id="button" class="webvr-ui-button"><span class="webvr-ui-title"></span></button> | |
| </div> | |
| <!-- Github corner--> | |
| <div class="github-corner-wrap"><a href="https://github.com/googlevr/webvr-ui/blob/master/examples/basic.html" class="github-corner" aria-label="View source on Github"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#fff; color:#151513; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a></div><style>.github-corner-wrap{position: absolute; right:0; z-index: 1} .github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style> | |
| </body> | |
| <script> | |
| // Setup three.js WebGL renderer. | |
| var renderer = new THREE.WebGLRenderer(); | |
| var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 10000); | |
| // | |
| // BUTTON SETUP | |
| // | |
| //these will be used on each button in this example | |
| var onEnter = function(){ console.log("enter VR") }; | |
| var onExit = function() { | |
| console.log("exit VR"); | |
| camera.quaternion.set(0, 0, 0, 1); | |
| camera.position.set(0, controls.userHeight, 0); | |
| }; | |
| // Create WebVR UI Enter VR Button | |
| var enterVR = new webvrui.EnterVRButton(renderer.domElement, { | |
| domElement: document.getElementById("button") | |
| }); | |
| enterVR | |
| .on("enter", onEnter) | |
| .on("exit", onExit); | |
| //create an empty custom element and apply the styles we want for it | |
| var customButton = document.createElement("button"); | |
| //apply all of these styles | |
| var styles = { | |
| cursor: "pointer", | |
| margin: "10px auto", | |
| display: "block", | |
| color: "white", | |
| width: "64px", | |
| height: "64px", | |
| borderRadius: "50%", | |
| backgroundColor: "rgba(255, 255, 255, 0.2)", | |
| outline: "none", | |
| border: "none" | |
| }; | |
| for (var prop in styles) { | |
| customButton.style[prop] = styles[prop]; | |
| } | |
| //we'll inject the right VR SVG Icon based on whether they have VR or not | |
| var vrIcon; | |
| var enterVRCustom = new webvrui.EnterVRButton(renderer.domElement, { | |
| domElement: customButton | |
| }); | |
| enterVRCustom.on("ready", function(){ | |
| vrIcon = webvrui.dom.createVRIcon("", 24); | |
| vrIcon.setAttribute("fill", "white"); | |
| enterVRCustom.domElement.innerHTML = ""; | |
| enterVRCustom.domElement.appendChild(vrIcon); | |
| }); | |
| enterVRCustom.on("enter", function(){ | |
| enterVRCustom.domElement.removeChild(vrIcon); | |
| enterVRCustom.domElement.innerHTML = "EXIT"; | |
| }); | |
| enterVRCustom.on('error', function(e){ | |
| if(vrIcon && enterVRCustom.domElement.contains(vrIcon)) { | |
| enterVRCustom.domElement.removeChild(vrIcon); | |
| } | |
| vrIcon = webvrui.dom.createNoVRIcon('', 24); | |
| vrIcon.setAttribute("fill", "rgba(255, 255, 255, 0.5)"); | |
| vrIcon.style.paddingTop = "4px"; | |
| enterVRCustom.domElement.style.cursor = "inherit"; | |
| enterVRCustom.domElement.appendChild(vrIcon); | |
| }); | |
| enterVRCustom | |
| .on('enter', onEnter) | |
| .on('exit', onExit); | |
| document.getElementById("ui").appendChild(enterVRCustom.domElement); | |
| // | |
| // WEBGL SCENE SETUP | |
| // | |
| // Append the canvas element created by the renderer to document body element. | |
| document.body.appendChild(renderer.domElement); | |
| // Create a three.js scene. | |
| var scene = new THREE.Scene(); | |
| // Create a three.js camera. | |
| var controls = new THREE.VRControls(camera); | |
| controls.standing = true; | |
| camera.position.y = controls.userHeight; | |
| // Create VR Effect rendering in stereoscopic mode | |
| var effect = new THREE.VREffect(renderer); | |
| effect.setSize(window.innerWidth, window.innerHeight); | |
| renderer.setPixelRatio(Math.floor(window.devicePixelRatio)); | |
| // Create 3D objects in scene. | |
| var geometry = new THREE.BoxGeometry(0.5, 0.5, 0.5); | |
| var material = new THREE.MeshNormalMaterial(); | |
| var cube = new THREE.Mesh(geometry, material); | |
| cube.position.set(0, controls.userHeight, -0.8); | |
| scene.add(cube); | |
| // Hande canvas resizing | |
| window.addEventListener('resize', onResize, true); | |
| window.addEventListener('vrdisplaypresentchange', onResize, true); | |
| function onResize(e) { | |
| effect.setSize(window.innerWidth, window.innerHeight); | |
| camera.aspect = window.innerWidth / window.innerHeight; | |
| camera.updateProjectionMatrix(); | |
| } | |
| // Get the HMD | |
| var animationDisplay; | |
| enterVR.getVRDisplay() | |
| .then(function(display) { | |
| animationDisplay = display; | |
| display.requestAnimationFrame(animate); | |
| }) | |
| .catch(function(){ | |
| // If there is no display available, fallback to window | |
| animationDisplay = window; | |
| window.requestAnimationFrame(animate); | |
| }); | |
| // Request animation frame loop function | |
| var lastRender = 0; | |
| function animate(timestamp) { | |
| var delta = Math.min(timestamp - lastRender, 500); | |
| lastRender = timestamp; | |
| // Apply rotation to cube mesh | |
| cube.rotation.y += delta * 0.0003; | |
| if(enterVR.isPresenting() || enterVRCustom.isPresenting()){ | |
| controls.update(); | |
| renderer.render(scene,camera); | |
| effect.render(scene, camera); | |
| } else { | |
| renderer.render(scene,camera); | |
| } | |
| animationDisplay.requestAnimationFrame(animate); | |
| } | |
| </script> | |
| </html> |