有物混成

garfileo
上一篇:框架

昨天,我没有描述 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 表达式中呈现。」

「……果然可以为天地母。」

「接下来,我们需要『混成』。有 unionintersectiondifference……今天我们只需要 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 + <foo_size.x, 0, 0>;
#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
}

结果得到:

下一篇:插曲:成千上万个盒子
阅读 451

5.7k 声望
1.8k 粉丝
0 条评论
你知道吗?

5.7k 声望
1.8k 粉丝
文章目录
宣传栏