Megahedron—一个 3D 图形环境

作者:Michael J. Hammel
Megahedron—A 3D Graphics Environment
  • 制造商:Syndesis Corporation

  • 电子邮件:syndesis@threedee.com

  • 网址:http://www.threedee.com/

  • 平台:Intel Linux,Silicon Graphics,Windows NT

  • 价格:99 美元

  • 评论员:Michael J. Hammel

Linux 上的 3D 图形世界在过去 2 年中取得了长足的进步。当我最初开始研究 Linux 的图形工具时,只有少数公开可用的 3D 渲染器,几乎没有 3D 建模器。从那时起,建模器的数量显着增长(我可以数出目前正在工作的 5 个成熟的建模器,以及至少 2 个正在开发中的)。3D 渲染工具也看到了巨大的增长,POV-Ray 和 BMRT(Blue Moon Rendering Tools)是任何平台上最好的建模器之二,名列前茅。

不久前,我偶然发现了一个我在 comp.os.linux.announce 新闻组中看到宣布的新产品:Megahedron。我实际上没有使用过该产品(它过去是,现在仍然是商业产品),但我对该公告很感兴趣。当《Linux Journal》抢先一步并向我提供了一份副本进行评测时,我将 Megahedron 列入了我的“购买清单”。

Megahedron 是一款建模器和 3D 图形引擎,它使用类似于 POV-Ray 场景描述语言的解释型语言。它在许多方面与 POV-Ray 不同,例如能够即时进行线框动画和内置网络渲染。该软件包在多种平台上受支持,包括 Windows NT(x86 和 DEC Alpha)、Silicon Graphics 和 Intel Linux。99 美元的标价为您提供一张 CD-ROM,其中包含适用于这些平台中每个平台的二进制文件和完整配置。许可涵盖购买者与 Megahedron 一起使用的任何机器,但如果其他用户希望使用它,则必须购买自己的副本。就商业产品而言,这是一个相当宽松的许可。

安装

可分发的软件包包含一张 CD,装在常用的塑料盒中。所有文档都以 HTML 格式存储在 CD 上。CD 上有一张单独的插页,解释了从根目录中名为 mhedron.htm 的 HTML 文件中包含的文档的哪里开始阅读。此页面是完整文档的主目录。

Megahedron 的安装很简单

  1. 选择一个基本目录来安装软件包,通常是 /usr/local。如果该目录不存在,请使用 mkdir 创建它。

  2. 将 CD 上 Linux 目录中的 tar 文件复制到选定的基本目录。

  3. 解压 tar 存档。

安装的唯一问题是说明列在手册第一章第四节的第四部分中。手册是目录中的第三个标题。mhedron.htm 中的第二个条目是“快速入门”。本教程建议更改源代码,这不能直接从 CD 完成,因此您必须首先进行安装。安装说明还说“从您的硬盘驱动器或直接从 CD 解压缩 [软件包]”。这不太正确,因为软件包未压缩——它只是一个 tar 存档。尽管存在这些疏忽,但安装还是相对简单的。

文档

与许多可用的免费软件包不同,Megahedron 附带大量的文档,所有文档都在 CD 上以 HTML 格式提供。这是一个不错的奖励,因为您可以从浏览器打印感兴趣的页面。大多数 HTML 文档打印出来不超过 7 到 10 页,这还不错。最令人印象深刻的是所提供的信息量。

主目录包含指向其他五个区域的链接:简介、快速入门、艺术画廊、用户手册和示例源代码。“快速入门”简要介绍了名为 SMPL(Simulation and Modeling Programming Language,仿真和建模编程语言)的解释型语言的一些建模、动画和程序方面。本教程相当有趣。我发现火车线框动画特别有趣,因为我见过的其他大多数工具都不提供此类功能(一个值得注意的例外是 BMRT 发行版中的 rendribv 程序)。

从艺术角度来看,艺术画廊不是很令人印象深刻。这些图像比着色功能更好地展示了 Megahedron 的建模功能;未来的版本应该探索 SMPL 提供的各种着色功能。这种不足可能仅仅是因为创建图像的人们在技术上比在艺术上更倾向于技术,但真正有用的 3D 图像应该呈现技术和艺术方面的良好融合。图 1 和图 2 显示了艺术画廊中的一些图像。与它们相关的 HTML 代码列表未在此文章中打印,但可以通过匿名 ftp 在文件 ftp.linuxjournal.com/pub/lj/listings/issue41/2282.tgz 中获得

Megahedron—A 3D Graphics Environment

图 1. Megahedron 仙人掌

Megahedron—A 3D Graphics Environment

图 2. Megahedron 跑车

曾尝试对示例 SMPL 源代码进行颜色编码,但结果有些有限。有很多代码用于实验目的,尽管我不得不承认我没有运行太多。

文档的重点在于手册,一份七章文档,外加索引、术语表和 SMPL 语法附录。这七章相当详细地介绍了建模和渲染方面。我希望看到这两个领域被分成单独的区域;Megahedron 将建模器与渲染器合并得有点过分了,不符合我的口味。还有大量材料涵盖着色器的使用。

功能

Megahedron 功能丰富。文档中标题为“什么是 Megahedron?”的部分给出了详细的功能列表,包括

  • SMPL 解释型程序语言

  • 可编程着色语言(使用 SMPL)

  • 渲染模式,从线框到完整光线追踪

  • 各种投影,包括鱼眼投影

  • 仿真功能,例如碰撞检测和光线相交

  • 网络渲染

当然,这不是完整列表,但它应该让您了解可用功能的范围。

SMPL

SMPL 是 Megahedron 的编程语言,它看起来有点像 Basic。如果您熟悉 POV-Ray 或 BMRT 之类的工具以及向量、对象图元和变换,那么它就相当直观。如果您不熟悉,则有很多简单的示例可以帮助您入门,手册中的术语表和索引将帮助您找到浏览源代码的方法。

SMPL 程序具有以下通用格式

do task2, task3;
<include files>
integer a;
procedure task1 is
        <declarations>
        <statements>
end;
procedure task2 is
        <declarations>
        <statements>
end;
procedure task3 is
        <declarations>
        <statements>
        task1;
end;

声明包括数据、类型和子程序声明。语句包括对象声明和实例、变换等等。

该语言支持的数据类型相当直观,但在语法上与 RenderMan 和 POV 略有不同。在 RenderMan RIB 文件格式中,字符串类型是 String,而 Megahedron 使用 char。正如您所看到的,数据类型是显而易见的。RenderMan 使用 point 来指定空间中的 3 个点的集合,每个点都是一个浮点值。Megahedron 为相同的目的使用 vector 类型。另一方面,POV 实际上没有数据类型。所有变量都具有声明的值,这些值在代码处理之前进行预处理,将声明的值替换为变量的名称。哪种方法更好取决于用户的偏好。我喜欢定义的数据类型,因为类型检查可以预先完成。Megahedron 对 const 语句的使用允许枚举值,这是一个不错的补充,在 RIB 文件中似乎不可能实现。(尽管如果您使用 RenderMan API,您正在编写 C 代码,因此枚举类型不是问题。)

通过使用 procedure 语句支持子例程。变量的作用域很像 C 作用域,变量可以在本地或全局访问,但不能跨过程访问。过程用 procedureend 语句分隔。过程以及多维数组中都支持静态变量。

该语言有一个令人恼火的方面:它使用花括号进行注释。在过去的 10 年里,我使用过很多语言,但不记得有任何语言使用花括号进行注释。在我看来,传统的 C 和 C++ 注释标记 #/**/// 会更好。

文档中的一个弱点是对文件 I/O 例程的描述。尽管文件 I/O 是可能的,但不清楚如何将模型信息输出到文件。如果提供一些用于输出模型信息的示例将会很好。毕竟,由于我更喜欢使用 BMRT 的渲染器而不是 Megahedron 的渲染器,我需要一种输出 RIB 文件的方法才能使用 SMPL 进行建模。渲染后的图像可以保存为 RAW 或 TGA (Targa) 格式。我在“显示控制”部分找到了此信息,而不是在我预期的“文件 I/O”部分。在浏览系统文件 smpl_prims 时,我发现暗示也支持 JPEG 格式,但我没有在其他地方找到确认。

建模功能

与 RenderMan 的 RIB 和 POV-Ray 一样,SMPL 文件是描述 3D 场景的各个部分的集合。在 SMPL 中,您有用于定义相机和渲染选项的部分(类似于 RenderMan 中 WorldBegin/WorldEnd 语句之外的部分)、对象声明、静止帧和动画。静止帧实际上是场景的核心,对象在其中被实例化、纹理化、变换等等。SMPL 的过程性允许声明对象一次,并在整个帧中多次实例化它们。例如,一个球可以被定义为一个带有孔洞的球体,它可以用来在一个帧中实例化 100 个处于各种不稳定状态的球体。

任何 3D 渲染系统的重要组成部分是其执行变换的能力。变换允许对象(球体、立方体或更复杂的图形)在图像的实际渲染之前移动到其在 3D 空间中的位置,或者调整大小或修改形状(例如,拉伸或倾斜)。Megahedron 允许对象相对于其当前大小和位置或绝对地进行变换。绝对变换指定确切的大小或位置,而不考虑当前的大小或位置。

变换是使用对象的 with 子句指定的,如下所示

<object name>
                with
                        <transformations>
        end;

变换可以嵌套,相对变换基于变换堆栈,很像 RenderMan 或 POV-Ray。实例化对象会为其提供当前的变换状态,并且在实例内进行的新变换仅适用于该特定实例或在其下创建的任何实例。换句话说,这是一个分层模型。如果您熟悉 POV 或 BMRT,那么您应该可以轻松学习 Megahedron 中变换的语法和用法。

RenderMan 和 Megahedron 之间的一个区别是如何完成相机变换。在后者中,相机实际上是移动的。这类似于 POV 处理相机变换的方式,但不同于 RenderMan 处理它的方式。重要的是要了解在使用任何 3D 软件包中的变换时移动的是什么。

支持的照明图元包括远距离点光源、聚光灯和环境光。这些是 POV 和 RenderMan 支持的相同照明类型。每种类型都有自己的参数,例如亮度(在 RenderMan 中称为“强度”)和颜色。RenderMan 中的照明通过使用着色器来处理,因此可以创建各种类型的灯光以与 BMRT 一起使用。Megahedron 似乎提供了类似的功能,尽管我没有深入研究这一领域。

最棒的功能之一是实时动画功能。可以交互式地运行线框显示,其中可以包括隐藏面消除。交互式显示还可以利用鼠标和键盘输入来控制显示。提供了示例,展示了如何做到这一点。

可编程着色

与任何 3D 环境一样,建模是不够的。线框显示可以让你瞥见你的场景(或动画)的外观,但如果没有广泛的着色,模型看起来会相当乏味。Megahedron 提供了一组丰富的着色功能:使用反射、折射和阴影的光线追踪,以及图像、凹凸和程序映射,仅举几例。提供了一系列库存着色器,如花岗岩、脊状和多云。支持 Targa (TGA) 格式的图像贴图。有趣的是,Megahedron 将所有图像贴图坐标从 (0,0) 映射到 (1,1),其中前者是贴图的左下角。RenderMan 将 (0,0) 映射到左上角,将 (1,1) 映射到右下角。如果您习惯使用 BMRT,则在使用 Megahedron 图像贴图时,请务必牢记这一点。

着色语言比 POV-Ray 的纹理命令更接近 RenderMan 着色语言。这可以从手册“着色器剖析”部分中使用的示例中看出。在这里,颜色是通过添加先前计算的值来定义的,例如

diffuse = (illumination + ambient) * color * .3;
specular = reflect (color * .4);
highlight1 = highlight1 * color;
highlight2 = highlight2 * color;
metallic_color = diffuse + specular + highlight1
        + highlight2;

这种纹理分层方法与 POV-Ray 的方法不同。在 POV 中,对象的最终纹理基于在多个 texture{} 语句中定义的一系列纹理。从某种意义上说,这两种方法在计算上是相同的,但从用户的角度来看,层混合在过程语言(Megahedron 和 RenderMan)中更明显且更容易控制。如果您像我一样从 POV 开始,您可能会发现这起初有点令人困惑。但是,一旦您了解了纹理分层在 Megahedron 中的工作方式,您就会体会到它提供的控制。

发行版中提供了许多预定义的着色器。在系统目录中,有一些 SMPL 的扩展(用 SMPL 编写),包括一些有趣的着色器,例如“vampires”(在镜子中不显示)和“ghosts”(仅在镜子中显示)。这些着色器看起来相当有趣,我不禁想知道为什么示例图像似乎没有使用它们。

BMRT、POV 和 Megahedron 功能集之间的一个重要区别是,只有 BMRT 支持置换贴图。这些贴图类似于凹凸贴图,不同之处在于表面上的点实际上是被移动了,而不是仅仅调整点的法线以使表面看起来凹凸不平。

快速入门

我喜欢文档的这一方面,但它有一些可用性问题。首先,本教程将示例目录指向 smpl/<directory>。这是不正确的——没有 smpl 目录。本教程还(除非我错过了)没有提及系统特定目录是 CD 上的顶级目录。在系统目录下是 mhd 目录,其中包含示例、代码和系统文件。如果您只是通读“快速入门”,可能会有点困惑——请务必先浏览 CD 目录结构。

另一个相当有趣的遗漏是,“快速入门”没有提及您将要运行的程序的名称。在快速搜索 CD 上的 Linux 目录后,我找到了 bin 目录和 imhd 程序。

运行示例时出现了很多问题。ideal_gassonic_boomslicer.smpl 都是从鼠标获取输入的示例。起初,我做的任何事情似乎都没有影响示例;最终,我发现我必须稍微移动鼠标才能识别按钮按下。这可能是 X 服务器问题,但我认为问题实际上是 SMPL 代码定义的热点区域。似乎识别按钮按下的区域小于可见按钮区域。

在撰写这篇评论时,我经常在运行编辑器的 xterm 和运行 Netscape 的另一个 xterm 之间切换桌面(我使用 FVWM2),以便使用浏览器阅读 Megahedron 的文档。我还将示例程序与 Netscape 放在同一桌面上运行。每当我切换到我的编辑器桌面,然后再切换回 Netscape 桌面时,示例程序的一些窗口都没有更新。例如,sonic_boom.smpl 创建了两个窗口——一个显示飞机和“声波”从飞机旁经过,另一个显示用于设置飞机推力的控件以及当前速度显示。当我切换桌面时,第二个窗口不会重绘。ideal_gas 示例也存在类似的问题,但我发现,如果我通过上下移动活塞来强制更改显示,我可以让控制窗口更新。这限制了交互式程序在支持多桌面的窗口管理器中的实用性。

另一个小问题是示例创建的窗口未分组。因此,我的窗口管理器的 AutoRaise 功能不会提升与示例关联的所有窗口。这可能有点烦人,但这只是一个小问题。

总结

总的来说,我发现 Megahedron 的功能集非常广泛。该文档比我见过的任何同类工具都更胜一筹。我一直在寻找新手用户可以轻松上手的工具。仅凭文档和示例程序的优势,Megahedron 当然属于这一类。然而,它并非完美。请参阅侧边栏 1 和 2,了解 Megahedron 的优点和缺点的列表。

Megahedron 优点

Megahedron 缺点

在某个时候,“3D 坐标简介”中说,使用 Megahedron 不需要了解代数或三角学。可能没错,但如果没有这两者,您可以使用 Megahedron 做的事情将受到严重限制。面对现实吧,知道如何在 3D 中放置对象不仅需要理解几何学,还需要理解三角学。

我在这篇评论中没有涉及的一个领域是渲染引擎。由于我的系统时间有限,我没有进行很多完整的渲染。(我还有其他渲染正在运行,需要保留一点系统时间用于其他工作。)如果您有机会尝试 Megahedron 并可以将其与 BMRT 和/或 POV-Ray(或任何其他在 Linux 上运行的渲染器)进行比较,请随时写下来并传递给我。我很可能会将其包含在未来《Linux Gazette》的“Graphics Muse”专栏中。

尽管提到了这些问题,但我认为 Megahedron 对于新用户开始使用 3D 图像来说是一个不错的方式。经验丰富的用户也可能会发现动画功能非常有用,尽管使用内置渲染器时动画可能不如人意。如果不使用更详细的图像来充分利用着色语言,就很难说。文档非常广泛且编写良好,许可对用户友好。我会向任何有兴趣了解更多关于 3D 图形的人推荐这个软件包。

Michael J. Hammel 是科罗拉多州丹佛市 EMASS 公司的 X Windows 和应用程序软件工程师。他是 Linux Gazette 中“Graphics Muse”专栏的作者,Linux Graphics Mini-HOWTO 的维护者,以及 Ventana 出版的 The Unix Web Server Book 的合著者。他在计算机之外的兴趣包括 5K/10K 比赛、泰国菜和园艺。他建议,如果您对他有任何认真的兴趣想了解更多信息,请访问他的主页 http://www.csn.net/~mjhammel。可以通过电子邮件 mjhammel@csn.net 与他联系。

加载 Disqus 评论