高级 3D 图形:GNU Maverik——VR 微内核

作者:Adrian West

GNU Maverik 是一个帮助程序员创建虚拟环境 (VE) 的系统。它由一个学术研究小组构建,旨在解决在使用现有方法构建 VE 时发现的一些问题。Maverik 的主要贡献在于其管理图形和交互的框架,但它也带有广泛的内置功能,使入门变得简单直接。然而,Maverik 是一个程序员工具——它不是一个终端用户应用程序。

Maverik 是 GNU 项目的一部分,根据 GNU GPL 在完整源代码下免费分发。该发行版包括文档、教程和示例。Maverik 于 1999 年 2 月发布,已被全球数千个站点下载,并收到了来自学术和商业组织的积极反馈。

在本文中,我将介绍虚拟环境设计师面临的挑战的背景,然后描述 Maverik 如何解决其中一些问题。

引言

很容易对交互式 3D 图形感到兴奋,并想象美好的事物——在你梦想的房子里走动;在共享的天堂中与远方的朋友面对面交谈;或者与世界各地的专业同事在共享的虚拟环境中排练复杂的工程程序。

这些事情很容易想象,但令人惊讶地难以实现——看看这种技术在应用中缺乏真正引人注目的例子就知道了。那么问题是什么呢?直到最近,计算机硬件和 VR 外围设备的限制被认为是限制因素。在过去一年左右的时间里,随着 3D 成为更主流的功能,PC 图形加速器取得了巨大的进步。如今,廉价的 3D PC 加速器可以与最昂贵的 3D 工作站的性能相媲美,并且开始包含经济型立体快门眼镜支持等选项。

限制因素——我们如此容易想象的和我们可以轻松实现的之间的差距——现在更清晰地暴露为软件。编写 3D 应用程序是一项艰苦的工作。创建我们期望看到的令人印象深刻的游戏和动画电影序列需要数百人小时(程序员和艺术家)。然而,像玩具总动员这样的电影动画使用的技术远远超出了交互式帧速率所能达到的水平。当今最好的 PC 显卡的速度大约比实时完成玩具总动员慢 10,000 倍。这主要是由于建模的复杂性和使用的复杂光照计算。正如计算机游戏所展示的那样,实时完成令人印象深刻的事情是可能的。但是游戏依赖于纹理映射等方法,以在 VE 中给出远远超出实际存在的复杂性的错觉。在游戏中,您看到的复杂金属制品和布景大多是舞台布景:您无法从墙上取下大梁,它只是一张大梁的图片。

相比之下,对于真正的工程任务,CAD 模型的复杂性可能令人震惊——例如,一个真实海上平台的模型可能相当于半千兆字节的多边形数据,如果要在 VE 中用于交互式工作,则必须以每秒 10-30 次的速度处理这些数据(参见图 1)。

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel

图 1. 海上平台

让我们思考一下处理这种复杂性模型需要完成的各种事情;这将有助于理解 Maverik 背后的推理。为了应对海上平台,我们需要找到快速聚焦于任何时刻需要绘制的部分的方法。例如,在一栋有很多房间的建筑物中,您可以快速丢弃您知道从当前位置看不到的大部分模型。在一个大型“城市景观”的地面,我们可以计算出您可以看到的没有被其他建筑物遮挡的建筑物,并快速丢弃其他所有内容。因此,一些特定于应用程序的测试可以快速丢弃大量无关数据。在某些情况下,这些方法不起作用;对于海上平台,我们可以看到整个钻井平台的管道之间,因此我们需要不同的策略。但是,在极限情况下,我们将耗尽时间来渲染当前帧,因此有必要采取某种紧急方案。一个例子是对于更远处的视图,回退到线框表示(参见图 2)。这不会产生那么漂亮的静止图片,但如果它可以让您在 VE 中进行交互式工作,那么与“卡顿”的演示文稿相比,它可能会非常有效。

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel

图 2. 线框边界框

一种有前景的方法是用基于图像的渲染技术替换线框部分,用钻井平台的适当静止图片填充背景。然后动态扭曲这些静止图片,因此您不会注意到它们是静止图片。这是一个当前研究的主题。对于 VE,重要的是平滑地进行表示之间的任何此类转换,并避免对象在不同渲染样式之间“跳跃”,这非常令人不安。

大多数这些技术都得到了很好的理解,但是为了获得足够的速度而采用的特定技巧组合通常高度特定于应用程序。将每一帧组合在一起,同时管理其他问题,例如用户导航和应用程序行为,这非常具有挑战性。目前,如果您想尝试这样做,您有两种基本策略可供选择。

首先,您可以使用您喜欢的语言和 3D 图形库(如 Mesa 或 OpenGL)从头开始编写整个程序。这为您提供了很大的灵活性——您可以做任何可能的事情,并获得可达到的最佳性能。缺点是对于复杂的任务,这可能就像用汇编语言编写操作系统一样。它的级别太低,因此很难将您编写的内容重用于不同类型的应用程序。

您的第二个选择是使用专有软件包来构建虚拟世界。这样的软件包将使您快速入门,并有望内置对您需求的更高级别支持——例如,使您的 VE 可以在多个用户之间共享。为了支持这些高级功能,VE 软件包具有其自身的内部复杂性和 VE 的表示形式,毕竟,这就是您购买的东西。这里的缺点是 VE 系统内的复杂性可能不适合您想要做的事情(即,“一刀切”的方法可能不起作用)。如果您有一个复杂的应用程序,它将具有针对该应用程序调整的自身数据结构和算法。对于海上平台,构建它的 CAD 系统以梯子、管道、阀门等术语进行对话——非常高级的描述。要将此数据与 VE 构建软件包一起使用,必须将其从 CAD 系统导出,并以 VE 系统内部理解的任何格式导入。共同点通常是“多边形海洋”。因此,在将数据导出为 VE 系统的通用格式时,关于这些多边形意味着什么的大部分有趣信息都丢失了,并且利用该信息来提高速度的潜力也随之消失。

这种方法的第二个问题是,如果 VE 内的某个人操纵对象(例如,断开管道或阀门),那么必须以某种方式将其传达回您的 CAD 应用程序,该应用程序必须随后更新其自身的数据结构。因此,您获得了世界的两种表示形式,一种在应用程序内部,另一种在 VE 系统内部,并且必须保持这些表示形式同步。

因此,“现成的”VE 构建软件包可以很好地完成其工作。但是,随着对复杂 VE 的需求增加,我们遇到了编程复杂性的问题,以及维护两个不同的数据模型(其中一个模型可能是一个笨拙的多边形海洋)的固有性能限制。

Maverik——一种中间道路?

是否存在任何可能的中间道路?我们是否可以构建某种框架来支持 VE 的创建和管理,而又不将可以构建的内容限制为某种最低公分母?

我们相信是存在的,这些努力的结果就是 GNU Maverik。交互式 VE 的框架现在已成功用于实现一系列具有明显不同需求和优化策略的 VE 应用程序。

Maverik 是一个 C 工具包,它位于 Mesa 或 OpenGL 等 3D 渲染库之上,提供管理 VE 的工具。最好将其视为您希望在原始 3D 图形库之上获得的下一层功能。Maverik 的新颖之处在于它没有其自身的 VE 内部数据结构。相反,它通过回调机制(很像回调在 X11 等窗口管理器中的使用方式)直接使用应用程序自身的数据结构。

应用程序将它希望渲染的对象类告知 Maverik,并提供渲染所需的函数。Maverik 提供构建灵活的空间管理结构 (SMS) 的工具,注册的对象通过这些结构进行管理。当用户导航环境时,Maverik 会跟踪 SMS 并对应用程序进行适当的调用以渲染其对象。

有什么好处?

应用程序保持对其数据的控制,因此只有一个副本需要管理。更重要的是,应用程序可以在决定如何渲染对象时运用其对数据含义的所有了解;我们发现这是最能体现优化的方面。例如,如果 3D 文本对于应用程序很重要,那么一个好的数据结构可能涉及文本字符串和位置信息。但是,将 3D 文本导出到独立的 VE 软件包可能意味着以通用图形格式(通常是多边形)导出数据。VE 系统将需要处理比我们希望的更多的数据,这限制了我们可以构建的环境的大小。

使用 Maverik,应用程序可能会注册类“3Dstring”。稍后,当用户在环境中导航时,Maverik 会从 SMS 确定某些对象在视图中。对于 3Dstring 对象,它会调用应用程序提供的函数来渲染这些对象,然后应用程序动态生成多边形。应用程序可以在生成多边形时使用任何适当的优化,这使得诸如动态细节层次和处理改变形状的对象等技术变得简单直接。通过这种方式,Maverik 可以成为一个通用框架,并且仍然可以从最佳数据表示和高度特定于应用程序的优化中受益。

3D 文本示例是真实应用程序“Legible City II”的一部分,这是一个由 Jeffrey Shaw(德国 ZKM)创作的多媒体艺术作品。它使用上述技术来渲染三个由单词组成的大城市(阿姆斯特丹、曼哈顿和卡尔斯鲁厄)(参见图 3)。为了渲染更像游戏的环境,应用程序回调将使用更传统的游戏技术来渲染其对象(参见图 4)。

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel

图 3. 在 Maverick 中实现的可读城市 II 多媒体艺术作品

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel

图 4. 游戏中常见的特效技术

对于石油钻井平台,CAD 应用程序的本机数据结构(管道、阀门、走道等)以类似的方式使用。当应用程序被调用来渲染塔架时,它可以决定什么对于此帧是合适的渲染——例如,它可能决定始终渲染塔架,因为它对于导航来说是一个重要的地标。因此,应用程序可以动态更改表示形式以适应条件。同样,具有特殊光照算法(参见图 5)或非典型行为(如抽象信息可视化)(参见图 6)的应用程序使用其自身的定制结构和算法来保持实时性能。

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel

图 5. 辐射度光照模型

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel

图 6. 数据可视化

Maverik 画廊网页上给出了使用 Maverik 完成的工作示例。重要的特点是视频序列(都是相当大的文件)都是直接从使用 Voodoo2 3D 加速器的 450MHz PIII Linux PC 捕获的,并且很好地展示了使用经济高效的硬件设置可以达到的性能。

这是作弊吗?

我们获得的是在单个 VE 框架内将完全不同的应用程序组合在一起的灵活性,而不会损害性能。这是一个优势,但似乎是以应用程序(和应用程序程序员)完成所有艰苦工作为代价的。然而,由于 Maverik 是一个可以插入东西而性能损失很小的框架,因此很容易提供常用的设施和对象来启动许多应用程序。例如,Maverik 随附了常用几何图元库、圆锥体、圆柱体、茶壶、动画化身、示例图形文件解析器、导航设施、3D 数学函数、四元数代码、立体声、用于头戴式显示器和 3D 鼠标的 3D 外围设备驱动程序(参见图 7)等等。如果这些有用,那么您可以将它们用作一个好的起点。如果它们没有用,那么您可以提供您自己的对象和算法,或许可以改进提供的示例。

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel

图 7. 沉浸式编辑

这使得开始使用该系统相当简单直接。在实践中,这提供了三个级别,使用越来越复杂。

  1. 使用提供的默认对象和算法。以这种方式使用时,Maverik 看起来像一个面向程序员的 VR 构建软件包。该系统的教程文档引导用户构建具有行为、碰撞检测和自定义导航的环境。

  2. 定义您自己的对象类。在这里,您可以受益于特定于应用程序的优化,您可以通过提供您自己的渲染和相关的回调来提供这些优化。本教程给出了一个示例,提供的演示应用程序广泛使用了这些技术。不幸的是,海上平台示例使用了商业敏感数据,因此无法随发行版一起提供。

  3. Maverik 内核的扩展和修改。渲染和导航回调是可以自定义的一组工具。对于喜欢冒险的人来说,更多的 Maverik 核心功能也可以使用:例如,替代剔除策略、空间管理结构和输入设备支持。但这仍然发生在一致框架的上下文中,该框架似乎使将不同部分组合在一起变得容易。

作为研究工具,Maverik 的真正考验在于它如何允许将这些部分融入到整体难题中。希望它能使构建 VE 的任务“应该有多难就有多难”,避免让人感觉自己的努力主要花费在“与系统作斗争”上。到目前为止,在稍微熟悉这种方法之后,这看起来非常有希望。

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel

图 8. 导航算法

最近的 Maverik 开发包括一种新颖的力场导航算法,用于引导参与者绕过障碍物,以及一种用于探测用户前方几何形状以测试是否可以攀爬(例如梯子和台阶)的算法(参见图 8)。这些算法集成到 Maverik 中,但在撰写本文时,它们作为单独的测试版源代码发布以供测试。

您无法使用 Maverik 做什么

Maverik 不支持音频或视频。您需要自己添加您喜欢的音频或视频机制。

Maverik 是一个单用户 VE 微内核。它不包含任何帮助在不同机器上运行多个 VE 以在人们之间共享世界的帮助。要做到这一点,您需要自己通过网络同步 VE。对于仅仅在共享 VE 中导航,这并不难。在具有多个 VE、应用程序、交互和行为的广域网中运行具有许多用户的系统是一个更复杂的挑战。这是一个我们现在正在使用与 Maverik 互补的系统解决的挑战。我们的目标是在今年晚些时候根据 GNU GPL 许可证发布我们拥有的内容。

我们非常渴望了解这些想法对于其他人(尤其是那些具有图形编程经验的人)的效果如何,或者不起作用。通过这种方式,我们可以更多地了解整个领域。反馈应发送至 maverik@aig.cs.man.ac.uk。

致谢

资源

Advanced 3-D Graphics: GNU Maverik—a VR Micro-Kernel
电子邮件:ajw@cs.man.ac.uk

Adrian West (ajw@cs.man.ac.uk) 在英国曼彻斯特大学讲授计算机科学。他是高级界面研究小组的成员,致力于分布式虚拟环境的系统架构。

加载 Disqus 评论