奇妙的几何世界里,有一个有趣又充满挑战的问题:怎样才能把三维空间里的曲面,完美地摊平到二维平面上呢?这个看似不起眼的小问题,实则蕴含着几何与拓扑学奥秘。
01
剥一个橘子,再把果皮压平
首先,请大家留意一下手边,是不是恰好有一个圆润饱满的橘子。
如果没有(那就去找一个橘子……哈哈哈开个玩笑活跃下气氛),就在脑海中想象有这样一个橘子。我们在橘子的表面画上一些喜欢的符号,比如⭐,比如,也比如卡皮巴拉……
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
(对不起,扯远了)
言归正传。完成符号绘制后,我们试着尽可能完整地剥开橘子皮,将其平摊放在桌面上。原本处于立体橘子表面的那些符号,随着橘子皮的摊平,也一同被展现在了桌面这个二维平面上。因为橘子皮是不可延展的,所以得到的橘子皮必定是“撕裂”的。
如果把橘子绘制成地球仪,剥皮、摊平后,就会得到一张“撕裂”版的世界地图。摊平橘子皮的过程跟制作地图的过程类似,由于地球和地球仪都是三维的球体,强行摊平必定会导致“撕裂”。那么,有没有什么办法能够把橘子皮完美摊平呢?
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
图片来源于网络
02
给地球“拉个皮”
摊平橘子皮的问题,实际上是三维到二维转换的问题。如果橘子皮富有弹性,那么只要轻轻一拉,就能够实现完美的“摊平”,绘制一张完美的地图也会变得轻而易举(很显然这是不可能的)。
为了解决这个问题,智慧的科学家们想到从数学的角度出发,寻找一种三维曲面中的点与二维平面上的点的一一对应关系,换个角度“摊平”橘子皮、绘制“完美”地图。这种三维到二维的转换关系,被称为展平映射。
假设地球的内部有一束光,它的外面包围着一个圆柱面。随着光的照射,光线将地球表面的每一个点精准地投射到圆柱面上。那么当圆柱面展开后,那些原本在球面上的点,在展开面上都会有一个对应的全新位置。
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
图片来源于网络
换句话说,这个过程类似于“拨开橘子皮”、“把橘子皮摊平”的过程。就像给地球做了一场“拉皮手术”,把三维的地球延展到二维矩形面上来。
墨卡托投影法图解。图片来源:cdn.hujiulong.com/geohey/blog/mercator/play.html
这种绘制世界地图的方法被称为“墨卡托投影法”,是地图投影的一种。地图投影泛指将地球表面展平以便绘制地图方法,其核心就是将球面上的点转换为平面上的点。由于投影方式的不同,所形成的世界地图“长相”也大相径庭。
圆锥投影
方位投影
伪圆柱投影
折衷投影
不同地球投影法下得到的世界地图
虽然投影的方式各不相同,但有一点是统一的:将球体投影到平面上,球面必然会有一定程度的变形。映射是不完美的,是有扭曲的。以墨卡托投影法为例,它牺牲了面积大小,保留了角度和形状(也称为共形映射)。这就导致了在这种投影下得到的地图,在赤道一圈不会发生扭曲,而越靠近极点的地方面积扭曲就越大。
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
通过墨卡托投影法得到的世界地图,越远离赤道形变越大。图片来源:Tomas A, Eric H and Naty H. Real-Time Rendering. A K Peters/CRC Press
举个例子,从地图上看格陵兰岛的面积跟非洲差不多,但实际上,非洲的面积是格陵兰岛的14倍。
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
图片来源于网络
03
不规则曲面的“拉皮”
在医学领域,也有着类似的应用。比如通过CT扫描获取腹部的断层图像,然后运用多视角几何的方法,精心重建出三维的直肠曲面。为了让医生能够更清晰地观察,做出准确的诊断,还需要将这个直肠曲面平展到平面上。
图片来源:计算共形几何(理论篇);作者:顾险峰、丘成桐;出版社:高等教育出版社
但如果CT扫描后的直肠曲面展平后,观察到的病灶变形严重的话(就像上面提到非洲和格陵兰岛那样),例如肿瘤块在映射过程中被放大或缩小,这样的检查图像是无法帮助医生做出准确判断的。因此,尽可能地减小扭曲程度是三维曲面展开的重要目标。映射后的平面图,需要尽可能的保留三维曲面所蕴含的细节信息,避免造成失真。
为了解决这一问题,这里需要引入一个计算机科学里的概念。大家是否见过凿冰球的场景?晶莹剔透的冰块在调酒师的手中不停被敲掉棱角,最终得到一颗光滑的冰球。
图片来源于网络
这里我们强制设定,每一次敲击形成的切面都是三角形的。那么在整个过程中,冰球就可以看成是无数个三角形组成的多面体。只要敲击的次数足够多,所形成的切面三角形足够多,这个多面体就可以近似为一个球体。
同样的,我们试着像凿冰球一样,把复杂曲面的表面分割成许多的三角形。只要这些三角形切得足够小、无限的小,以至于每个三角形的弯曲程度小到可以忽略不计,就可以将每一个三角形看成平面。这样由三角形组成的网格在计算机中被称为三角网格(Mesh)。为了方便解答,这里对“大卫头”进行了简化:
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
左图为三角网格下的“大卫头”;右图为简化版“大卫头”的侧面和底面
要使映射的效果比较好,需满足以下约束条件:
01
映射之后内部三角形的边不能相交;
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
图片来源:Games301
02
映射后三角形的定向不能翻转,否则会有错乱的情况;
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
图片来源:Games301
03
映射后的边界不能相交。
图片来源:Games301
04
分块展平,逐个击破
在三角网格的设定下,我们希望对三角网格进行形变最小化、且能够保留三维细节信息的平面展开。
想象一下,我们给“大卫头”三角网格模型上贴一大块可以任意伸缩、受力均匀的橡胶皮。在对这块橡胶皮进行拉伸时,每一个网格之间都会对力进行传导,且对于这块橡胶皮内部的任意一点,作用在它身上的力是均衡的。
独立来看任意一块三角形区域,当我们固定它的三边,从外部向这块橡胶皮的三条边施力时,它内部的点就会移动到使其受力均匀的位置。
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
将“大卫头”按照特定的形状范围(圆形)进行二维展开
我们再进一步假设,将整个“大卫头”橡胶皮的所有外边界固定到一个圆周上(也可以固定成方形、矩形、平行四边形……,as you wish)。随着橡胶皮的拉伸,其内部的顶点V将会“乖乖”移至与它相邻的那些定点所构成区域的中心区域,这个位置就叫做质心,如下图所示。
五个三角形网格均匀受力后,其内部顶点v∈Vint会移动至质心
通过每块三角形橡胶皮之间作用力的相互传导,这块三维的不规则橡胶皮可以被“均匀”地拉伸成了二维平面。在这场“拉皮手术”中被摊平的橡胶皮,就是对“大卫头”这一不规则模型的曲面展开。在计算机领域,三角网格展平的算法被称为“网格参数化算法”(Mesh Parameterization)。
使用C++ Eigen库对稀疏线性方程组进行求解得到的展平结果
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
网格参数化算法的推导过程
这里我们在上述展平结果的表面贴上一层规则的棋盘格,再复原到“大卫头”上,直观地感受下三角形们不同的扭曲。同时,这也是网格参数化算法的一个实际应用案例——纹理贴图。
均匀的网格在不规则曲面上形成不同程度的扭曲
纹理贴图是一种计算机图形学技术,设计师可以在二维空间进行模拟物体的表面纹理与细节信息的设计,再通过计算机手段将其投影到3D模型表面,从而赋予模型/角色更有深度的视觉体验。在游戏相关的领域中,纹理贴图经常被用来对3D场景和对象进行上色及纹理填充等。
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
立方体例子。图片来源:cnblogs.com/zhaoqingqing/p/18185486
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
3D模型纹理贴图例子。图片来源:cnblogs.com/mvrlink/p/17916091.html
从一颗橘子到给地球“拉个皮”,从三角网格到网格参数化算法,这只是三维到二维在计算机领域的一种解决方案。而在实际科研工作中,科学家们对三维到二维的研究还在如火如荼进行中,值得我们想象和探索的空间还有很多很多。
来源:松山湖材料实验室
编辑:千里雁啼
转载内容仅代表作者观点
不代表中科院物理所立场
如需转载请联系原公众号
1.2.
3.
4.
5.
6.
7.
8.
9.
10.