python ray定时_当 Python 邂逅 POV-Ray

引言

POV-Ray 是一种专业的三维场景描述语言,它描述的三维场景可交由 POV-Ray 的解析器(或编译器)采用光线跟踪技术进行渲染,渲染结果为位图。

POV-Ray 语言是图灵完备的,亦即其他编程语言能写出来的程序,使用 POV-Ray 语言总能等价地写出来。不过,这个世界上不会有人打算使用 POV-Ray 语言来编写网络服务程序、GUI 程序以及那些运行在手机上的 APP,更何况也写不出来。两个程序等价,是数学意义上的,而不是物理意义上的。许多时候,我们是在编写一些非图形渲染类的程序时,需要绘制一些三维图形,这时就可以考虑如何用自己最熟悉的编程语言去驱动 POV-Ray 这支画笔,即为 POV-Ray 编写代码生成器。

本文介绍了使用 Python 3 为 POV-Ray 编写代码生成器的基本思路。所实现的代码生成器重视 POV-Ray 的建模功能,而忽视其光线追踪渲染功能。凡涉及渲染之处,仅仅使用 POV-Ray 的一些非常简单的渲染语句,这种处理颇类似于绘画艺术中的白描。因为我之所以有动力写这份文档,是因为我要使用 POV-Ray 来绘制我的一些论文与演示文档里的插图。这些插图以表意为主,基本不需要考虑如何让观阅它们的人信以为真。之所以选择 Python 语言来驱动 POV-Ray,是因为它便于我在写文档的过程中可以忽略许多数据结构与内存管理上的细节。实际上,在写这份文档之前,我一直在用 C 语言生成 POV-Ray 代码。

我不会对 POV-Ray 与 Python 语言本身作太多介绍,因为我对它们也仅仅是略知一二。我在附录中给出了我曾经粗略翻过的 POV-Ray 与 Python 的一些文档的链接。

模型、视图与控制器

在计算机中绘制图形,无论是二维还是三维,无论是古代还是现代,一直存在着一个基本范式,即:模型-视图-控制器。在使用 Python 驱动 POV-Ray 的过程中,这个范式依然有效。

直接使用 POV-Ray 语言,可以像下面这样描述这个范式:

@ model.inc # [POV-Ray]

... 定义一些模型 ...

@

@ view.inc # [POV-Ray]

... 设置光源与相机 ...

#include "model.inc" // 加载模型

... 绘制模型 ...

@

@ controller.ini # [POV-Ray]

... 设置动画参数 ...

@

注:上述诸如 @ model.inc # [POV-Ray] 之类的语句,可理解为注释。位于符号 @ 与 # 之间的文本是文件名,位于 # 符号之后的 [...] 中的文本表示其后面的代码段所用的语言。每个代码段的尾部都有一个 @ 符号,表示代码段至此终止。这种注解形式来自我写的一个文式编程工具所支持的标记,详见 https://github.com/liyanrui/orez。

POV-Ray 语言并没有刻意强调模型-视图-控制器范式,但其语法能够很自然地描述这种范式。模型注重的是几何形体,视图注重的是如何观察几何形体,而控制器用于控制视角的变化。POV-Ray 虽然只能给出位图形式的渲染结果,但由于它提供了定时器功能,利用这一功能可生成一组视角有序变化的渲染结果,然后将它们组合为 GIF 格式的动图,我将这种方式称为 POV-Ray 视图的控制器。

其实,这种范式无处不在。与其说是哪个人发明了它,不如说这是人类处理复杂任务时的本能反应。简单举个餐饮业的例子,农民为餐饮业提供了模型,厨师为餐饮业创造了视图,食客为餐饮业创造了控制器。用经济学的术语来说,就是「生产的社会化」,强调的是有规模的分工与合作。

模型

下面从最简单的任务开始,以点与点集的绘制为例,讲述如何用 Python 实现 POV-Ray 模型。

POV-Ray 语言没有提供点对象的绘制语法,但是可以使用直径很小的球体来表示点对象:

sphere {

, r

}

为球心,r 为半径。

基于这一发现,就可以构造点集模型:

#declare points = union {

sphere {, r}

sphere {, r}

... ... ...

}

#declare 是 POV-Ray 提供的用于定义局部变量的指令。points 是变量的名字。union 是 POV-Ray 的三维实体模型的布尔运算符,它可将一组三维实体合并为一个对象。上述代码中,所有小球的半径相同。

现在开始考虑,如何使用 Python 语言自动生成上述的点集模型的 POV-Ray 描述。假设有一份名为 points.asc 的文本文件,其中的每一行文本存储一个三维点的坐标值,例如:

2.3 4.5 1.1

3.0 8.7 11.3

... ... ...

若使用 Python 语言写一个程序,让它来解析 points.asc 文件,然后再基于解析到的点集数据生成 POV-Ray 模型文件,这样就可以避免手动去写一大堆 sphere 语句。更重要的是,多数情况下,像 points.asc 这样的文件是现有的,例如一些程序输出的数据与三维扫描设备从实物表面上采集到的数据等等。

下面是一份从 points.asc 这样的文件解析三维点集数据的 Python 代码:

@ points-to-pov.py # [Python]

def points_parser(src_file_name, right_handed = True, dim = 3):

points = []

with open(src_file_name, 'r') as src:

for line in src:

coords = line.split()

if len(coords) != dim:

continue

x = []

for t in coor

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值