POV Ray 是个画家,但他画画的方式很奇怪,用的不是画笔,而是咒语。匿在家中,躲避新型冠状病毒的我,在娃去院子里骑着童车周游世界的时候,百无聊赖,决定向 POV Ray 学一点用咒语作画的本事。
POV Ray 的家远在万里之外的「http://www.povray.org」。新型冠状病毒的力量足以迫使人类关闭了交通系统。如果我是病毒,会努力摧毁互联网。幸好我不是,所以动动手指,我就来到了「POV Ray 的书房」。
「我知道你会来的。」POV Ray 淡淡地说。之前我来过多次,每一次他都这样说,背对着我,像是在欣赏窗外明媚的阳光,却总是看得见我来了,似乎他的后脑勺能够发射一些有触觉的光线,渲染着我的出现。
「我来学画。」我第一次对他这样说。
「从哪开始?」
「从最简单的开始。」
「好……天地玄黄,宇宙洪荒……」
「请不要讲人话。」
「用你喜欢的文本编辑器在你喜欢的目录下创建一份随便取个名字的文件,譬如 foo.pov,其内容为
#version 3.7;
这就是 3.7 版本的『天地玄黄,宇宙洪荒』,也是最简单的画的咒语。」POV Ray 一本正经地说,「如果你想看到这幅画,需要在终端里执行
$ povray foo.pov
然后,用你喜欢的看图工具,在 foo.pov 所在的目录内打开 foo.png 文件。」
我按照他说的做,一步也不差,结果看到了一幅 800 x 600 像素的图片,画面里什么都没有,每个像素都是黑色。
「你看到了什么?」POV Ray 问。他的声音很近,但似乎又无限远。
「什么都没看到,但似乎又看到一切。」
POV Ray 指了指我的终端,「你所说的,前者是辩证唯物主义,后者是形而上学。事实上,除了前者,我还看到了警告和可能的错误……」
我这才注意到终端里一大堆 povray 输出的信息中夹杂着:
File 'foo.pov' line 1: Parse Warning: No objects in scene.
Possible Parse Error: assumed_gamma not specified in this POV-Ray 3.7 or later
scene. Future versions of POV-Ray may consider this a fatal error. To avoid
this warning, explicitly specify 'assumed_gamma 1.0' in the global_settings
section. See the documentation for more details.
POV Ray 指着那条警告说,「要实事求是,No objects in scene,是因为我们并没有画什么。」然后,他指着那条可能的错误说,「至于这个 assumed_gamma
变量,说来话长……现在只需要记住,把它设置为 1.0。所以,应在 foo.pov 文件中增加
global_settings {
assumed_gamma 1.0
}
便可杜绝 povray 严厉的抱怨。」
我一向不拘小节,可以容忍 assumed_gamma
变量的说来话长,却无法接受一个什么都没有的黑色空间,「可不可以画一个盒子?」
「可以。你知道它的位置和尺寸吗?准确点。」
「盒子的中心在原点 (0, 0, 0),长 30 cm,宽 15 cm,高 10 cm。」
POV Ray 点点头,「以米为基本单位,在 foo.pov 文件中增加
box {
<-0.15, -0.075, -0.05>, <0.15, 0.075, 0.05>
}
不过,你还应该把盒子的颜色告诉我。」
「黄色。」
「那么,上述的盒子咒语应该改为
box {
<-0.15, -0.075, -0.05>, <0.15, 0.075, 0.05>
texture {
pigment {
color rgb <1, 1, 0>
}
}
}
」
我遵命行事,将 foo.pov 文件修改为
#version 3.7;
global_settings {
assumed_gamma 1.0
}
box {
<-0.15, -0.075, -0.05>, <0.15, 0.075, 0.05>
texture {
pigment {
color rgb <1, 1, 0>
}
}
}
然后,在终端里再次执行 povray foo.pov
,结果得到的 foo.png 的每个像素依然都是黑色的。
「盒子就在那里,只是你未曾观察。」POV Ray 看了看我的结果说,「需要一个观察者,更准确地说,是需要一个相机。povray 产生的画作,是这个相机的拍摄结果。你希望在哪个方位观看这个盒子?」
「在距离这个盒子 50 cm 远的地方,正视它。」
「那么,这个相机就是
camera {
location <0, 0, -0.5>
look_at <0, 0, 0>
}
把它放到 foo.pov 文件里试试吧!」
相机果然是有用的。确切地说,耐心果然是有用的。这次,我看到了一个暗黄色的矩形,这是相机方位所决定的。
POV Ray 提醒,「为了看到更像盒子的盒子,你需要找一个更好的位置去拍摄。譬如
camera {
location <0.5, 0.5, -0.5>
look_at <0, 0, 0>
}
把相机放在盒子的右上方,但镜头依然是对准盒子的中心。」
我的大作又一次生成了,但看上去依然不是盒子,而是一个不规则的六边形,「用如此麻烦的咒语,结果就是如此不堪嘛?」
「你知道《圣经》里的上帝为什么在创造这个世界之前干了什么?它也是需要光的。」POV Ray 看着我,像打量着史前生物,「若想看清这个世界,需要光源。」
好吧,我算是理解了什么是天地玄黄,宇宙洪荒,「那么,根据我浅薄的摄影知识,光源应该在相机的后上方,白色的光。」
「只需在 foo.pov 文件里增加
light_source {
<1, 1, -1.5>
color rgb <1, 1, 1>
}
即可。」
的确如 POV Ray 所言,有了光,原本只是盒子轮廓的图形,瞬间便棱角分明了起来。内心不禁有些小高兴,无论如何,这是今年我的第一幅像样的画作。
不过,我很快就发现了盒子的一个瑕疵。在放大镜下,盒子的边线并非直线,而是锯齿状的折线。
POV Ray 也拿着放大镜看了看,不以为然地说,「让 povray 用手指涂抹一下盒子的边线就是。在执行 povray
命令时,打开它的 A
选项,
$ povray +A foo.pov
结果就会好看一些。」
我把绘制这个黄色盒子的所有代码都回顾了一遍,
#version 3.7;
global_settings {
assumed_gamma 1.0
}
box {
<-0.15, -0.075, -0.05>, <0.15, 0.075, 0.05>
texture {
pigment {
color rgb <1, 1, 0>
}
}
}
camera {
location <0.5, 0.5, -0.5>
look_at <0, 0, 0>
}
light_source {
<1, 1, -1.5>
color rgb <1, 1, 1>
}
好像没有之前想像得那样难。