Geomview
乍一看,Geomview 似乎是一个很酷的 3D 软件——一个玩具。 但实际上,只需花一个小时研究该程序和文档,您就会确信它是一个极其强大的可视化工具,具有几乎无限的应用。 使用鼠标,您可以轻松地旋转、缩放、平移和更改物体的光照。 您甚至可以使用内置的“飞行模拟器”在场景中“飞行”。
仅这些工具就足以让 Geomview 值得您加载到机器上,但还有更多。 Geomview 集成了一种图形命令语言 (GCL),您可以使用它以比仅使用鼠标更多的方式来操作 3D 对象。 此外,您可以将 GCL 命令从其他程序管道传输到 Geomview,从而可以将该软件包用作您自己代码的强大交互式显示。
Geomview 是在明尼苏达大学几何中心创建的,旨在用作通用查看器和数学研究的可视化工具。 因此,该软件包还具有显示 3D 对象表示形式以及在球面和双曲空间中显示对象的能力。 该软件包还包含允许您将 Geomview 用作 Mathematica 的默认 3D 查看器的代码。
本文演示了如何在 Geomview 中创建和动画对象,并告诉您如何获取副本。
Geomview 打包了 Geomview/data 目录中的大量示例图像。 入门非常简单,只需键入 geomview,后跟图像文件的路径和名称即可。 例如,图 1 显示了文件
/usr/local/Geomview/data/geom/office.oogl
以及您首次启动 Geomview 时将出现在屏幕上的另外两个小部件。 如果您在较慢的机器上运行 Geomview,您可能会注意到操作图 1 中稍微复杂的场景可能有点吃力。 因此,您可能希望从更简单的东西开始,例如
Geomview/data/things/dragon.off
或三叶结
Geomview/data/things/trefoil_knot.mesh
如图 图 2 所示。
执行旋转、平移和启动飞行模拟器都非常简单直接。 例如,要旋转相机小部件显示的场景,只需按下工具小部件上的 rotate 按钮,并在按住鼠标左键的同时在相机小部件中拖动鼠标。 场景将绕平行于相机窗口的轴旋转。 如果您松开鼠标左键,图形将继续旋转,速度与您松开按钮时鼠标的速度成正比。 (如果您希望场景保持静态,可以在 motion 菜单中通过切换到 inertia 选项来关闭此选项。) 平移和缩放同样简单。
当您第一次开始使用 Geomview 时,旋转场景可能有点笨拙; 但是,稍加练习,您将很快掌握操作对象的方法。 如果您想象相机显示的对象包含在一个巨大的假想球体中,这将有所帮助。 然后,鼠标是一个“抓手”,当单击鼠标左键时,它会抓住球体。 接合抓手移动鼠标将导致球体绕平行于相机平面的轴旋转。 要获得场景的另一个视图,您可以使用鼠标中键激活中间抓手而不是左键,从而绕垂直于相机平面的轴旋转。 平移也是如此。 要沿垂直于屏幕的轴平移,请使用鼠标中键。
您可以通过按下工具菜单中的 fly 按钮来激活 Geomview 的飞行模拟器,然后在按住鼠标中键的同时从相机小部件的底部拖动到顶部。 同样,您的飞行速度将取决于您移动鼠标的速度。 您可以通过在相机小部件上拖动鼠标并单击鼠标左键或中键来在场景中导航。 如果您想停止运动并认真观察某些内容,可以按下工具小部件上的 halt 按钮。
浏览 Geomview 小部件上的 inspect 菜单,您将看到可以选中和更改的场景的许多属性示例。 Geomview 不仅限于更改对象表面或边缘的颜色。 它还允许您控制照亮场景的光线的颜色、位置和强度。 Geomview/doc 目录中包含的手册中相当详细地描述了许多其他有用的选项。
Geomview 的机制包含在面向对象图形库 (OOGL) 中,该库也是由明尼苏达大学几何中心开发的。 Geomview 显示的所有场景都以 OOGL 对象的形式描述。 例如,Geomview 中的球体可以用名为 SPHERE 的 OOGL 对象来描述。 对象类型以及物理描述可以以 OOGL 对象文件的形式传递给 Geomview,对于简单的球体,该文件将包含以下文本
SPHERE # name of the OOGL object 1.0 # radius of the sphere 0 0 0 # x,y,z coordinate of the center
如果您从 Geomview 中打开此文件,则单位球体将出现在相机小部件中。
OOGL 对象文件也可以由多个 OOGL 对象组成。 例如,描述三角形切过上述球体中心的文件将如下所示
LIST # More than 1 OOGL object { # Separates the Objects SPHERE # A OOGL Object 1.0 # Radius 0 0 0 # Center, x, y, z } { OFF # Format for describing polyhedra 3 1 3 # Number of vertices, faces, edges -2.0 2.0 0.0 # vertex 0 4.0 0.0 0.0 # vertex 1 -2.0 -2.0 0.0 # vertex 2 3 0 1 2 # number of vertices, and order to # connect them }
OOGL 似乎相当完整,因为您可以在库的上下文中描述各种对象及其属性。 其他 OOGL 对象包括网格、贝塞尔曲面、线和四边形。 这些对象中的每一个都具有外观属性,例如表面颜色、表面反射特性和边缘颜色,这些属性可以从 Geomview 菜单或 OOGL 对象文件中指定。 但是,Linux 端口(与其他几个端口一样)尚不支持透明度属性。
Geomview 的强大功能之一是其图形命令语言 (GCL),它功能足够强大,不仅允许用户操作显示的场景,还可以更改外观属性并为其对象设置动画。 这些命令可以直接通过命令小部件键入到 Geomview 中,也可以从外部程序管道传输。 为了说明这有多么容易,请考虑以下示例:假设您想在查看器中为摆锤设置动画。 您首先需要用 OOGL 对象描述摆锤,然后通过绕通过悬挂摆锤摆动端的轴旋转摆锤。
一个简单的摆锤可以描述为两个对象,一条线作为绳索,一个球体作为摆锤。 或者,以列表对象文件的形式,我称之为 pendulum.list
LIST # More than 1 OOGL object { SPHERE # A OOGL Object 1.0 # radius of the sphere 0.0 0.0 -5.0 # center of the sphere } { VECT # A vector object 1 2 1 # lines, vertices, colors 2 # vertices in each line 1 # colors in each line 0.0 0.0 0.0 # vertex 0 0.0 0.0 -4.0 # vertex 1 1.0 0.0 0.0 1.0 # color of line # (red, green, blue, alpha) }
VECT 对象描述了摆锤的绳索,绳索从原点(顶点 0)到球体的顶部(顶点 1)。 最后一行描述了绳索的颜色。
为了说明目的,我还将在摆锤上方放置一个 8 个单位长度的正方形。 这用四边形对象 (QUAD) 描述,我将其放置在名为 ceiling.quad 的文件中。
CQUAD # QUAD object with color # vertex descriptions are # (x, y, z, red, green, blue, alpha) -4.0 -4.0 0.0 0.0 0.0 1.0 1.0 # vertex 0 4.0 -4.0 0.0 0.0 0.0 1.0 1.0 # vertex 1 4.0 4.0 0.0 0.0 0.0 1.0 1.0 # vertex 2 -4.0 4.0 0.0 0.0 0.0 1.0 1.0 # vertex 3
QUAD 前面的前缀 C 表示顶点颜色包含在顶点位置旁边。 也就是说,每行上的前三个数字描述了天花板的顶点,最后四个数字给出了颜色和反射系数。 所有颜色都以红色、绿色和蓝色的分数表示,通常后跟反射系数,Linux 端口忽略该系数。
为了使摆锤动画化,使用一个小的 C 程序通过连接在 Geomview 和程序的标准输入和输出之间的管道发送 GCL 命令。 这些命令告诉 Geomview 不仅将对象加载到查看器中,还要将摆锤绕 x 轴在 -30 到 +30 度之间以 1 度增量旋转。
#include <stdio.h> main() { int i,j; /* Select no normalization */ printf("(normalization g0 none)\n"); /* No bounding boxes */ printf("(bbox-draw g0 no)\n"); /* A 8X8 Plane */ printf("(load ceiling.quad)\n"); /* A sphere with a string */ printf("(load pendulum.list)\n"); /* Flush pipe to Geomview */ fflush(stdout); /* Swing to +30 degrees */ for (i = 0; i < 30; i++) printf("(transform \"pendulum.list\"" "g0 focus rotate 0.017 0.0 0.0)\n"); /* Swing to -30 degrees */ for (i = 0; i < 60; i++) printf("(transform \"pendulum.list\"" "g0 focus rotate -0.017 0.0 0.0)\n"); /* Swing back to 0 */ for (i = 0; i < 30; i++) printf("(transform \"pendulum.list\"" "g0 focus rotate 0.017 0.0 0.0)\n"); /* Flush pipe to Geomview */ fflush(stdout); }
要查看结果,请使用 gcc pendulum.c 编译程序。 接下来,从此目录启动 Geomview,并访问 inspect 菜单并选择 commands。 命令小部件将弹出,您需要键入 (emodule-define pend a.out) 以指示 Geomview 将可执行文件 a.out 加载为名为 pend 的外部模块。 如果一切正常,模块 pend 应该出现在外部模块列表中,并且可以通过单击单词 pend 来激活。 摆锤和天花板将出现在相机小部件中,并且摆锤将来回摆动。 您将必须使用 Geomview 的工具将场景旋转到 图 3 中所示的视图。
上述示例的 OOGL 对象文件加载和动画仅需几行 C 代码和总共 4 个 GCL 命令即可完成。 前两个 GCL 命令描述了 “World” (g0) 对象的一些特征,这些特征反过来被随后加载的所有对象采用。 默认情况下,当对象加载到 Geomview 中时,对象的坐标会被归一化,以便对象适合以原点为中心的单位球体内。 (normalization g0 none) 命令关闭此选项。 第二个命令告诉 Geomview 不要在其加载的每个对象周围绘制黑色边界框。 第三个命令 (load filename) 告诉 Geomview 加载 OOGL 对象文件 filename。
大部分工作实际上是由第四个也是最后一个 GCL 命令完成的。 transform 告诉 Geomview 将对象 pendulum.list 绕 x 轴旋转 0.017 弧度(约 1 度),绕 y 轴和 z 轴旋转 0 弧度。 transform 的另外两个参数 g0 和 focus 指定旋转是相对于 World 对象 (g0) 的中心进行的,并且将在相机的参考系中应用。 手册中描述了许多其他 GCL 命令,可用于动画化和操作 OOGL 对象。
尽管此处说明的示例相当简单,但应该很明显,Geomview 是一个具有众多应用程序的软件包。 Geomview 与强大的图形用户界面开发工具(如 Tcl 和 Wish)相结合,可用于在相对较短的时间内创建交互式 3D 应用程序。 这是一个非常强大的软件包,任何开发涉及 3D 图像的应用程序或任何需要易于使用的查看器来更好地可视化对象的人都不应忽视它,无论他是查看来自 Mathematica 的复杂数学输出还是线条和平面之间简单的几何关系。
您可以在多个位置找到 Geomview,包括 Sunsite。 但是,Geomview 的主页是匿名 ftp 站点 ftp.geom.umn.edu。 Linux 端口可以在 pub/software/geomview/geomview-linux.tar.gz (3.1 MB) 中找到。 源代码 geomview-src.tar.gz 在同一目录中提供。
如果您有 Netscape 或 Mosaic,我强烈建议您访问 Geomview 的万维网站点,该站点位于 www.geom.umn.edu/software/download/geomview.html。 在此站点,您不仅可以找到可执行代码,还可以找到 OOGL 文件格式的在线教程、FAQ 以及其他软件的介绍。 (当您在那里时,请务必查看他们的交互式 Web 应用程序,网址为 www.geom.umn.edu/apps/。)
解压缩 Geomview 后,它将在您的磁盘上占用大约 8.3 MB 的空间,包括大约 1 MB 的文档和 2.2 MB 的示例。 解压缩和解压将生成一个名为 Geomview 的新目录。 切换到此目录,阅读 README,然后键入 install。 安装脚本将询问您有关要安装可执行文件、手册页等的位置的问题。 在脚本末尾,它会询问您是否介意安装脚本将注册邮件发送到几何中心。 如果您不介意并且在您的机器上设置了邮件工具,则安装程序将为您注册并将您放在一个非常安静的邮件列表中(到目前为止,我只收到了注册确认)。
Tim Jones (jones@uinpla.npl.uiuc.edu) 是伊利诺伊大学核物理实验室的研究生,他在那里分析他的论文实验的数据,该实验最近在 CERNs Low Energy Anti-proton Ring 完成。