今天我们就来讲一讲降维打击——如何实现对地球 " 从三维向二维跌落 "。
在《三体》中,太阳系被一小片二向箔攻击由三维降至二维的场景描述实在是太吸引人了有没有:
啪的一声!三维变成二维 ……
那下面这样呢?
其实,以上这两种想法最大的问题就是只考虑了地球的表面。就像我们在玩游戏穿模时看到的那样,目前主流的三维建模技术采用的都是三角面,组成物体的表面,而至于物体的内部则只是空的而已。
那么该如何实现对三维物体降维攻击呢?
几天前,这位 B 站 UP 主在用 threejs 框架编写程序时,无意间发现了一个 Demo,
但研究之后,他发现这其实是大名鼎鼎的希尔伯特曲线。
正是借助这条曲线,Up 主成功实现了对三体的降维打击。
希尔伯特曲线
我们先来了解一下什么是 " 希尔伯特曲线 "?
早在 19 世纪时数学界就掀起了一阵用一维直线填满二维平面的热潮,换句话说就是找到一维和二维的一个映射,起初是意大利数学家皮亚诺,没错,就是时不时出现在高等数学教材里的老伙计:
希尔伯特曲线是这样的:这是一个平面正方形,先把它画为 4 等份,可以使用这样一条曲线遍历所有的四个小块,这就是一阶的希尔伯特曲线。
通过遍历这个曲线我们就可以得到平面上所有的点,虽然希尔波特的曲线取无穷大的时候,在数学上还有很多争议,但是对于离散系统的计算机来说,这已经很 Nice 了。
那么,希尔伯特曲线如何实现降维?
举个栗子:
这是一张 64×64 像素的图片,每个像素刚好是一个小方块。
不过,这种降维方式的好处是希尔伯特的曲线在遍历的时候能够保证二维平面局部相邻的点在被扯成一维的时候像素点还是相邻的,从而降维后的图案就有自然过渡的效果。
三维降维打击
按照上面的原理,我们就可以开始着手对三维世界的物体进行二维打击了。
此时就要让希尔伯特的曲线的三维结构登场了,它长下面这个样子:
在这里 Up 主提出,其实除了空壳子,对应二维图片中像素的概念,也可以采用一个叫做" 体素 "的方案来建模三维物体。
体素的概念很简单,就是类似游戏《我的世界》中一个个不同颜色的基本立方块,通过不同的堆叠方式产生不同的物体,这些小立方块越小,物体的细节也就越好。
另外 Up 主参考地球的内部构造用程序快速生成了地球的地核、地幔和地壳。
但要生成拥有大陆和海洋的复杂地表就要稍微麻烦了。
首先要读取一张地球贴图的各点像素,然后用球形贴图算法采样这些像素点映射到球面,再用体素方块堆叠成这些点。
我们先来构建出一个长度和三维希尔伯特曲线一样长的二维希尔伯特曲线。
最后 Up 主重新编排了一下把地球降维的过程,看上去更加接近 " 从三维向二维的跌落 "。
下面就来享受三维打击的视觉盛宴吧!
网友讨论
目前这则视频在 B 站收获了 200 多万点击量,超 20 万点赞,不少网友直呼,好家伙,过于硬核了。
还有评论称,这才是 B 站知识 Up 主该有的样子。
" 歌者:我需要一张二向箔。长老:好的,你要皮亚诺式还是希尔伯特式?
可以的,就像印度拿 1G+2G+3G 叠出了 6G 一样,远超中国
up 的这种变换是一种几何变换,没有考虑到物理因素,数学上这种变换很多。如果考虑物理因素,降维打击应该会像是物体跌落到一个平直黑洞的过程,光子本身的结构是三维的,所以,我们不能看见最终产生的 2 维平面。因此,我们看到的图像实际上是跌落 2 维前的 3 维状态逃逸出的光子。理论上,相当于是液压机的效果是比较合理的,取决于二向箔的吸收效率和物体的跌落速率。
想看视觉效果更棒的原视频,可以去 B 站关注一波 Up 主 "Ele 实验室 "。
最后,用网友的一句话来给整个事情的真相做个结尾:
" 我 " 作为一个三维空间的生物 , 在二维的屏幕上看 UP 编写的二维模拟三维的图像进行二维降维
代码地址:https://github.com/KikiLetGo/DimReduce
视频链接:https://www.bilibili.com/video/BV1Sf4y147J9?spm_id_from=333.851.b_7265636f6d6d656e64.1
本文作者 | 贝爽、陈大鑫
视频作者 | B 站 @Ele 实验室本文经视频作者授权整理成图文版
原文地址:点击此处查看原文