Samouczek: tworzenie fortepianu w usłudze WebXR przy użyciu Babylon.js
Budowanie fortepianu w świecie rzeczywistym wymaga dużo czasu, umiejętności i materiałów. A co z budową jednego dla świata VR/AR?
Z tej serii samouczków dowiesz się, jak za pomocą Babylon.js utworzyć aplikację internetową Mixed Reality zawierającą działający 88-key standup piano w świecie wirtualnym. W ukończonej aplikacji będziesz w stanie teleportować do fortepianu i odtwarzać klucze przy użyciu kontrolerów rzeczywistości mieszanej.
Z tej serii samouczków dowiesz się, jak wykonywać następujące działania:
- Tworzenie, pozycjonowanie i scalanie siatki w celu utworzenia klawiatury fortepianowej
- Importowanie modelu Babylon.js ramki fortepianowej standup
- Dodawanie interakcji wskaźnika do każdego klawisza fortepianowego
- Włączanie obsługi teleportacji i multipointerów w usłudze WebXR
Wymagania wstępne
- Komputer połączony z Internetem
- Podstawowa wiedza na temat języka JavaScript
- Samouczek Hello world języka Javascript webXR
- Przeglądarka obsługiwana przez program WebXR, na przykład Microsoft Edge
- Babylon.js w wersji 4.2 lub nowszej
- Dowolny zestaw słuchawkowy VR lub symulator Windows Mixed Reality
- Opcjonalnie: Windows 10 aktualizacji dla twórców, jeśli chcesz użyć symulatora Windows Mixed Reality
Wprowadzenie
Zacznijmy od skonfigurowania strony internetowej HTML zawierającej scenę Babylon.js.
Utwórz folder o nazwie babiljs-piano-tutorial i otwórz folder w Visual Studio Code.
Uwaga
Chociaż możesz użyć dowolnego edytora kodu do wykonywania kroków, będziemy używać Visual Studio Code w tym samouczku dla wygody.
W folderze utwórz plik o nazwie index.html i wstaw poniższy szablon do pliku:
<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>
Jeśli potrzebujesz więcej informacji na temat zawartości tego szablonu, zobacz samouczek Hello world, który jest wymaganiem wstępnym tego samouczka.
Jeśli spróbujesz otworzyć ten plik w przeglądarce, w konsoli zostanie wyświetlony błąd wskazujący, że
createScene()
funkcja nie zostanie znaleziona. Rozwiążmy ten błąd, implementując funkcjęcreateScene()
w następnej sekcji.
Konfigurowanie sceny
W tym samym folderze co index.htmlutwórz inny plik o nazwie scene.js. Zapiszemy cały kod javascript związany z konfigurowaniem sceny i tworzeniem fortepianu w tym pliku.
Dodajmy
createScene()
funkcję do scene.js:const createScene = async function(engine) { const scene = new BABYLON.Scene(engine); return scene; }
Pamiętaj, że tworzymy
createScene()
funkcję asynchronizową. Bądź na bieżąco, aby dowiedzieć się, dlaczego.Następnie będziemy potrzebować światła i kamery, aby scena stanie się dla nas widoczna.
createScene()
Zaktualizuj funkcję: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; }
W tym miejscu utworzyliśmy arcRotateCamera, który wskazuje prawie całkowicie w dół i wskazuje punkt początkowy przestrzeni. Światło, które stworzyliśmy, to HemisphericLight , który wskazuje na niebo i jest przydatny do symulowania przestrzeni otoczenia. Przyciemnialiśmy również światło trochę, obniżając jego intensywność.
Jeśli potrzebujesz odświeżenia, aby dowiedzieć się, jak utworzyć kamerę i światło, przed przejściem do następnego kroku ponownie zapoznaj się z sekcją Przygotowywanie sceny z serii samouczków Hello world.
Na koniec, ponieważ opracowujemy dla platformy WebXR, musimy włączyć środowisko XR w scenie, wstawiając następujący wiersz przed
return scene;
:const xrHelper = await scene.createDefaultXRExperienceAsync();
W języku JavaScript, aby użyć słowa kluczowego
await
async
w funkcji w ramach funkcji, funkcja nadrzędna musiałaby również miećasync
wartość , dlatego zdefiniowaliśmycreateScene
funkcję asynchronizną wcześniej. W dalszej części tej serii samouczków będziemy używać tejxrHelper
funkcji do włączania i konfigurowania różnych funkcji WebXR obsługiwanych przez Babylon.js.Ukończona scene.js powinna wyglądać następująco:
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; }
Teraz, gdy mamy działającą
createScene()
funkcję ,index.html załadować plik scene.js jako skrypt, abycreateScene()
funkcja została rozpoznana w index.html. Dodaj ten wiersz kodu w<header>
sekcji pliku 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>
Otwórz index.html w przeglądarce i zobaczysz, że wyświetlony wcześniej komunikat o błędzie nie jest już obecny i na stronie znajduje się pusta scena Babylon.js.