用StereoKit为metaverse构建.NET应用程序
微软的开源混合现实工具使得在.NET中构建OpenXR应用变得容易
Windows混合现实平台的大部分内容都依赖于Unity。然而,由于许多原因,这并不总是最好的选择,特别是它的许可模式仍然非常专注于游戏市场。有一些替代品。你可以在嵌入式浏览器中使用WebXR,或者使用 围绕Babylon.js的React Native实现的Power Platform中的跨平台工具工作 。但如果你正在使用.NET代码,并希望将其扩展到增强现实和虚拟现实中,你仍然需要一套.NET混合现实库。
OpenXR:一个开放的混合现实标准
幸运的是,有一种基于开放标准的方法来处理混合现实,并有一套.NET工具来处理它。Khronos集团是负责图形标准的行业机构,如OpenGL和OpenCL,帮助代码从GPU硬件中获得最大效益。作为其职权范围的一部分,它管理着OpenXR标准,该标准旨在让你只需写一次代码,就能在任何头显或增强现实设备上运行。通过微软、Oculus和Collabara等公司的运行时间,OpenXR代码应该可以在大多数可以承载.NET代码的平台上运行。
OpenXR的跨平台和跨设备特性使得它有可能拥有一个代码库,如果你使用的语言或框架能在所有这些平台上工作,就能向支持的平台提供混合现实。由于现代.NET平台现在支持大多数你可能想要托管OpenXR应用程序的地方,你应该发现微软赞助的StereoKit工具是建立这些应用程序的理想方式,特别是像MAUI这样的跨平台UI工具托管非OpenXR内容。你可以在GitHub上找到这个项目。
由于它与Windows的混合现实工具包是由同一个团队开发的,因此有计划朝着能够使用微软的混合现实设计语言的方向发展。这应该可以让这两个工具支持类似的功能集,所以你可以把基于Unity的应用程序带到更广泛的C#开发框架中。
使用StereoKit工作
StereoKit纯粹是为了将你的3D资产在交互式混合现实环境中显示出来而设计的,它注重性能和简洁(文档中称其为 "简洁")的API以简化代码编写。它是为C#开发人员设计的,尽管如果你需要更接近你的硬件,还有对C和C++的额外支持。虽然它最初是为HoloLens 2应用和增强现实设计的,但该工具也适用于构建虚拟现实代码和在移动设备上使用增强现实。
目前平台支持主要集中在64位应用程序,StereoKit以NuGet包的形式发货。Windows桌面开发者目前只能获得x64代码,尽管你应该能够在其他ARM硬件上使用ARM64 HoloLens通用Windows平台(UWP),如Surface Pro X。Linux软件包对x64和ARM64都有支持;Android应用程序只能在ARM64设备上运行(尽管通过Windows Subsystem for Android在英特尔硬件上使用的Android Bridge技术进行测试,应该可以运行)。不幸的是,我们目前不能完全跨平台,因为没有iOS的实现,因为没有官方的iOS OpenXR构建。苹果正专注于自己的ARKit工具,作为一种变通方法,StereoKit团队目前正在开发一个跨平台的WebAssembly实现,它应该在任何有WebAssembly兼容的JavaScript运行时间的地方运行。
使用StereoKit进行开发,对于任何编写过.NET UI代码的人来说都不会太难。最好的办法是使用Visual Studio,尽管你没有理由不使用任何其他支持NuGet的.NET开发环境。Visual Studio用户将需要确保他们已经为Windows OpenXR应用程序启用了桌面.NET开发,为针对HoloLens的应用程序启用了UWP,为Oculus和其他基于Android的硬件启用了移动.NET开发。你需要一个OpenXR运行时间来测试代码,如果你没有头显,可以选择使用桌面模拟器。使用Visual Studio的一个好处是,StereoKit开发团队提供了一套Visual Studio模板,可以通过加载先决条件和填写一些模板代码来加快入门速度。
大多数开发者可能会想要.NET核心模板,因为它可以与Windows和Linux上的现代.NET实现配合使用,并让你为正在开发的跨平台模板做好准备。跨平台的.NET开发现在主要集中在MAUI和WinUI等工具上,所以随着时间的推移,UWP的实现很可能会变得不那么重要,特别是如果团队推出了WebAssembly版本。
建立你的第一个C#混合现实应用程序
在StereoKit中构建代码时,定义明确的3D基元可以简化在混合现实空间中创建对象。绘制一个立方体(混合现实版本的 "你好,世界")只需几行代码就可以完成,另一个样本,一个自由空间的绘画应用,只需200多行C#代码。该库为你处理与OpenXR的大部分交互,使你能够直接与你的环境一起工作,而不必实现低级别的绘图功能或有需要管理不同相机和屏幕的代码。
在编写代码时,你需要考虑传统桌面应用程序和在StereoKit中工作的一些关键区别。也许最重要的是管理状态。StereoKit需要在每一帧中实现UI元素,在各状态之间尽可能少地存储状态。这种方法有一些方面可以大大简化事情。所有的UI元素都是分层的,所以切换一个元素会自动切换其子元素。
这种方法可以让你将UI元素附加到模型中的其他对象上。StereoKit支持许多标准的3D对象格式,所以你只需要在定义交互和在模型上添加布局区域之前从文件中加载一个模型,它作为UI元素的宿主,使该对象成为UI层次结构的顶端。重要的是,不要在UI对象中重复使用元素ID,因为它们构成了StereoKit最小交互状态模型的基础,用于跟踪哪些元素当前处于活动状态并可用于用户交互。
StereoKit采用"手优先 "的方式进行混合现实交互,使用手部传感器,如HoloLens的跟踪摄像头(如果有的话),或者模拟鼠标或游戏手柄控制器。手显示在交互空间中,并可用于放置与手的位置有关的其他用户界面元素,例如,使控制菜单始终靠近用户的手,无论他们在应用空间中处于什么位置。
如果你需要关于如何实现特定功能的灵感,在StereoKit的GitHub仓库里有一个有用的演示场景库。这些包括与控制器一起工作和管理手部输入的示例代码,以及混合现实交互的其他必要元素。这些代码有很好的记录,为你提供了大量关于如何使用StereoKit APIs关键元素的提示。
消除微软在混合现实方面对Unity的依赖是一件好事。拥有自己的开源工具可以确保混合现实是.NET生态系统中的一等公民,并得到该生态系统中尽可能多的支持。以OpenXR为目标也是StereoKit成功的关键,因为它确保了对HoloLens等混合现实设备、Oculus等虚拟现实以及Android上的增强现实的共同支持水平。你将能够使用同一个项目来针对不同的设备,并与熟悉的工具和技术(如MAUI)集成。混合现实不需要成为你代码的一个独立方面。StereoKit使得将其引入现有的.NET项目变得非常简单,而不需要做出重大改变。毕竟,它现在只是另一个UI层而已!