使用 Radiance 进行光照模拟
当我想在我的电脑上设计一个木屋,看看它在实际光照条件下会是什么样子时,我尝试了 AutoCAD、3D Studio Max 和许多现成的家居设计软件包。它们都无法提供逼真的输出,也难以支持处理我想要的木墙。我一直在摆弄劳伦斯伯克利国家实验室 (LBL) 的一个名为 Radiance 的光照模拟软件包,并决定我可以更快地得到我想要的东西,只需向其中添加实用程序即可。
Radiance 是一个物理光照模拟系统,主要由 Greg Ward Larson 编写。它自 1990 年代初期就已存在,最近将其许可从免费用于非商业用途的许可更改为开源模式。该软件包生成外观精美的图像,以特殊格式输出,该格式记录场景的纹理和物理光照,非常像专业产品 LightScape 和 Autodesk 的 VIZ 4。
用于电影和游戏制作的软件包实际上是图形领域的垃圾食品工厂。最终结果可能具有吸引力且受欢迎,但它并不实质。对于电影和游戏制作者而言,光照的物理细节不如速度重要,因为他们有很多像素需要推送。一部两小时的电影有 172,800 个单独的帧,游戏必须实时运行。因此,在大多数图形系统中,光成为艺术算法的产物,几乎没有现实基础。
Radiance 输出被认为是光物理学的实验室质量模拟(只要您的输入是真实的),并且已经在专业领域经过严格测试。
您可以从 radsite.lbl.gov 获取 Radiance 源代码。我建议获取源代码 tarball,因为编译后的 RPM 不包含任何辅助文件。一旦您有了 tarball
$ tar xzf rad3R4.tar.gz $ cd ray $ ./makeall install
然后,只需回答有关您想要将软件放在哪里的问题。我使用 $HOME/radiance/bin 作为二进制文件,使用 $HOME/radiance/lib 作为辅助文件。
makeall 脚本不安装示例场景或文档,因此您也必须将这些文件移动到合适的位置。例如
$ mv doc/man $HOME/radiance $ mv obj $HOME/radiance
请务必将这些内容添加到您的个人资料中的 MANPATH 和 PATH 变量中。一个注意事项:软件包中有一个名为 rview 的重要实用程序。不幸的是,Vim 也有一个同名的实用程序,因此请使用 PATH 修改或重命名 Vim 的 rview。请不要重命名 Radiance 实用程序,因为它会被其他 Radiance 实用程序间接调用。
Radiance 的新用户首先会注意到缺少用于生成场景描述的 CAD 系统。该软件包是 1990 年代初期在 UNIX 下为研究目的而编写的,如果您查看文件格式,很明显它们是为像我这样喜欢管道和纯文本处理能力(毕竟我的首字母缩写是 AWK)的命令行迷编写的。
然而,有一些实用程序可以将几何图形从 DXF、Wavefront 和 MGF 等格式转换过来,因此您可以使用任何可以输出此类格式的实用程序。在 linux.org 的应用程序存档中列出的许多建模器都将输出其中一种格式。如果您碰巧拥有兼容版本的 AutoCAD,Radiance 网站还提供了一个基于 Windows 的 AutoCAD/Radiance 模块,名为 Desktop Radiance。
Radiance 的输入文件是人类可读的,这使得它们非常适合脚本生成。但是,请注意:文档中的偶尔术语会使路过的物理学家心跳加速,例如“每球面度每平方米瓦特”。请务必查看网站上的所有文档。如果您决定不仅仅是玩玩,您可能需要找到 Greg Ward Larson 等人编写的 Rendering With Radiance 的副本。目前已绝版,因此请咨询二手书商。
清单 1 是一个场景,包括天空和地面、黄铜材料以及应用了黄铜材料的球体。天空和地面是标准的。您唯一需要为您自己的场景编辑的是 gensky 的选项。清单中的值对应于 11 月 25 日中午,北纬 33° 和西经 80°。南和东使用负数。
场景描述中的每个项目都具有相同的格式。第一行声明一个将应用于条目的现有材料(如果那不适用,则为空),材料或几何图元(如球体、多边形、塑料或金属)的类型名称以及用户定义的名称。接下来的三组是条目的字符串、整数和实数(浮点)参数。每个参数都以参数计数开头,后跟实际参数。它们可以分布在尽可能多的行上。
大多数条目只有实数参数。这解释了大多数条目中间的两个零;它们没有字符串或整数参数。黄铜最后一行中的 5 表示五个实数参数,球体最后一行中的 4 表示四个实数参数。这些参数很简单明了。例如,一个球体需要一个中心 (x, y, z) 和一个半径。
材料可能是场景中最难的部分。最简单的方法是从复制现有材料并根据您的需要进行修改开始。有关更多详细信息,请阅读网站上的 refman.pdf。
清单 1 顶部的 gensky 行是嵌入式命令行实用程序。在 Radiance 场景中,在一行的开头放置一个感叹号会告诉系统将该行作为 shell 命令运行,并将输出用作场景的一部分。Radiance 附带了许多此类实用程序,我发现编写自己的实用程序可以使场景生成快速而轻松。
大多数生成器将对象放置在原点,这不太可能是您想要的位置。xform 实用程序解决了这个问题。其语法是
xform -t transx transy transz -rx angle\ -ry -s scalefactor optional_scenefile
xform 可以转换文件中的所有内容,或者您可以将生成器实用程序的输出通过管道传输到它。它可以缩放对象 (-s factor)、绕轴旋转 (-ry angle 表示绕 y 轴旋转) 和平移到新位置 (-t x y z 表示平移 x y z)。您可以多次使用不同的选项,顺序任意。操作按照它们在命令行中出现的顺序完成。此外,请务必注意生成器使用的确切默认位置。它们中的大多数都将一个角放在原点。
图 1 显示了 xform 对 genbox 生成的一组立方体的效果。在此图像中,查看器位于 +z 轴上,向后看朝向原点。红色轴为 +x,绿色为 +y。

图 1. xform 的行为。轴是颜色编码的:+x = 红色,+y = 绿色,+z = 蓝色。蓝色框未转换。红色框已旋转,然后平移。绿色框已平移,然后旋转。
蓝色框是调用 genbox 的未修改输出。红色框是相同的 genbox,带有 xform
!genbox redplastic box1 .5 .5 .5 \ | xform -rz 45 -t 2 0 0
绿色框是
!genbox greenplastic box2 .5 .5 .5 \ | xform -t 2 0 0 -rz 45材料(如 redplastic)在这些调用之前定义,但未在列表中显示。您可以看到参数的顺序如何影响操作,从而影响输出。
我编写了许多 Perl 生成器,可用于组装小木屋和木屋(以电子方式提供)。在本文中,我使用了 genlogwall、genlog 和 genroof。所有这些都以英寸为单位输出,即使它们有时以英尺为单位接受参数以便于使用。我使用的材料也包含在电子发行版中。
genlog 实用程序生成一个带帽圆柱体,沿 +x 轴居中(图 2)。它需要几个参数
genlog material name length_ft diam_inches

图 2. 来自 genlog 的未修改输出。轴以 RGB/xyz 顺序排列(R = +x,G = +y,B = +z)。x 轴在日志内部。
material 应该在您的场景中预定义,name 应该是您自己命名的。我提供的预定义材料文件有三种木材材料,针对外观正确的原木进行了定向:xpine、ypine 和 zpine。您应该选择与您的原木最终对齐方式匹配的材料。
如果您想制作一个 10 英尺高、直径 8 英寸的杆子,指向 +z,其底座位于 (15 英尺, 0 英尺, 0 英尺),您会这样做
!genlog zpine mypole 10 8 | xform -ry 90 -t 180 0 0
请记住为 xform 使用正确的单位:180 英寸是 15 英尺。
实用程序 genlogwall 采用以下形式
genlogwall material name length_ft height_ft \ logdiam_inches [hole_data_file]
可选参数是一个数据文件,指示墙上应该有哪些孔以及每个孔中应该有什么,例如窗户或门。此时,如果我们从图 3 中的平面图开始工作,这将有所帮助。

图 3. 小木屋的平面图。孔的尺寸是从它们出现的墙的端点测量的。
有四面墙,每面墙长 15 英尺。我选择小屋的西南角为 (0,0,0),向东增加 x,向北增加 y,向上增加 z。根据 gensky 生成的标准天空,此方向使建筑物朝南。genlogwall 始终将生成的墙放置在 (0,0,0) 沿 x 轴的位置,如图 4 所示。

图 4. 来自 genlogwall 的非转换墙输出。轴的颜色以 RGB/xyz 顺序排列。
孔数据文件很简单。每行一个孔描述
holebottom_ft holetop_ft holestart_ft width_ft[:w|d]
前两个数字是从地面测量的,后两个数字是从墙的起始边缘测量的(x = 0,x 增加)。末尾的可选标签指示您希望墙生成器用窗户或门填充孔。我们的平面图需要两个这样的孔描述文件(参见清单 2 和 3)。您可以对多面墙使用相同的数据文件,但前提是您希望它们具有相同的孔集。
清单 2. 南墙的孔描述文件 (holes/southwall.holes)
清单 3. 东墙的孔描述文件 (holes/eastwall.holes)
我们小屋的最后润色是屋顶。通用屋顶生成很棘手,因此 genroof 工具让您比其他工具做更多的工作。
genroof 生成屋顶的平面部分;多次使用 xform 以生成整个屋顶。
genroof 需要一个数据文件。在数据文件中,提供从平面图中读取的屋顶部分的顶点的 x-y 坐标(以英尺为单位),沿边缘逆时针顺序排列。顶点都必须在正象限中,并且任何峰的边缘都必须平行于 x 轴。
要从平面图中找出点,请旋转它,使屋顶的峰从左向右延伸。现在忽略屋顶的下半部分,并将上半部分的左下角视为您的新原点。然后您的点是 (0,0)、(21,0)、(21, 10.5) 并返回到 (0,0)。还不错。
点应每行输入一个,用空格分隔,以字母 b、mp 或 p 结尾,以指示点是位于屋顶部分的底部、中间的某个位置还是峰值。这是必要的,因为可以为不寻常的屋顶生成奇形怪状的屋顶部分。
如果您希望 genroof 实用程序用原木填充屋顶的末端,您还需要端盖的坐标。查看我们屋顶方向的平面图,您可以轻松地看到盖子应该沿着墙壁在 (3,0)®(3,7.5) 和 (18,0)®(18,7.5) 处。将此信息添加到屋顶数据文件的末尾,并以标记 c: 为前缀。小屋的完整屋顶数据文件如清单 4 所示。
genroof 的命令行调用是
genroof -o overhang_ft typename name \ roofdatafile height_ft thickness_in
overhang 参数允许实用程序调整零件的位置,以便您可以将其转换为墙的高度,而无需担心满足屋顶的坡度。清单 5 中完成的小屋场景显示屋顶部分的 z 变换与墙的高度匹配,即使悬垂部分会低于墙的顶部。
我们的屋顶是对称的,因此我们使用相同的 genroof 和不同的 xform 来制作另一半。这很容易。
Radiance 附带一个名为 rad 的实用程序,其工作方式类似于 UNIX make。rad 的输入文件有一系列变量,告诉它您希望如何渲染场景,它会计算出如何调用用于模拟光的许多其他程序。注释示例显示在清单 6 中。
清单 6. cabin.rif:一个输入文件,告诉 rad 实用程序哪些选项和文件用于生成图片
大多数接受文件名的变量可以根据适用的文件数量定义多次。view 变量也可以定义多次。每个视图定义都会生成一张图片。您应该包括视图的名称、您想要放置眼睛的位置 (-vp viewpoint)、您想要查看的方向 (-vd view direction vector) 以及哪个方向是向上 (-vu view up vector)。我也喜欢 -vt 选项,用于生成角度(鱼眼)视图。
将 H 值与各种质量设置一起使用可能需要很长时间(在 2GHz 机器上超过 10 小时)。大多数情况下,H 设置是过度的,M 可以正常工作。交互式渲染使用 L。文档和一些实验将帮助您找出最适合您的场景的设置。
要交互式地查看场景,请使用命令
$ rad -o x11 cabin.rif
交互式查看时,场景可能显得明亮且泛白。键入 e,按 Enter,然后单击图像中的一个亮点以修复曝光。您不必等待渲染完成。
您可以随意试验曝光。Radiance 图像数据的动态范围远远超过显示器的动态范围。这意味着您最终可能会得到完全黑暗或完全白色的图像,这些图像可以调整到您的显示器,而不会丢失数据。这与普通图像文件截然不同,在普通图像文件中,过度调整亮度可能会导致永久性信息丢失。
您可以在交互式渲染时使用 L 命令从 rif 文件加载备用视图。例如,如果您的 rif 文件中有一个名为 interior 的视图,则键入 L interior 会加载它。您可以通过键入 v 并按 Enter 手动输入视图。只需回答提示即可。键入 q 并按 Enter 退出交互式渲染器。
要生成所有视图的图像,请使用
$ rad cabin.rif
然后使用以下命令查看图像
$ ximage *.pic您可以通过单击图像并按 A 进行自动曝光、按 H 进行人眼响应或按 = 根据您单击的像素进行调整,来调整 ximage 中图像的曝光。
图 5 和图 6 显示了我们小屋的两个已完成的日光模拟。

图 5. 白天小屋的透视图,添加了一些树木以增加趣味性。在 1.7GHz 笔记本电脑上以 3300 × 2200 的分辨率渲染以获得出版质量大约需要五个小时。

图 6. 小屋内部的角视图,仅由窗户日光照明。在 1.7GHz 笔记本电脑上以 3300 × 2200 的分辨率渲染以获得出版质量大约需要五个小时。
您可以从 ximage 获取在某个区域平均的光读数。只需拖出一个框并按 L 获取亮度值或按 Enter 获取辐射率值。有关这些数字含义的快速物理教程,请参阅 www.intl-light.com/handbook/rad.html。按 Q 退出图像。
由于篇幅限制,我在本文中仅介绍了 Radiance 的一小部分。如果您想用日常生活中的杂物进一步填充您的场景,请务必查看 Radiance 网站上的家具和植物链接。