DIY 多面体镜面万花筒
前几天在网上看到了一位艺术家 Anthony James 的展览作品,使用多面体和镜子生成万花筒的效果,觉得很有意思:
这个作品的大致原理是:
- 多面体的外壳是半透明的玻璃,有一定的透光率。
- 多面体的每条边的内侧安装了 LED 光源。
- 光源发出的光线在多面体内部反复反射,每次反射时由于玻璃是半透明的,一部分光线会被反射回内部,另一部分光线穿过外壳被外部观察到。镜子的透光率越低,光线在穿过外壳之前被反射的次数就越多,看到的图案就显得越“深邃”。
YouTube 上有个博主手把手地展示了怎样从头 DIY 一个这样的模型:视频地址。我表示这顿操作虽然看着不算难,但对我这种懒人来说还是有点过于折腾了。
不过没关系,咱可以编程实现呀。我写了一个 shadertoy 演示:
这个动画支持除了 snub 和 antiprism 之外各种类型的均匀凸多面体及其对偶。下面的动画演示的是菱形十二面体 (rhombic dodecahedron),它有个独特之处是自身在镜子反射下成的像可以密铺整个空间 (space filling)。
石榴籽的形状就近似于菱形十二面体,这使得它们可以紧紧的挨在一起构成密铺的结构:
这种可以密铺整个空间的多面体非常少,正方体当然是其中之一,但是其它的正多面体 (正四面体、正八面体、正十二面体、正二十面体) 都不行。
值得注意的是,身处多面体内部和外部的观察者,看到的景象可能是不同的。
例如上面的菱形十二面体从内部看起来,有些胞腔从中间被劈开了:
甚至即便只从外部观察,从不同类型的镜面看到的景象也是不同的。例如截顶的正方体,从八边形的镜面看进去,内部是密铺了整个空间的:
但是如果从三角形的面往里看,会发现镜子中的四面体由近到远方向是交错改变的:
请你思考一下,这些背后的原因是什么?