Design Vision
Ich habe bereits Unreal Engine, Unity und Godot für verschiedene kleinere VR-Projekte ausprobiert. Alle drei Engines sind sehr nützliche und mächtige Tools. Aber ich finde, bei allen drei Tools ist eine relativ intensive Einarbeitung nötig: Man muss eine Scripting Sprache oder Blueprints und spezifische APIs lernen und dazu eine Suite an 3D Software beherrschen, um VR Experiences zu kreieren.
Deshalb denke ich, es gibt Potential für ein Tool, mit dem man in Blender Welten gestalten und in VR betreten kann. Das Tool soll gute Defaults für Fortbewegung und Interaktion mit Controllern (oder Händen) bieten. Idealerweise könnte man mit Javascript simple Interaktionen hinzufügen.
Technische Umsetzung
Als Engine werde ich wahrscheinlich Hotham oder Godot verwenden. Ich fände es auch noch spannend, The Forge auszuprobieren, aber ich verstehe momentan noch nicht einmal, wie und wo ich da beginnen könnte. Bevy mit bevy_oxr wäre auch eine potentielle Kandidatin.
Damit User:innen Javascript für die Spielelogik ihrer Welten verwenden können, baue ich auf Teilen von Deno auf. Ich habe als Teil eines Mentorats bereits mit Deno herumexperimentiert, kann da also an bestehender Arbeit anknüpfen.
Aktuelle Struggles
Rust auf Android
Die Meta Quest Standalone VR Headsets laufen mit Android. Deno ist in Rust geschrieben, deshalb werde ich einen Grossteil meines Codes auch in Rust schreiben. Um die Rust/Android Toolchain kennenzulernen, habe ich an den Rust Android Examples herumgebastelt. Ich habe versucht, ein auf Deno basierendes Runtime einzubetten, was auf meinem Linux PC funktioniert, auf Android aber noch nicht:
Ich bin nicht die einzige Person, die Deno auf Android zum laufen bringen will, was sehr beruhigend ist. Trotzdem bin ich ein wenig nervös, da sehr vieles bezüglich Android noch eine Blackbox ist für mich.
Kommunikation zwischen Javascript und Hauptapplikation
Das Javascript-Runtime läuft in einem separaten Thread. Ursprünglich dachte ich, dass ich gerne das Rendering und den Javascript Event Loop synchronisiert hätte. Mittlerweile denke ich aber, dass es so sogar besser ist, das nicht zu tun: Die 3D Szene kann dann weiterrendern, wenn ein:e User:in versehentlich einen endlosen Loop im Code schreibt oder auf sonstige Weise rechenaufwändigen Code verwendet.
Um zwischen dem Javascript Runtime und einer Demo-App aus den rust-android-examples zu kommunizieren, habe ich crossbeam-channel verwendet. Momentan kann man einfach einen Text im UI mit Javascript updaten:
setText("huhu vo js")
Plan für nächste Woche
Nächste Woche möchte ich Leuten befragen, die Blender kennen und an der Gestaltung von VR Experiences interessiert sind oder auch bereits schon Erfahrung haben. Ich hoffe herauszufinden, was ihre grössten Painpoints sind oder was für Features sie sich gerne wünschen würden.
Ich möchte auch noch ein paar Tools ausprobieren, die interessante Ansätze haben, Spiele zu gestalten. Konkret fallen mir da gerade Armory3D, die (alte aber auch die independently weiter-wentickelte) Blender Game Engine und GameMaker ein.