Esercitazione: Creare un pianoforte in WebXR usando Babylon.js
La creazione di un pianoforte nel mondo reale richiede molto tempo, abilità e materiali. Che ne dici di costruire uno per il mondo VR/AR?
In questa serie di esercitazioni si apprenderà come usare Babylon.js per creare un'app Web Realtà mista che contiene un pianoforte a 88 tasti funzionante nel mondo virtuale. Nell'app completata sarà possibile teletrasportare il piano e riprodurre le chiavi usando i controller di realtà mista.
In questa serie di esercitazioni si apprenderà come:
- Creare, posizionare e unire mesh per creare una tastiera piano
- Importare un modello di Babylon.js di una cornice di piano standup
- Aggiungere interazioni puntatore a ogni tasto piano
- Abilitare il supporto di teleportazione e multipunto in WebXR
Prerequisiti
- Un computer connesso a Internet
- Conoscenza di base di Javascript
- Esercitazione sul Hello World JavaScript per WebXR
- Browser supportato da WebXR, ad esempio Microsoft Edge
- Babylon.js 4.2 o versione successiva
- Qualsiasi visore VR o simulatore di Windows Mixed Reality
- Facoltativo: Windows 10 Creator Update se si vuole usare un simulatore di Windows Mixed Reality
Introduzione
Per iniziare, configurare la pagina Web HTML che conterrà la scena Babylon.js.
Creare una cartella denominata babylonjs-piano-tutorial e aprire la cartella in Visual Studio Code.
Nota
Anche se è possibile usare qualsiasi editor di codice da seguire, in questa esercitazione si userà Visual Studio Code.
All'interno della cartella creare un file denominato index.html e inserire il modello seguente nel file:
<html> <head> <title>Piano in BabylonJS</title> <script src="https://cdn.babylonjs.com/babylon.js"></script> <style> body,#renderCanvas { width: 100%; height: 100%;} </style> </head> <body> <canvas id="renderCanvas"></canvas> <script type="text/javascript"> const canvas = document.getElementById("renderCanvas"); const engine = new BABYLON.Engine(canvas, true); createScene(engine).then(sceneToRender => { engine.runRenderLoop(() => sceneToRender.render()); }); // Watch for browser/canvas resize events window.addEventListener("resize", function () { engine.resize(); }); </script> </body> </html>
Per altre spiegazioni sul contenuto di questo modello, vedere l'esercitazione Hello World, che è un prerequisito di questa esercitazione.
Se si tenta di aprire questo file in un browser, nella console viene visualizzato un errore che indica che la
createScene()
funzione non viene trovata. Risolvere questo errore implementando la funzionecreateScene()
nella sezione successiva.
Configurare la scena
Nella stessa cartella di index.htmlcreare un altro file denominato scene.js. Verranno archiviati tutti i codici Javascript correlati alla configurazione della scena e alla creazione del piano in questo file.
Aggiungere la
createScene()
funzione in scene.js:const createScene = async function(engine) { const scene = new BABYLON.Scene(engine); return scene; }
Si noti che si sta creando
createScene()
una funzione asincrona. Restate sintonizzati per scoprire perché.Successivamente, avremo bisogno di una luce e una fotocamera per rendere visibile la scena a noi. Aggiornare la
createScene()
funzione:const createScene = async function(engine) { const scene = new BABYLON.Scene(engine); const alpha = 3*Math.PI/2; const beta = Math.PI/50; const radius = 220; const target = new BABYLON.Vector3(0, 0, 0); const camera = new BABYLON.ArcRotateCamera("Camera", alpha, beta, radius, target, scene); camera.attachControl(canvas, true); const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene); light.intensity = 0.6; return scene; }
Qui abbiamo creato un ArcRotateCamera, che punta quasi completamente verso il basso e punta al punto di origine dello spazio. La luce creata è un HemisphericLight che punta al cielo ed è utile per simulare uno spazio ambientale. Abbiamo anche disattivato la luce un po'abbassandone l'intensità.
Se è necessario un aggiornamento su come creare una fotocamera e una luce, rivedere la sezione Prepara scena della serie di esercitazioni Hello World prima di procedere al passaggio successivo.
Infine, poiché si sviluppa per una piattaforma WebXR, sarà necessario abilitare l'esperienza XR nella scena inserendo la riga seguente prima
return scene;
di :const xrHelper = await scene.createDefaultXRExperienceAsync();
In javascript, per usare la
await
parola chiave in una funzione all'interno di unaasync
funzione, anche la funzione padre deve essereasync
, motivo per cui è stata definitacreateScene
la funzione come asincrona in precedenza. Più avanti in questa serie di esercitazioni verrà usato perxrHelper
abilitare e configurare diverse funzionalità WebXR supportate da Babylon.js.Il scene.js completato sarà simile al seguente:
const createScene = async function(engine) { const scene = new BABYLON.Scene(engine); const alpha = 3*Math.PI/2; const beta = Math.PI/50; const radius = 220; const target = new BABYLON.Vector3(0, 0, 0); const camera = new BABYLON.ArcRotateCamera("Camera", alpha, beta, radius, target, scene); camera.attachControl(canvas, true); const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(0, 1, 0), scene); light.intensity = 0.6; const xrHelper = await scene.createDefaultXRExperienceAsync(); return scene; }
Ora che è disponibile una funzione funzionante
createScene()
, è index.htmlcaricare il file discene.js come script in modo che lacreateScene()
funzione venga riconosciuta in index.html. Aggiungere questa riga di codice all'interno della<header>
sezione del file HTML:<html> <head> <title>Piano in BabylonJS</title> <script src="https://cdn.babylonjs.com/babylon.js"></script> <script src="scene.js"></script> <style> body,#renderCanvas { width: 100%; height: 100%;} </style> </head> <body> <canvas id="renderCanvas"></canvas> <script type="text/javascript"> const canvas = document.getElementById("renderCanvas"); const engine = new BABYLON.Engine(canvas, true); createScene(engine).then(sceneToRender => { engine.runRenderLoop(() => sceneToRender.render()); }); // Watch for browser/canvas resize events window.addEventListener("resize", function () { engine.resize(); }); </script> </body> </html>
Aprire index.html nel browser e si scoprirà che il messaggio di errore visualizzato in precedenza non è più presente e nella pagina è presente una scena Babylon.js vuota.