Kurz: Sestavení klavíru ve WebXR pomocí Babylon.js
Vytvoření klavíru v reálném světě vyžaduje hodně času, dovedností a materiálů. Co takhle stavět pro virtuální realitu a ar svět?
V této sérii kurzů se dozvíte, jak pomocí Babylon.js vytvořit Mixed Reality webovou aplikaci, která bude obsahovat funkční standup piano s 88 klávesy ve virtuálním světě. V dokončené aplikaci budete moct teleportovat k klavíru a přehrávat klávesy pomocí ovladačů hybridní reality.
V této sérii kurzů se naučíte:
- Vytvoření, umístění a sloučení sítí pro vytvoření klavírní klávesnice
- Import Babylon.js modelu standup piano frame
- Přidání interakcí s ukazatelem ke každé klavírní klávese
- Povolení podpory teleportace a vícepointerů v WebXR
Požadavky
- Počítač připojený k internetu
- Základní znalosti JavaScriptu
- Kurz Hello World JavaScriptu WebXR
- Podporovaný prohlížeč WebXR, například Microsoft Edge
- Babylon.js 4.2 nebo novější
- Jakákoli náhlavní souprava vr nebo simulátor Windows Mixed Reality
- Volitelné: Pokud chcete použít Windows Mixed Reality Simulator, Windows 10 Creator Update.
Začínáme
Začněme nastavením webové stránky HTML, která bude obsahovat Babylon.js scénu.
Vytvořte složku s názvem babylonjs-piano-tutorial a otevřete ji v editoru Visual Studio Code.
Poznámka
I když k tomu můžete použít libovolný editor kódu, pro usnadnění práce budeme v tomto kurzu používat Visual Studio Code.
Ve složce vytvořte soubor s názvemindex.html a vložte do něj následující šablonu:
<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>
Pokud potřebujete další vysvětlení obsahu této šablony, projděte si kurz Hello World, který je předpokladem tohoto kurzu.
Pokud se tento soubor pokusíte otevřít v prohlížeči, konzola zobrazí chybu, která značí, že
createScene()
funkce nebyla nalezena. Pojďme tuto chybu vyřešit implementací funkcecreateScene()
v další části.
Nastavení scény
Ve stejné složce jako index.htmlvytvořte další soubor s názvemscene.js. Do tohoto souboru uložíme veškerý kód javascriptu související s nastavením scény a vytvořením klavíru.
createScene()
Pojďme přidat funkci do scene.js:const createScene = async function(engine) { const scene = new BABYLON.Scene(engine); return scene; }
Všimněte si, že vytváříme
createScene()
asynchronní funkci. Zůstaňte naladěni na to, abyste zjistili proč.Dále budeme potřebovat světlo a kameru, aby byla scéna viditelná. Aktualizujte
createScene()
funkci: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; }
Tady jsme vytvořili ArcRotateCamera, která ukazuje téměř úplně dolů a cílí na počáteční bod prostoru. Světlo, které jsme vytvořili, je HemisphericLight , které ukazuje na oblohu a je užitečné pro simulaci okolního prostoru. Světlo jsme také trochu ztlumili tím, že jsme snížili jeho intenzitu.
Pokud potřebujete osvěžit, jak vytvořit kameru a světlo, před pokračováním k dalšímu kroku se znovu projděte část Příprava scény v Hello World Tutorial Series.
Vzhledem k tomu, že vyvíjíme pro platformu WebXR, budeme muset povolit prostředí XR ve scéně vložením následujícího řádku před
return scene;
:const xrHelper = await scene.createDefaultXRExperienceAsync();
Aby bylo možné použít
await
klíčové slovo proasync
funkci v rámci funkce, musí býtasync
v javascriptu také nadřazená funkce , což je důvod, proč jsme dříve definovalicreateScene
funkci jako asynchronní. Později v této sérii kurzů jixrHelper
použijeme k povolení a konfiguraci různých funkcí WebXR podporovaných Babylon.js.Dokončený scene.js by měl vypadat takto:
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; }
Teď, když máme funkční
createScene()
funkci, index.html načíst souborscene.js jako skript, abycreateScene()
se funkce rozpoznala v index.html. Do oddílu<header>
souboru HTML přidejte tento řádek kódu:<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>
Otevřete index.html v prohlížeči a zjistíte, že chybová zpráva, kterou jsme viděli dříve, už neexistuje a na stránce je prázdná Babylon.js scéna.