您現在的位置是:首頁 > 武術
真·降維打擊!《三體》中二向箔吞噬地球的場景成真了!
- 由 柚子在野區 發表于 武術
- 2021-06-10
二向箔是什麼
要說在《三體》這本著名的科幻小說中挑選幾個令人印象深刻、血脈膨脹的科幻元素和場景,那
水滴攻擊
和
二向箔降維打擊
肯定能上榜。
今天我們就來講一講
降維打擊——如何實現對地球“從三維向二維跌落”。
在《三體》中,
太陽系被一小片二向箔攻擊由三維降至二維
的場景描述實在是太吸引人了有沒有:
“這是第一個跌入二維的固態行星,與海王星和土星想象比,二維地球的“年輕”更加清晰精緻……”,聽起來如此有詩意的描述,激發了不少讀者的無限想象,一位重度科幻迷的B站Up主
Ele實驗室
便是其中一個,起初他想象的三體降維是這樣的:
啪的一聲!三維變成二維……
啊這……有點兒草率了。
那下面這樣呢?
這種剝橘子的方法顯然也不太行。
其實,以上這兩種想法最大的問題就是隻考慮了地球的表面。就像我們在玩遊戲穿模時看到的那樣,目前主流的三維建模技術採用的都是三角面,組成物體的表面,而至於物體的內部則只是空的而已。
但地球其實是一個實心的球體,從內到外依次是地核、地漫、地殼和地表。
這就有點複雜了。
那麼該如何實現對三維物體降維攻擊呢?
幾天前,這位B站UP主在用threejs框架編寫程式時,無意間發現了一個Demo,
它大概這個樣子:
和大多數人一樣,Up主起初也以為這個密集恐懼者看了流淚、貪吃蛇愛好者見了狂喜的線條,只是一個簡單的數學分析。
但研究之後,他發現這其實是大名鼎鼎的
希爾伯特曲線
。
正是藉助這條曲線,Up主成功實現了對三體的降維打擊。
希爾伯特曲線
我們先來了解一下什麼是“希爾伯特曲線”?
早在19世紀時數學界就掀起了一陣用一維直線填滿二維平面的熱潮,換句話說就是找到一維和二維的一個對映,起初是義大利數學家皮亞諾,沒錯,就是時不時出現在高等數學教材裡的老夥計:
他提出了一種能夠填滿平面的曲線皮亞諾曲線,緊接著是德國數學家希爾伯特提出了另外一種希爾伯特曲線,這也就是本文要介紹的Up主用來完成降維打擊的工具。
希爾伯特曲線是這樣的:這是一個平面正方形,先把它畫為4等份,可以使用這樣一條曲線遍歷所有的四個小塊,這就是一階的希爾伯特曲線。
之後每個小塊可以再劃分為4等份。如果還想得到一個能夠遍歷出所有小塊的曲線,可先把4個小區域內各自畫出一階希爾伯特曲線。
然後把下面兩個分別旋轉90度和-90度再把它們連起來,這就是二階的希爾伯特曲線。
同樣的道理我們可以得到三階、四階、五階希爾伯特曲線等等。
而當階數趨近於無窮的時候,我們就可以認為曲線“填滿了”整個平面:
只有當這時候才是真正意義上的希爾伯特曲線,而之前階數達不到不無窮的情況,姑且可以稱作
“偽希爾伯特曲線”
。
透過遍歷這個曲線我們就可以得到平面上所有的點,雖然希爾波特的曲線取無窮大的時候,在數學上還有很多爭議,但是對於離散系統的計算機來說,這已經很Nice了。
那麼,希爾伯特曲線如何實現降維?
舉個栗子:
這是一張64×64畫素的圖片,每個畫素剛好是一個小方塊。
我們可以用偽希爾伯特曲線穿過這些畫素塊,然後從線的出口處像糖葫蘆一樣向外拉扯這些畫素,這樣一來二維圖片就變成了一維的:
當然由於我們無法做到無窮,這只是一種近似。
不過,這種降維方式的好處是希爾伯特的曲線在遍歷的時候能夠保證二維平面區域性相鄰的點在被扯成一維的時候畫素點還是相鄰的,從而降維後的圖案就有自然過渡的效果。
三維降維打擊
按照上面的原理,我們就可以開始著手對三維世界的物體進行二維打擊了。
此時就要讓希爾伯特的曲線的三維結構登場了,它長下面這個樣子:
同理,如果用一個足夠極限的三維希爾伯特的曲線去貫穿一個三維物體,就可以足夠近似的遍歷出三維物體的每個點:
但是就像上文所說的一樣,目前主流的三維建模方式都是透過三角面去組成一個物體的空殼,即物體的內部是空的,那麼這個問題該如何解決呢?
在這裡Up主提出,其實除了空殼子,對應二維圖片中畫素的概念,也可以採用一個叫做
“體素”
的方案來建模三維物體。
體素的概念很簡單,就是類似遊戲《我的世界》中一個個不同顏色的基本立方塊,透過不同的堆疊方式產生不同的物體,這些小立方塊越小,物體的細節也就越好。
當立方塊大小無限趨近於零的時候,也就達到了真實世界物體應有的樣子了:
考慮到這種建模方式比較消耗計算資源,Up主在這裡只採用了五階的三維希爾伯特曲線,併產生了
262,144
個體素點。
另外Up主參考地球的內部構造用程式快速生成了地球的地核、地幔和地殼。
但要生成擁有大陸和海洋的複雜地表就要稍微麻煩了。
首先要讀取一張地球貼圖的各點畫素,然後用球形貼圖演算法取樣這些畫素點對映到球面,再用體素方塊堆疊成這些點。
最後我們就能得到一個由體素塊構成的、同時具有外部和內部細節的三維地球。