前言
povray 是用来画画的,它的全称是 Persistence of Vision Raytracer。
我不会画画。我的一个朋友遭遇短期囹圄之灾后,一直闭门在家画画……不过,没遭此灾时,他也是一直闭门在家画画。他最近在学 3D MAX。我说,可以学 povray 阿,他说这玩意能画 18X 吗……
不能!povray 虽然也能画,但是它能画的东西,是 CSG 形体,也就是可以用球、方块、锥体、圆柱、圆环等基本形体堆砌而成的形体。理论上,任何三维形体可以用一堆小方块堆砌而成,这些小方块叫做体素。简而言之,povray 适合画 Minecraft。
povray 虽然不擅长绘画,但是它擅长摆弄光线。没有了光,我们只能画一群乌鸦在夜里飞。povray 提供了一种三维场景描述语言。利用这种语言,可以描述相机是如何摆放的,物体的位置以及它们的表面是什么颜色的,光源在哪个方位以及它发出什么颜色的光。povray 可以根据这些描述,绘制一幅「照片」级别的画。
可通过以下命令在 Gentoo 中安装 povray:
$ sudo emerge -avt povray
下面,通过这种三维场景语言,描述一个只存在一个球体的三维场景,初步了解一下 povray 的能耐。
下文中的 povray 三维场景代码,是以 orez 源文件中的代码片段的形式给出的。可从「orez 的故事」了解 orez 的用法。
准备
可能是从 3.7 版本(我写此文时最新的 povray 版本)开始,povray 的三维场景文件的首部必须放置版本声明语句:
@ 版本声明 #
#version 3.7;
@
相机
下面的代码定义了一个相机,它位于 (0, 2, -3)
,所拍摄的画面的中心位于 (0, 1, 2)
:
@ 设定相机 #
camera {
location <0, 2, -3>
look_at <0, 1, 2>
}
@
若要在大脑中构建出这个相机的方位,需要了解 povray 的坐标系。povray 的坐标系是左手系。以计算机屏幕为参考平面,X 轴表示水平方向,自左向右;Y 轴表示竖直方向,自下向上;Z 轴表示垂直于屏幕的方向,自外向内。坐标原点位于屏幕中心。
物体
在相机拍摄的画面的中心位置 (0, 1, 2)
放置一个半径为 2 的黄色球体:
@ 球体 #
sphere {
<0, 1, 2>, 2
texture {
pigment { color Yellow }
}
}
@
按照 povray 三维场景语法,Yellow
实质上是:
rgb <1, 1, 0>
由于它是常见的颜色,povray 在 colors.inc 文件中对它进行了定义:
#declare Yello = rgb <1, 1, 0>;
colors.inc 文件的位置依赖于操作系统以及你的安装方式而定。在我的机器上,它位于 /usr/share/povray/include
。若在场景文件中使用 colors.inc 中定义的颜色,需要使用 #include
指令加载它:
@ 预定义的场景文件 #
#include "colors.inc"
@
光源
在 (2, 4, -2)
处放置一个白色光源:
@ 设定光源 #
light_source {
<2, 4, -2>
color White
}
@
渲染
将上述语句块组合起来便可得到一份完整的 povray 三维场景文件:
@ 只存在一个球体的场景 #
# 版本声明 @
# 预定义的场景文件 @
# 设定相机 @
# 设定光源 @
# 球体 @
@
现在,可将这份描述了相机、物体以及光源等信息的三维场景文件交由 povray 解析、渲染、输出。
可以使用 orez 工具,从本文档中提取全部的三维场景代码:
$ orez povray-0.md -t -e "只存在一个球体的场景" -o sphere.pov
其中 povray-0.md 是本文档的文件名,sphere.pov 是存放三维场景代码的文件。
照顾一下不懂 orez 的人,下面给出 sphere.pov 文件的全部内容:
#version 3.7;
#include "colors.inc"
camera {
location <0, 2, -3>
look_at <0, 1, 2>
}
sphere {
<0, 1, 2>, 2
texture {
pigment { color Yellow }
}
}
light_source {
<2, 4, -2>
color White
}
使用以下命令,可将场景文件 sphere.pov 交由 povray 解析,以获得渲染结果 sphere.png :
$ povray sphere.pov
在 X11 环境(大部分 Linux 桌面的基本图形环境)中,povray 会在自身运行过程中,将渲染结果逐渐的在一个 X11 窗口中显示出来,待其运行过程结束后,这个 X11 窗口会自动关闭,最终的渲染结果默认保存于 PNG 格式的图片文件。
对于上述示例而言,会出现类似于下图所示的 X11 窗口:
渲染结果会被保存为 sphere.png 文件。