上一篇: 框架
昨天,我没有描述 POV Ray 看了我写的能画出带框架的透明盒子的咒语的表情。
当时,他满脸嫌弃,像是在看着一个正在咳嗽却不掩口鼻的人,「你知道的越多,一致性就越是缺乏。只是有耐心,远远不够。你看,
... ... ...
box {
v1 + bar_size * <-0.5, -0.5, -0.5>, v2 + bar_size * <0.5, 0.5, 0.5>
texture { bar_texture }
}
box {
v2 + bar_size * <-0.5, -0.5, -0.5>, v3 + bar_size * <0.5, 0.5, 0.5>
texture { bar_texture }
}
box {
v4 + bar_size * <-0.5, -0.5, -0.5>, v3 + bar_size * <0.5, 0.5, 0.5>
texture { bar_texture }
}
... ... ...
bar_size
与向量的相乘以及 texture
语句不断重复,让咒语冗长,不仅容易出错,而且毫无美感。」
「我已经想到了一些补救措施。bar_size
与向量的相乘语句可以削减,
#declare delta = bar_size * <0.5, 0.5, 0.5>;
... ... ...
box {
v1 - delta, v2 + delta
texture { bar_texture }
}
box {
v2 - delta, v3 + delta
texture { bar_texture }
}
box {
v4 - delta, v3 + delta
texture { bar_texture }
}
... ... ...
」我昨晚做梦都在想着把咒语简化一下。
「聊胜于无。不过,你已经尽力了。这次,一致性的缺乏,主要在于我还没教你有物混成表达式。」
「这个我知道……有物混成,先天地生,寂呵,廖呵,独立而不改,周行而不殆,可以为天地母……你继续……」
「先来看有物。盒子本身也可以定义成变量的,譬如
#declare foo = box {-0.5 * foo_size, 0.5 * foo_size}
只是,若想让这个变量发挥作用——在场景中构造一个盒子,需要用 object
表达式:
object {
foo
texture {foo_texture}
}
不止是盒子,事实上任何几何体都可以放在 object
表达式中呈现。」
「……果然可以为天地母。」
「接下来,我们需要『混成』。有 union
、intersection
、difference
……今天我们只需要 union
,它可以把多个几何体合并为一个。以板条为例,12 根板条可以合并成框架,
#declare frame = union {
box { v1 - delta, v2 + delta }
box { v2 - delta, v3 + delta }
box { v4 - delta, v3 + delta }
// ... 剩下九根板条的代码省略了 ...
}
」
「看上去很美,只是这些板条都没有颜色。」
「因为它们的颜色都相同,所以用 object
表达式为它们着色。事实上,object
语句也可以定义成变量,
#declare frame = object {
union {
box { v1 - delta, v2 + delta }
box { v2 - delta, v3 + delta }
box { v4 - delta, v3 + delta }
// ... 剩下九根板条的代码省略了 ...
}
texture { bar_texture }
}
」
我不禁击口罩赞叹,「Perfect!」
「接下来,就看你的了。」POV Ray 说完,变成一股青烟,缓缓散去。
我没工夫思考 POV Ray 诡异的回家方式,双手在键盘上龙飞凤舞,新的不容易出错也不容易把人吓走的咒语就写好了,顺便把盒子以及框架的颜色更换了。
#version 3.7;
#include "colors.inc"
global_settings {
assumed_gamma 1.0
}
#declare foo_size = <0.3, 0.15, 0.10>;
#declare foo_texture = texture { pigment { color rgbt <0, 1, 0, 0.75> } }
#declare foo = box {
-0.5 * foo_size, 0.5 * foo_size
texture {foo_texture}
}
#declare v1 = <-0.5, 0.5, -0.5> * foo_size;
#declare v2 = v1 + ;
#declare v3 = v2 + <0, 0, foo_size.z>;
#declare v4 = v3 + <-foo_size.x, 0, 0>;
#declare v5 = v1 + <0, -foo_size.y, 0>;
#declare v6 = v2 + <0, -foo_size.y, 0>;
#declare v7 = v3 + <0, -foo_size.y, 0>;
#declare v8 = v4 + <0, -foo_size.y, 0>;
#declare bar_size = 0.01;
#declare bar_texture = texture { pigment { color Gray20 } }
#declare delta = bar_size * <0.5, 0.5, 0.5>;
#declare frame = object {
union {
box { v1 - delta, v2 + delta }
box { v2 - delta, v3 + delta }
box { v4 - delta, v3 + delta }
box { v1 - delta, v4 + delta }
box { v5 - delta, v6 + delta }
box { v6 - delta, v7 + delta }
box { v8 - delta, v7 + delta }
box { v5 - delta, v8 + delta }
box { v5 - delta, v1 + delta }
box { v6 - delta, v2 + delta }
box { v7 - delta, v3 + delta }
box { v8 - delta, v4 + delta }
}
texture { bar_texture }
}
object {
union {
object { foo }
object { frame }
}
}
#declare foo_center = <0, 0, 0>;
#declare foo_upper_right = 0.3 * <1, 1, 1> + foo_center;
camera {
location foo_upper_right
look_at foo_center
}
#declare camera_upper_right = foo_upper_right + <0.5, 0.5, -1>;
light_source {
camera_upper_right
color White
}
结果得到:
下一篇: 插曲:成千上万个盒子