三维欧式空间中的万花筒结构

这是一个 Shadertoy 小动画,最初作于 2020 年末,经历反复修改以后成型于 2021 年年中。我先凡尔赛一下作品的部分截图:

动画在下面:

使用方法

  1. 用鼠标调整视角。
  2. 点击窗口左上角标题前往 Shadertoy 网站查看代码。
  3. 在代码开头修改 LATTICE 的值选择不同的蜂巢结构,可选的值为 0, 1, 2。
  4. 在代码开头 #define 部分开启 DUAL 查看对偶蜂巢结构。
  5. 在代码开头修改 T 的值获得不同的截断类型。T 的值必须都是正数且不全为 0。

我不打算在这里详细介绍动画背后的数学,暂时给一个简单的介绍。

相信大家都玩过万花筒,将三面镜子围成一个棱柱,一端用透明塑料片或者毛玻璃封住,然后在三面镜子中间放入一些彩色的纸片,另一端也封住并开一个小孔以供观察,就会发现这些纸片在镜子中反复成像,且虚像互不重叠并填满整个二维空间。如下图所示:

这个图虽然简单,但是对理解万花筒的结构很关键:二维的万花筒图案其实是在三维空间中生成的。即在 \(\mathbb{R}^3\) 中取三个过原点的超平面,它们是反射镜面。三个镜面围成的基本区域 \(D\) 是一个凸锥,凸锥 \(D\) 及其在镜子中所成的所有虚像填满了上半空间。如果我们在 \(D\) 与超平面 \(z=1\) 的截面中任选一个初始点 \(v_0\)\(v_0\) 即为万花筒中的小纸片,则 \(v_0\) 的所有虚像均位于超平面 \(z=1\) 上,它们构成了密铺的所有顶点,观察截面上的图案看到的就是万花筒结构。当 \(v_0\) 的位置变动时,得到的万花筒图案也随之变化。

这里需要注意的是镜子两两之间的夹角只能是 \((\frac{\pi}{3}, \frac{\pi}{3}, \frac{\pi}{3}),(\frac{\pi}{6}, \frac{\pi}{3}, \frac{\pi}{2}),(\frac{\pi}{4}, \frac{\pi}{4}, \frac{\pi}{2})\) 三种之一,并不能是任意的。这时关于三个镜子的反射 \(\{\rho_1,\rho_2,\rho_3\}\) 生成的对称群分别是仿射 Coxeter 群 \(\widetilde{A}_2,\widetilde{B}_2,\widetilde{C}_2\)

高维万花筒的情形是类似的,我们在 \(\mathbb{R}^4=\{(x,y,z,w)\}\) 中取四面过原点的反射镜面,这四面镜子的夹角同样是精心选择的,其摆放方式对应的分别是 rank 为 4 的仿射 Coxeter 群 \(\widetilde{A}_3,\widetilde{B}_3,\widetilde{C}_3\),这时四面镜子围成的基本胞腔在反复的反射下填满上半空间 \(w > 0\)。用超平面 \(w=1\) 作截面,得到的就是低一维的万花筒图案,即三维蜂巢!并且这样的蜂巢满足如下性质:反射变换 \(\{\rho_1,\rho_2,\rho_3,\rho_4\}\) 生成的对称群作用在蜂巢的顶点上是传递的,这样的蜂巢叫做均匀蜂巢

对每个均匀蜂巢,我们可以把它的相邻胞腔 (两个胞腔称作是相邻的当且仅当它们有某个公共的面) 的中心连起来,得到其对偶蜂巢,从而可以渲染的蜂巢个数 x 2。对偶蜂巢一般不再是均匀蜂巢。

 | 

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器