为什么我重写了我的开源虚拟现实服务器

使用 VRSpace,您可以跨平台玩群体 VR 游戏,而无需牺牲您的隐私。
100 位读者喜欢这个。
new techie gadgets representing innovation

Opensource.com

看!我写了一个虚拟现实 (VR) 服务器,并将其发布在 GitHub 上!但是为什么

好吧,我是个典型的内向黑客。我喜欢玩弄技术。每当有新事物出现时,我必须亲手接触并弄脏我的手。所以,当我去年给自己买了 Oculus Quest 时,我玩了几款游戏,然后就想自己编写一些代码。你猜怎么着?一切都是专有的!

好吧,这可能有点夸大其词。但我对 VR 行业的总体印象正是如此——一切都是专有的!硬件和软件供应商都在试图锁定开发人员,以便比竞争对手销售更多的设备和开发工具——似曾相识,就像上世纪的 Unix 战争一样。

但欢迎来到 21 世纪;我们现在生活在云端!云端获取我们所有的数据,并将其安全地存储在云所有者的支配之下。以 Oculus Quest 2 为例。没有 Facebook 帐户,您甚至无法使用它。但是一旦您这样做,您的所有数据都会发送到 Facebook。

什么样的数据?生物识别数据

VR 设备跟踪我们的动作,了解我们在现实世界中的身高等等。GDPR 和其他隐私法将此类生物识别数据列入最高安全类别。这样做是正确的,因为这些数据会引发最糟糕的隐私侵犯。例如,想象一下一个模仿您每个动作的深度伪造。

我以 Facebook 为例,但任何代码无法受到审查的私有组织都存在相同的风险。

构建开放、可互操作的 VR 服务器

隐私只是我编写 VR 服务器的动机之一;另一个是我的家人。

我的孩子们在现实生活中一起玩耍,他们也想在 VR 中一起玩耍。我还有另一个 VR 头显,Acer OJO,但它存在于与 Oculus 不同的 Windows Mixed Reality 世界中。供应商锁定再次成为障碍。为了让我的孩子们一起玩 VR,我们需要两个微软或两个 Facebook 头显。

但还有出路。

进入 WebXR 设备 API。这个 开源 规范“描述了对访问虚拟现实 (VR) 和增强现实 (AR) 设备的支持,包括网络上的传感器和头戴式显示器”。它是 VR 和 AR(由 X 概括),可以在每个设备上工作,就像网络必须在任何设备上工作一样——包括移动设备。

WebXR 包括一个 WebGL 图层,并且有许多 JavaScript 库(例如 Three.js)来帮助开发人员使用 WebGL 和功能齐全的开源游戏引擎 BabylonJS。(Three.js 爱好者可能想试试 CS1 Game Engine,这是一个有前景但尚未完成的库,其首要任务是性能和开发人员体验。)

这些工具还可以与流行的 Web 开发框架(如 Angular 和 React)互操作。还有 glTF,一种用于 3D 模型的开放标准,几乎所有相关工具都可以读取和写入,以及数量惊人的开源 3D 模型,这些模型大多以知识共享署名许可发布。

唯一缺少的是服务器。一个可以交付内容(模型)和演示逻辑(JavaScript),收集和分发用户事件,并实施业务(游戏)逻辑,但不会存储任何敏感数据的服务器。

恰好在 20 年前,我编写了一个名为 VRSpace 的开源 VR 服务器。不幸的是,它对于自身而言太早了,并且该项目随着客户端技术 (VRML) 一起消亡了。但我确切地知道今天的 VR 需要做什么,所以我又写了一遍。幸运的是,使用现代技术更容易做到这一点。

Old VRSpace

二十年前,VRSpace.org 是一个与聊天机器人的聊天。(Arni Barisic,Slaven Katic,Josip Almasi,CC BY-SA 4.0

与其反思美好的旧时光和 20 年的技术差距,不如谈谈我做出的一些设计选择以及我使用的开源工具。

二十年后:Java 和 JavaScript

我选择 Java 和 Spring Boot 仅仅是因为我每天都在使用它们。但说实话,Node.js 可能是这项工作的更好工具,因为用一种语言编写和维护软件比用两种语言更容易。对于客户端,我选择了 BabylonJS,因为它是一个功能齐全的 WebXR 游戏引擎和纯 JavaScript,而且我不希望客户端依赖于用户界面 (UI) 框架。

BabylonJS 是用 TypeScript 编写的,所以如果我想制作一个单体产品,我会选择 TypeScript。另一方面,我不想在客户端强制执行任何特定的技术。Web 浏览器不是唯一想要在 VR 中交互的客户端类型,原生应用程序通常提供最佳性能。

通信层不依赖于任何其他东西,如果您想实现自己的 VR 客户端或像聊天机器人这样的无头客户端,这可能很重要。

为了存储数据,我选择了 Neo4J 数据库,事实证明它是最好的。它可以嵌入到我的服务器中并存储我的所有对象。当然,敏感对象除外,所以我特别注意将每个敏感字段标记为瞬态。如果我不关心这一点,您就无法信任我的服务器来保护您的私人数据免受爱管闲事的政府机构或寻求窃取有价值的生物识别数据的犯罪分子的侵害。

通信通过 WebSockets 上的 JSON 进行——因为它就是有效。从协议的角度来看,它远非最佳选择。从 VR 设备传感器发出的事件数量远高于您通常的第一人称射击游戏;VR 设备跟踪您的手臂和头部、各种按钮和操纵杆,甚至可能是眼睛的运动以及每根手指。无论如何,速率限制是必须的。

但是聊天呢?VR 设备没有键盘,移动设备一旦作为 VR 设备安装在头上也没有键盘。VR 内的虚拟键盘不是很有用,而且对于聊天来说肯定是无用的。因此,语音聊天似乎是唯一的选择。幸运的是,有一个名为 OpenVidu 的开源聊天服务器。我让我的服务器与该服务器对话,以便人们可以互相聊天。

最后但并非最不重要的一点是,安全性。将脚本嵌入到 JSON 字符串中是微不足道的,为了防止跨站点脚本攻击,服务器至少必须清理每个传入的请求。

广阔的虚拟空间

人们偶尔需要开放空间,只是为了保持理智。囚犯每天至少有一个小时的户外活动时间。NASA 希望宇航员能够忍受长时间的禁闭。但普通人就是无法忍受一直待在室内。

我已经禁闭了好几个月了,但 VR 来拯救了!创建一个虚拟空间需要花费无数个小时来尝试不同的模型和背景,并进行更多的测试。对于身心健康来说,它不如真实的东西好,但足以让人们保持理智。

现在我已经编写了服务器,我的孩子们终于可以和我妻子和我一起在他们选择的任何虚拟世界中一起玩捉迷藏了——两个 VR 头显、一台 PC 和一部手机,都在一起玩。到目前为止,我们只能玩捉迷藏,因为还没有其他游戏。我们开始玩“制作游戏”游戏;到目前为止,我们有一个游戏地图、第一个关卡,当然还有僵尸。

但是拥有无人使用的软件有什么意义呢?我的第一个 VR 服务器没有被广泛使用,但它被世界各地的人们使用。我记得一些韩国学生和一个乌拉圭女孩坐在她爸爸的腿上,被海豚飞过遥远城市的虚拟复制品迷住了。

但我最好的记忆是有人告诉我,“像你这样的程序员是人类的恩人。” 这就是开源的全部意义所在:造福人类。不仅仅是我,不仅仅是我的家人,不仅仅是付费客户,不仅仅是我的公司,而是任何地方的任何人,并且可能是任何地方的每个人。

这就是为什么我再次编写了该 VR 服务器并将其发布在 GitHub 上

参与进来

我正在运行当前代码的演示服务器,任何人都可以匿名访问。我在上面安装了一个 Redmine 服务器;它有 wiki、论坛、错误报告和所有内容,所以如果您想合作或只是联系,请在那里GitHub 上见!

我还制作了一个 YouTube 频道,用于演示和教程,并制作了几部电影(使用另一个名为 Shotcut 的开源工具)。此视频 概括介绍了项目的所有功能。我制作了一个 Facebook 页面,因为实际上每个人都知道 Facebook。

我希望在虚拟世界中见到您,所以请保持安全并玩得开心!

接下来阅读什么
标签
Josip Almasi - 3D autoportrait
我是开源领域的老手,作为用户、开发人员和倡导者。发表了很多代码、一些文章和一些博客文章。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.