为什么不再推荐使用 VRTK 4?

引言

VRTK (Virtual Reality Toolkit) 发布于2016年,初期受到了广大开发者的欢迎并被广泛采用。但是随着 VR 开发生态的发展,这款工具逐渐失去了最初的光芒。本文试图通过几个维度的分析,解释为什么目前不推荐使用 VRTK 进行开发的理由,希望能够为正在选择 VR 开发工具的开发者们提供一些参考和启示。

VRTK 的初期成功与高光时刻

VRTK 最初作为一款名为 SteamVR Unity Toolkit 的开发工具发布,在 Valve 的 SteamVR SDK(1.x) 基础上集成了一些便利的交互功能,以弥补当时 SteamVR SDK 功能相对匮乏的不足。在 3.0 版本发布后,VRTK 迎来了高光时刻,一直持续到 SteamVR 2.0 发布。VRTK 3.x 让 VR 开发变得更加高效和便利,开发者只需对相关组件进行简单配置,即可实现丰富的交互功能,这使其在 VR 行业起步阶段受到广大开发者的欢迎。也正是由于其便利性给开发者留下了深刻的印象,所以大家才会对随后的 VRTK 4 充满了期待。

然而随着 VR 开发生态的不断发展,以及 VRTK 开发团队自身的一些原因,VRTK 目前已不再是开发者的首选开发工具。

外部环境的变化

VRTK 发布之初,VR 行业还处于起步阶段,彼时主流 VR 平台主要是运行在 SteamVR 之上的 HTC VIVE 和 Oculus Rift,移动 VR 平台尚未兴起,更谈不上开发工具。很多目前开发者熟知的 VR 开发工具尚未发布,比如 MRTK、Interaction Toolkit、UltimateXR 以及收费的 Auto Hand、VR Interaction Framework 等。在这种环境下,多数开发者(至少是国内开发者)倾向于选择 VRTK 来开发 VR 项目。可以说,VRTK 的流行也是吃到了一波时代的红利。

一些付费VR开发工具

但是随着时间的推移,VR 开发生态逐渐发展完善,越来越多的软件厂商先后发布了功能更加丰富的 VR 交互开发工具,后浪们各个生猛,工具个个好用,这其中也不乏巨头们的身影,比如 Unity、微软、Meta 等。

在这个过程中,VRTK 逐渐失去了竞争力。当然,以上只是外部因素,但是更多的还是其内部因素,以下。

架构的局限

上文提到 VRTK 在发布之初名称为 SteamVR Unity Toolkit,在 SteamVR SDK 之上为开发者集成了交互功能,虽然后续为了表明其通用性,改名为现在的 VRTK(Virtual Reality Toolkit),但是其核心的架构策略一直保留了下来,即 VRTK + VR SDK,也就是与 VR SDK 进行集成,开发者面向 VRTK 进行交互开发。这种架构在 VR 行业发展初期没有什么问题,毕竟市面上的 VR SDK 屈指可数,主要还是结合 SteamVR SDK,但随着生态的发展,问题逐渐显现。

首先,被集成的 VR SDK 也在变化发展。一旦其在架构上有了根本性的改变,在大版本更新以后,VRTK 就很难及时跟进集成了。这个问题在 SteamVR 2.0 发布以后显得尤为突出,因为 SteamVR SDK 在这个版本中进行了完全的重构,引入了新的输入系统,而彼时 VRTK 尚处于 3.x 阶段,两者并不兼容,甚至 SteamVR SDK 自身也不能实现面向其 1.x 版本的向下兼容。

所以在这段时间内便处于一个比较尴尬的局面——由于开发者尤其是初学者一般从 Unity 资源商店获取这两款工具,而资源商店仅提供它们的最新版本,此时开发者就要面临选择——要么只使用 SteamVR 2.x 开发项目,要么使用 VRTK 3 搭配 SteamVR 旧版本 1.x,实际上后者也是到目前为止使用 VRTK 的最佳组合。虽然随着 VRTK 4 的发布逐步解决了这个问题,但是其易用性大打折扣,此处按下不表,稍后再提。

其次,这种架构限制了跨平台的实现。随着越来越多 VR 硬件设备的涌现,碎片化的现象逐渐明显,分久必合,随着 OpenXR 标准的提出,跨平台的研发思路逐步体现在了各 XR 开发工具中。而 VRTK 并没有一套比较科学合理的跨平台解决方案,虽然一直有,但是这些年一直没有根本性的改变,相较于 Interaction Toolkit 面向 OpenXR 标准的实现策略,VRTK 的实现方案只能算作适配。作为侧面印证,举一例:Interaction Toolkit 所依赖的 Input System 实现跨平台的方案如此科学标准,以至于 MRTK、Snapdragon Spaces、ARFoundation 等工具均基于此系统来实现跨平台。

插一句题外话,虽然 SteamVR 2.x 也有自己的 Input System,实现思路也非常非常相似,但是受限于各方利益和竞争战略,并没有成为行业标准,也是可惜了。

另外,这种架构设计也给开发者带来一定的误导——好的交互功能必须要有两者集成才能实现。其实不然。以 Interaction Toolkit 为例,虽然会依赖一些 Package,但是这些 Package 与 Interaction Toolkit 作为交互开发的角色并不冲突,比如 Input system, 反而 Input System 是帮助 Interaction Toolkit 实现跨平台的核心角色。

开发团队规模

VRTK 到目前为止,依然只是由几名(可能是两名)独立开发者兼职业余维护,未来的不确定性较多,对于项目的技术选型来说,无疑也会面临一些风险。

首先是纪律性。作者思路跳跃较大,由于没有路线的约束,导致方案一改再改。在 VRTK 4 中,仅工具的安装和初始化配置,就已经更换了几回方案。这就像一个渣男常说的那句话:“我这个人,其实变数挺大的……" 几年前,国外出版过两本针对 VRTK 4 开发技术的书籍,现在拿来再看,基本上都不再适用了。这也是导致笔者不敢贸然跟进制作 VRTK 相关教程的直接原因。

其次是精力和时间的限制。VRTK 说大不大,说小其实也不小,特别是考虑到 VR 行业自 VRTK 发布以来的快速发展,开发工具需要更多考虑通用性,同时也要应对日益复杂的交互需求。虽然我们不提倡结构臃肿的工程师团队,但仅靠两个人在业余时间维护这样一个项目,显然有些力不从心。上文提到,VRTK 4 在新版本中尝试使用设计模式实现解耦,这可能也是导致开发周期延长的原因。尽管 Oculus 曾资助过开发团队,但这似乎并未显著提升开发进度。

VRTK 4 在很长一段时间(至少是几年)内一直没有摘掉 Beta 标签,这直接反映了开发进度的缓慢。

抛开项目进度不提,技术文档的完善、社区问题的解答、软件版本的迭代,也都需要大量的人力和精力投入。对于规模有限的团队来说,同时兼顾所有这些方面显然是一个巨大的挑战。

相比之下,其它主流 VR 开发工具往往有专门的团队提供支持。例如,Interaction Toolkit 由 Unity 官方团队开发维护,有明确的开发路线图,每次更新都有新交互功能的加入,带来开发效率的提升。以最近的工作为例,Unity 更新了基于 Interaction Toolkit 3.0 的 VR 模板,并在 Github 上完善了对应的示例项目,这种规模的改进和文档维护,对小团队而言在短时间内难以实现。持续的支持和迭代不仅提高了开发者的信心,也确保了工具能够跟上 XR 技术的快速发展步伐。

易用性与文档支持

还是因为架构问题,虽然在 VRTK 4 中能够明显看到有针对性的改变,但结合 VR SDK 的执念仍未完全放弃,导致易用性也大幅降低,这应该是 VRTK 不再受欢迎的直接原因之一。具体到使用,基本的初始化就需要进行多步配置,解耦的架构导致预制体的层级庞杂,组件和参数的名称晦涩难懂,对初学者非常不友好。

如果工具本身的学习曲线陡峭,还可以通过完善的文档支持来弥补。VRTK 在 3.x 时代,有非常详尽的文档说明,并配有丰富的示例场景,开发者可以轻松参考这些资源来实现所需功能。然而,到了 4.x 阶段,尤其是在发布初期,文档质量急剧下降,许多页面停留在 "to be completed" 的状态,开发者只能自行探索或在油管频道查看作者不定期推出的演示视频。虽然近期文档已有所改善,但其丰富程度和组织结构仍远不如 3.x 版本。此外,演示 demo 的数量减少,且组织逻辑欠缺条理,难以为开发者提供清晰的指导。

不可替代性逐渐降低

VRTK 4 相较于之前的版本,更多地侧重于组织架构的改变,而新功能的增加并不显著。曾经被视为 VRTK 特色的功能,如 SnapDropZone、双手交互、攀爬等,现在在其它 VR 开发工具中也能找到对应实现,例如 Interaction Toolkit 中的 Socket、Grab transformers、Climb 等。

据笔者不完全不专业统计,目前,就交互功能模块的种类和数量而言,VRTK 4 能实现的功能,Interaction Toolkit 基本都能实现;而 VRTK 4 不能实现的功能,视具体情况,Interaction Toolkit 也可能实现;Interaction Toolkit 不能实现的,VRTK4 也不能实现。这段比较绕,说白话便是,其它开发工具提供的功能已经基本覆盖了 VRTK 的优势领域,甚至在某些方面更胜一筹,比如混合现实、手部交互等。

此外,曾经被 VRTK 集成的 VR SDK,随着版本迭代,功能也逐渐丰富。以 SteamVR SDK 为例,其包含的 Interaction System 不仅能实现常见的 VR 交互功能,还加入了 Skeleton Poser 等极具特色的功能。这使得 VRTK 的集成优势变得不那么明显——VR SDK 本身已经能够胜任这些工作。在《VR博物馆项目实战教程》中,我们便是完全使用 SteamVR SDK 实现了项目的交互功能。

回顾开发者最初青睐 VRTK 的原因,一是简单快捷,二是功能丰富。而现在看来,VRTK 4 的功能并未显著增加,易用性反而有所下降,所以其不再是开发者的首选也就不奇怪了。

总结

基于以上的分析,VRTK 在 VR 行业发展初期起运较早,但是后期受限于团队、架构、产品等原因,并没有接住这波富贵。也有一种可能,悲观一些想,VRTK 可能仅仅是作者的踏板,毕竟学而优则仕,唱而优则演,免费的内容有多少人愿意为爱发电呢?

如果——我说的是如果——还有 VRTK 5 的话,建议抛弃与平台 SDK 集成的架构思想,成为一套开箱即用的跨平台 VR 交互开发工具,当然,特色交互功能要多一些,以及,更简洁高效的实现方式。

最后,回到标题,不推荐并不代表抵制,VRTK 依然是在项目开发前,在技术选型中的一个可选项,只是它可能是选项C或D。因为项目千差万别,需求千差万别,某些特定情况下它可能还是首选项,比如强势的项目领导有要求,比如软件版本有硬性要求,比如开发者不愿迈出舒适区等。VRTK 4 依然是可用的,只是现在有了更多的选择,这些选项也足够好。

以上是对 VRTK 做的几点简要分析,个人愚见,仅供参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/754339.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高电压技术-冲击高压发生器MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 冲击电压发生器是产生冲击电压波的装置,用于检验电力设备耐受大气过电压和操作过电压的绝缘性能,冲击电压发生器能产生标准雷电冲击电压波形,雷电冲击电压截波,标准操作冲击…

K8S 角色/组件及部署方式的简单概述

1.宏观架构图 2.角色详情 2.1 Master(Controller Plane) 早期是叫 Master 节点,后期改名为 Controller Plane,负责整个集群的控制和管理 Master 不会干活的(当然你让它干也是会干的,涉及到污点容忍),而是起到访问入口&#xff…

OPENCV清晰度判断(二)

文章目录 提取ROI判断清晰度灰度共轭矩阵(GLCM)灰度共轭函数的简单原理:计算灰度共轭矩阵代码计算矩阵的对比度 LBP:LBP的基本原理LBP代码 之前有过一篇关于清晰度的判断的文章: python的opencv操作记录(九)——图像清晰度计算。 这一篇里面…

代理IP对SEO影响分析:提升网站排名的关键策略

你是否曾经为网站排名难以提升而苦恼?代理服务器或许就是你忽略的关键因素。在竞争激烈的互联网环境中,了解代理服务器对SEO的影响,有助于你采取更有效的策略,提高网站的搜索引擎排名。本文将为你详细分析代理服务器在SEO优化中的…

使用FRP 0.58版本进行内网穿透的详细教程

什么是FRP? FRP(Fast Reverse Proxy)是一款高性能的反向代理应用,主要用于内网穿透。通过FRP,您可以将内网服务暴露给外网用户,无需进行复杂的网络配置。 准备工作 服务器:一台具备公网IP的服…

软件设计师笔记-操作系统知识(二)

线程 以下是关于线程的一些关键点: 线程是进程中的一个实体:进程是操作系统分配资源(如内存空间、文件句柄等)的基本单位,而线程是进程中的一个执行单元。多个线程可以共享同一个进程的地址空间和其他资源。线程是CP…

昇思25天学习打卡营第3天|函数式自动微分

文章目录 昇思MindSpore快速入门基于MindSpore的函数式自动微分1、简介2、函数与计算图算例3、微分函数与梯度计算4、Stop Gradient(停止梯度计算)5、Auxiliary data6、神经网络梯度计算 Reference 昇思MindSpore快速入门 基于MindSpore的函数式自动微分…

在flask中加载mnist模型,并预测图片

一、在tensorflow中新建及保存模型 启动Jupyter Notebook 新建Notebook 生成 mnist_model.h5 模型的代码 import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import…

ASUS/华硕天选Air 2021 FX516P系列 原厂win10系统

安装后恢复到您开箱的体验界面,带原机所有驱动和软件,包括myasus mcafee office 奥创等。 最适合您电脑的系统,经厂家手调试最佳状态,性能与功耗直接拉满,体验最原汁原味的系统。 原厂系统下载网址:http:…

java设计模式(二)工厂方法模式(pattern of factory method)

1、模式介绍: 工厂方法模式(pattern of factory method)是一种创建型设计模式,它定义了一个用于创建对象的接口,但将实际创建对象的工作延迟到子类中,这样可以在不改变整体结构的情况下,通过子…

OpenGL3.3_C++_Windows(23)

伽ga马校正 物理亮度 光子数量 线性空间:光子数(亮度)和颜色值的线性关系人眼感知的亮度:对比较暗的颜色变化更敏感,感知亮度基于人的感觉非线性空间:光子数(亮度)和 颜色值^2.2,恰好符合屏幕…

GIT版本管理工具轻松入门 | TortoiseGit

目录 一、下载git 二、下载tortoisegit(可视化git) 三、Git本地仓库创建 四、git克隆 五、添加,提交,推送,拉取 六、分支 七、冲突 八、忽略文件(修改gitignore文件) 一、下载git 安装…

<Linux> 缓冲区谁维护?

缓冲区是谁提供的&#xff1f; 来看一段代码 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> int main() {const char *str1 "a";printf("%s", str1);const char *str2 "b";writ…

AI副业新风口项目,AI绘画+古诗文视频,轻松吸引大批粉丝,变现简单,收益稳

前言 一个不吹牛逼不聊人生不谈理想只聊赚钱的自媒体从业者 问题都在过程中产生&#xff0c;努力做了也许会成功&#xff0c;但不做永远没有机会 — — — 小红书副业新风口项目&#xff0c;AI绘画古诗文视频&#xff0c;轻松吸引大批粉丝&#xff0c;变现简单&#xff0c;收…

2020年全国大学生数学建模竞赛C题中小微企业信贷决策(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分源代码&#xff08;一&#xff09;数据处理代码&#xff08;二&#xff09;熵权法与TOPSIS代码&#xff08;三&#xff09;最小二乘法代码&#xff08;四&#xff09;粒子群代码 四、完整word版论文和源代码&#xff08;两种获取方式…

FireFox 编译指南2024 Windows10篇-环境准备(一)

1. 引言 在开源浏览器项目中&#xff0c;Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox&#xff0c;开发者需要做好充分的环境准备工作。这不仅是编译成功的基础&#xff0c;也是后续调试、优化和二次开发的关键步骤。 编译Firefox是一个复…

缓存双写一致性(笔记)

缓存更新方案 旁路缓存模式 这是比较多的 旁路缓存模式&#xff1a;缓存有就返回&#xff0c;没有数据库查询&#xff0c;放入缓存返回。 还有些常用缓存策略 读穿透模式 读穿透和旁路很相似&#xff0c;程序不需要关注从哪里读取数据&#xff0c;它只需要从缓存查询数据。…

PPT录屏怎么录?PPT录屏,3种方法简单操作

在数字化时代&#xff0c;PPT已经成为我们日常工作、学习和生活中不可或缺的一部分。无论是商务报告、教学课件还是产品展示&#xff0c;PPT都能帮助我们更加生动、直观地传递信息。然而&#xff0c;有时候我们会面临PPT录屏怎么录的问题。这时&#xff0c;一个好的PPT录屏功能…

OpenAI发布CriticGPT:纠错GPT生成错误代码?

OpenAI发布CriticGPT&#xff1a;纠错GPT生成错误代码&#xff1f; 前言 OCriticGPT 就在6月28日&#xff0c;OpenAI 训练出了一个基于 GPT-4 的模型—— CriticGPT&#xff0c;它可以用于查验ChatGPT 写出的代码是否出错。OpenAI的团队说&#xff0c;用户从 CriticGPT 获得帮助…

1panel 搭建多个网站

1panel 部署多个网站&#xff0c;另外的域名&#xff0c;或无域端口搭建方法。 当我们已经部署好一个网站后&#xff0c;想再部署一个网站在我们的服务器上时&#xff0c; 步骤&#xff1a;&#xff08;另外的域名&#xff0c;部署在同一个服务器方法&#xff09; 运行环境里…