diff --git a/public/index.html b/public/index.html index 65b5cd6ffca80fff5d60d79d630f0a2b75eac35d..23535d536d0f7615affbf21aa49ffb1499247d08 100644 --- a/public/index.html +++ b/public/index.html @@ -24,12 +24,9 @@ </head> <body> <script> - let selectedModel = 'robot'; + let selectedModel = 'robot'; // Standardauswahl let models = {}; let reticle; - let currentModel = null; - let scene, camera, hitTestSource; - let hitTestResults = []; async function activateXR() { const canvas = document.createElement('canvas'); @@ -38,11 +35,11 @@ const renderer = new THREE.WebGLRenderer({ alpha: true, canvas, context: gl }); renderer.autoClear = false; - scene = new THREE.Scene(); - camera = new THREE.PerspectiveCamera(); + const scene = new THREE.Scene(); + const camera = new THREE.PerspectiveCamera(); camera.matrixAutoUpdate = false; - // Licht + // Licht hinzufügen const light = new THREE.DirectionalLight(0xffffff, 1); light.position.set(10, 10, 10); scene.add(light); @@ -55,23 +52,28 @@ scene.add(reticle); }); - // Modelle + // Modelle laden loader.load("https://threejs.org/examples/models/gltf/RobotExpressive/RobotExpressive.glb", (gltf) => { models.robot = gltf.scene; + models.robot.visible = false; // Start ohne sichtbar + scene.add(models.robot); }); loader.load("https://immersive-web.github.io/webxr-samples/media/gltf/sunflower/sunflower.gltf", (gltf) => { models.flower = gltf.scene; + models.flower.visible = false; // Start ohne sichtbar + scene.add(models.flower); }); - // XR-Session + // AR-Session starten const session = await navigator.xr.requestSession('immersive-ar', { requiredFeatures: ['hit-test'] }); session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); const referenceSpace = await session.requestReferenceSpace('local'); const viewerSpace = await session.requestReferenceSpace('viewer'); - hitTestSource = await session.requestHitTestSource({ space: viewerSpace }); + const hitTestSource = await session.requestHitTestSource({ space: viewerSpace }); session.requestAnimationFrame(onXRFrame); + // AR-Rendering function onXRFrame(time, frame) { session.requestAnimationFrame(onXRFrame); gl.bindFramebuffer(gl.FRAMEBUFFER, session.renderState.baseLayer.framebuffer); @@ -86,12 +88,24 @@ camera.projectionMatrix.fromArray(view.projectionMatrix); camera.updateMatrixWorld(true); - hitTestResults = frame.getHitTestResults(hitTestSource); + const hitTestResults = frame.getHitTestResults(hitTestSource); if (hitTestResults.length > 0) { const hitPose = hitTestResults[0].getPose(referenceSpace); reticle.visible = true; reticle.position.set(hitPose.transform.position.x, hitPose.transform.position.y, hitPose.transform.position.z); reticle.updateMatrixWorld(true); + + // Interaktive Modellwahl + const distanceToRobot = hitTestResults[0].distanceTo(models.robot.position); + const distanceToFlower = hitTestResults[0].distanceTo(models.flower.position); + + if (distanceToRobot < distanceToFlower) { + models.robot.visible = true; + models.flower.visible = false; + } else { + models.flower.visible = true; + models.robot.visible = false; + } } renderer.render(scene, camera); @@ -99,48 +113,7 @@ } } - // Touch-Logik zur Unterscheidung zwischen Swipe und Tap - let startX = 0, startY = 0, endX = 0, endY = 0; - const swipeThreshold = 50; // Minimale Swipe-Distanz - - document.body.addEventListener('touchstart', (e) => { - startX = e.touches[0].clientX; - startY = e.touches[0].clientY; - }); - - document.body.addEventListener('touchend', (e) => { - endX = e.changedTouches[0].clientX; - endY = e.changedTouches[0].clientY; - - const deltaX = endX - startX; - const deltaY = endY - startY; - - // Unterscheidung zwischen Swipe und Tap - if (Math.abs(deltaX) > swipeThreshold) { - if (deltaX > 0) { - switchModel('next'); - } else { - switchModel('previous'); - } - } else if (Math.abs(deltaY) < swipeThreshold) { - placeModel(); // Nur platzieren, wenn keine große Bewegung erkannt wurde - } - }); - - function placeModel() { - if (reticle && reticle.visible && models[selectedModel]) { - const newModel = models[selectedModel].clone(); - newModel.position.copy(reticle.position); - scene.add(newModel); - } - } - - function switchModel(direction) { - selectedModel = direction === 'next' ? - (selectedModel === 'robot' ? 'flower' : 'robot') : - (selectedModel === 'robot' ? 'flower' : 'robot'); - } - + // AR starten if (navigator.xr) { const startButton = document.createElement('button'); startButton.textContent = 'Start AR';