diff --git a/public/index.html b/public/index.html index 82a4177a7a0545e8ff687964d8e263aba497f1ad..af5762e145cdfd1b3c325b480d596c2e3f33120b 100644 --- a/public/index.html +++ b/public/index.html @@ -1,205 +1,51 @@ -<!doctype html> +<!DOCTYPE html> <html> -<head> - <meta charset="UTF-8"> - <meta name="viewport" - content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> - <title>Cube Demo</title> - - <!-- three.js --> - <script src="https://unpkg.com/three@0.126.0/build/three.js"></script> -</head> -<body> - -<!-- Starting an immersive WebXR session requires user interaction. - We start this one with a simple button. --> -<button onclick="activateXR()">Start Cube Demo</button> -<script> -async function activateXR() { - // Add a canvas element and initialize a WebGL context that is compatible with WebXR. - const canvas = document.createElement("canvas"); - document.body.appendChild(canvas); - const gl = canvas.getContext("webgl", {xrCompatible: true}); - - // To be continued in upcoming steps. -} - -//STEP 2 -const scene = new THREE.Scene(); - -// The cube will have a different color on each side. -const materials = [ - new THREE.MeshBasicMaterial({color: 0xff0000}), - new THREE.MeshBasicMaterial({color: 0x0000ff}), - new THREE.MeshBasicMaterial({color: 0x00ff00}), - new THREE.MeshBasicMaterial({color: 0xff00ff}), - new THREE.MeshBasicMaterial({color: 0x00ffff}), - new THREE.MeshBasicMaterial({color: 0xffff00}) -]; - -// Create the cube and add it to the demo scene. -const cube = new THREE.Mesh(new THREE.BoxBufferGeometry(0.2, 0.2, 0.2), materials); -cube.position.set(1, 1, 1); -scene.add(cube); - - -//STEP 3 -// Set up the WebGLRenderer, which handles rendering to the session's base layer. -const renderer = new THREE.WebGLRenderer({ - alpha: true, - preserveDrawingBuffer: true, - canvas: canvas, - context: gl -}); -renderer.autoClear = false; - -// The API directly updates the camera matrices. -// Disable matrix auto updates so three.js doesn't attempt -// to handle the matrices independently. -const camera = new THREE.PerspectiveCamera(); -camera.matrixAutoUpdate = false; - -//step 4 -// Initialize a WebXR session using "immersive-ar". -const session = await navigator.xr.requestSession("immersive-ar"); -session.updateRenderState({ - baseLayer: new XRWebGLLayer(session, gl) -}); - -// A 'local' reference space has a native origin that is located -// near the viewer's position at the time the session was created. -const referenceSpace = await session.requestReferenceSpace('local'); - -//step5 -// Create a render loop that allows us to draw on the AR view. -const onXRFrame = (time, frame) => { - // Queue up the next draw request. - session.requestAnimationFrame(onXRFrame); - - // Bind the graphics framebuffer to the baseLayer's framebuffer - gl.bindFramebuffer(gl.FRAMEBUFFER, session.renderState.baseLayer.framebuffer) - - // Retrieve the pose of the device. - // XRFrame.getViewerPose can return null while the session attempts to establish tracking. - const pose = frame.getViewerPose(referenceSpace); - if (pose) { - // In mobile AR, we only have one view. - const view = pose.views[0]; - - const viewport = session.renderState.baseLayer.getViewport(view); - renderer.setSize(viewport.width, viewport.height) - - // Use the view's transform matrix and projection matrix to configure the THREE.camera. - camera.matrix.fromArray(view.transform.matrix) - camera.projectionMatrix.fromArray(view.projectionMatrix); - camera.updateMatrixWorld(true); - - // Render the scene with THREE.WebGLRenderer. - renderer.render(scene, camera) - } -} -session.requestAnimationFrame(onXRFrame); - -//step6 -</script> -</body> -</html> -<!doctype html> -<html> -<head> - <meta charset="UTF-8"> - <meta name="viewport" - content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> - <title>sphere Demo</title> - - <!-- three.js --> - <script src="https://unpkg.com/three@0.126.0/build/three.js"></script> -</head> -<body> - -<!-- Starting an immersive WebXR session requires user interaction. - We start this one with a simple button. --> -<button onclick="activateXR()">Start sphere Demo</button> -<script> -async function activateXR() { - // Add a canvas element and initialize a WebGL context that is compatible with WebXR. - const canvas = document.createElement("canvas"); - document.body.appendChild(canvas); - const gl = canvas.getContext("webgl", {xrCompatible: true}); - - const scene = new THREE.Scene(); - -// The cube will have a different color on each side. -const materials = [ - new THREE.MeshBasicMaterial({color: 0xff0000}), - new THREE.MeshBasicMaterial({color: 0x0000ff}), - new THREE.MeshBasicMaterial({color: 0x00ff00}), - new THREE.MeshBasicMaterial({color: 0xff00ff}), - new THREE.MeshBasicMaterial({color: 0x00ffff}), - new THREE.MeshBasicMaterial({color: 0xffff00}) -]; - -// Create the sphere and add it to the demo scene. -const sphere = new THREE.Mesh(new THREE.SphereGeometry(0.2, 0.2, 0.2), materials); -sphere.position.set(1, 1, 1); -scene.add(sphere); - - -// Set up the WebGLRenderer, which handles rendering to the session's base layer. -const renderer = new THREE.WebGLRenderer({ - alpha: true, - preserveDrawingBuffer: true, - canvas: canvas, - context: gl -}); -renderer.autoClear = false; - -// The API directly updates the camera matrices. -// Disable matrix auto updates so three.js doesn't attempt -// to handle the matrices independently. -const camera = new THREE.PerspectiveCamera(); -camera.matrixAutoUpdate = false; - -// Initialize a WebXR session using "immersive-ar". -const session = await navigator.xr.requestSession("immersive-ar"); -session.updateRenderState({ - baseLayer: new XRWebGLLayer(session, gl) -}); - -// A 'local' reference space has a native origin that is located -// near the viewer's position at the time the session was created. -const referenceSpace = await session.requestReferenceSpace('local'); - -// Create a render loop that allows us to draw on the AR view. -const onXRFrame = (time, frame) => { - // Queue up the next draw request. - session.requestAnimationFrame(onXRFrame); - - // Bind the graphics framebuffer to the baseLayer's framebuffer - gl.bindFramebuffer(gl.FRAMEBUFFER, session.renderState.baseLayer.framebuffer) - - // Retrieve the pose of the device. - // XRFrame.getViewerPose can return null while the session attempts to establish tracking. - const pose = frame.getViewerPose(referenceSpace); - if (pose) { - // In mobile AR, we only have one view. - const view = pose.views[0]; - - const viewport = session.renderState.baseLayer.getViewport(view); - renderer.setSize(viewport.width, viewport.height) - - // Use the view's transform matrix and projection matrix to configure the THREE.camera. - camera.matrix.fromArray(view.transform.matrix) - camera.projectionMatrix.fromArray(view.projectionMatrix); - camera.updateMatrixWorld(true); - - // Render the scene with THREE.WebGLRenderer. - renderer.render(scene, camera) - } -} -session.requestAnimationFrame(onXRFrame); - -} -</script> -</body> + <head> + <title>Simple WebXR Demo</title> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <style> + /* Style for the buttons */ + button { + background-color: blue; + color: white; + font-size: 24px; + padding: 12px 24px; + border: none; + border-radius: 4px; + margin: 20px; + cursor: pointer; + } + + /* Style for the logo */ + #logo { + float: right; + margin-right: 20px; + margin-top: 20px; + width: 100px; + height: 100px; + } + + /* Style for the footer */ + footer { + text-align: center; + margin-top: 50px; + } + + /* Style for the email link */ + footer a { + color: blue; + text-decoration: none; + } + </style> + </head> + <body> + <h1>Welcome to this simple WebXR demo!</h1> + <p>Click on one of the buttons below to check the two demos:</p> + <img src="https://www.hft-stuttgart.de/typo3conf/ext/hft_sitepackage/Resources/Public/img/HFT_logo.svg" alt="HfT Stuttgart" id="logo"> + <button onclick="location.href='1-Cube.html'">Cube demo</button> + <button onclick="location.href='2-Hit.html'">Tap to Place Demo</button> + <p> You can follow this <a href="https://transfer.hft-stuttgart.de/gitlab/coors/visualization/-/wikis/Create-a-simple-web-AR-application">tutorial</a> to create a similar WebXR app.</p> + <footer>© 2023 HfT Stuttgart. Contact <a href="mailto:muhammad.alfakhori@hft-stuttgart.de">Muhammad Alfakhori</a>.</footer> + </body> </html>