當前位置: 華文星空 > 知識

假如一個真空球,球內壁是全鏡面。這時懸浮在球心的人看到的是什麽景象?

2012-07-15知識

警告:內含大量詭異圖片,膽小人士與使用流量上網的人士請謹慎檢視。

再次更新,更正在球心時看到影像的錯誤,在回答後方回應了章佳傑先生的質疑。

更新:回答一下質疑

在這個答案下面,和知乎微博的評論、轉發裏面,有人質疑說球裏面根本沒有光源,所以看上去應該是漆黑一片。其實在原文裏,已經寫了:

對於人物,給她設定為「自發光」材質,即可表現出類似「全身塗足夠亮的熒光粉」效果,「熒光粉」的顏色就是材質的顏色。場景裏不擺放除人物外其他任何光源。由於人物是自發光材質,所以人物是不接受自己本身的投影的。並且,假設光線在球壁之間反射和透過球內空間時沒有衰減。

給人物設定自發光材質,目的就是為了讓裏面的人能看到自己的影像。因此,實際上,場景裏面還是有光源的,光源就是人物本身。

另一個比較多的質疑點是,由於模擬場景是由多邊形面片組成的(包括球體和人物),那麽能不能真實地反映在實際世界中的情況?實際上,在電腦中是不可能完全模擬、仿真真實世界的情況。原因就是在於,真實世界,從人類日常生活的尺度看,是連續的。而電腦模擬的世界只能是離散數學模型的方式存在。因此,使用電腦模擬一定有其局限性。

在這個實驗裏,電腦模擬的局限性包括光路的反射次數是有限的、鏡面並不是一個完美的平滑曲面、人物也是有三角面片所組成的,並且渲染器是基於光路追蹤技術,只能表現出光的粒子性,不能模擬光的波動性、眼睛(攝影機)也不可能完全不吸收任何光線、光路追蹤取樣率也不可能無限大,等等。因此,這個實驗實際上是以 不可能完全真實的方式模擬一個不可能的場景 ,因此,別把這個當科研論文來對待,看看就好。

既然電腦不可能完全模擬實際世界,那麽電腦模擬的意義在哪裏?模擬的意義是在於解決問題。因此,模擬的精度細化到能夠解決問題就可以了,再精確地模擬只是消耗時間、能源、計算量等。如本實驗中,雖然模擬的結果很粗糙,但能看出大概的樣子,比如重復的畫面很可能在無限細化後變成顏色條帶,等等。這就足夠了。正如鱷魚洗澡中模擬水的流動,不需要細化到模擬單個水分子,還要模擬水分子的布朗運動。只需模擬一個個大團的水就夠了。模擬遊戲中的物理現象,時間也不可能細分到普朗克時間。模擬機翼的空氣動力學效果,也不需要模擬出單個空氣分子。因此,模擬的精細度取決於待解決的問題,如同樣是流體模擬,鱷魚洗澡的復雜度就不需要達到模擬機翼的空氣動力學那樣的水平。

------ 原答案:------

很有趣的一個問題。對此,我也很好奇結果到底是什麽。很遺憾,當前本問題下大多數答案都不太令人滿意。當前排名第一的給的是一個平面在球面裏的模擬效果,跟三維物體在球面裏的效果差別還是很大的。

所以,昨天和今天在自己的電腦上,用 3D 軟體模擬了一下,得到了一些有趣的結果。雖然,由於電腦的局限性,模擬出的結果肯定會跟真實看到的有一些差別。但我認為這些結果,在一定程度上已經可以說明了問題。

在此,我認為題主的描述已經足夠清楚了。我們在這裏不考慮細節問題,如在真空中,人會不會死啊什麽的,只考慮最後我們能夠看到什麽。於是,在 3D 軟體裏,設定了這樣的場景:放一個直徑 5 米的球體,球體的球心在原點,在裏面放一個人物的模型。人物的眼睛附近放一個攝影機,模擬眼睛,來檢視場景。給人物設定一個動畫,讓人物從距離球心 1.5 米的地方,穿過球心,移動至球心對面距離球心 1.5 米的地方。在人物移動的過程中,眼睛(攝影機)正好穿過球心。


哦對了,人物的模型是從

Characters 3D Models

找的現成的一個模型。然後,球體與人物的比例關系大概是這樣的:

場景基本上搭好了,接下來是設材質。對於球體,很好說,設定為完全的鏡面材質就可以了,再把球面的法線翻轉一下,使之指向球面內部。對於人物,給她設定為「自發光」材質,即可表現出類似「全身塗足夠亮的熒光粉」效果,「熒光粉」的顏色就是材質的顏色。場景裏不擺放除人物外其他任何光源。由於人物是自發光材質,所以人物是不接受自己本身的投影的。並且,假設光線在球壁之間反射一次時有 15% 的衰減。

接下來,在渲染之前,需要設定一下渲染器的選項。這裏使用的渲染器是基於光路追蹤技術的。基本的原理是,根據光學中,光路是可逆的這一特征,從相機(眼睛) 逆向 分析進入相機的光路經過了哪些反射、折射、直接照射、環境光影響之類的。因此,光路追蹤引擎的渲染效果,還是能比較確切反映真實情況的。在這裏,把最大反彈次數設為 128 次,即認為光路在追蹤過程中,如果在鏡面求壁上反彈次數超過 128 次仍未碰到物體時,就不追蹤了。經過嘗試,128 次已經基本夠用了,反彈次數再多的話,效果變化非常微小,但卻大大延長渲染所需的時間。

一切都準備就緒,開始渲染吧!這就是這段過程中,「她」所能看到的景象:

假如一個真空球內壁是全鏡面,懸浮在球內的人看到的是什麽景象? http://v.youku.com/v_show/id_XNTk5NjM0NTIw.html

可以看到,在穿過球心前,自己的影像是倒像。影像隨著距離球心距離的縮短而變大,在球心時影像變為無限大。穿過球心後,影像變為正向,大小由無限大開始縮小。

如果從人物外邊,看這個人物呢?我們首先從人物的正前方,向人物的方向看去(把反射衰減重新設定為 0,即光線在球壁反射時,並無衰減):


看到的大概是這個效果:


從後面看:




側面:




(兩倍球半徑,鏡面衰減 15%)從模特前方觀察模特:


背面視角:


側面視角:


最後要聲明一下,這些畫面是用電腦模擬生成的,而使用電腦模擬不可避免地帶有局限性。因為從人們生活的尺度看,自然世界是連續的。而電腦模擬的世界是離散的,比如球面、人物實際是一組三角面片的組合,光線反射次數也不能設定為無限大等。但我想,這些圖片已經能夠說明大概效果了。

PS: 使用開源 3D 軟體 Blender 來做的模擬,渲染引擎為 Blender 內建的 Cycles 光路追蹤引擎。Blender 介紹:

推薦一個 3D 動畫創作軟體:Blender

,Blender 下載:

http://www. blender.org/download

======

有人問,是不是畫面中,映像個數取決於球形鏡面的多邊形個數嗎?那麽來看看細化球面多邊形幾何形態後,結果會是什麽樣吧:

原球體多邊形鏡面:

球體鏡面幾何形態細化兩倍後:

細化為 3 倍後:

細化為四倍後:

五倍:

可以看到,映像個數沒有變化,變化的只是映像的大小,所以認為,這個球面幾何體精度基本能夠接受。出現不連續的人物影像,不是由於幾何體的精度有限所造成的。

再回應一下章佳傑先生提出的質疑吧。部份寫在了他答案的評論上,現在挪到這邊來:

對於第一點,雖然球面的確是由一組多邊形組成的,但著色方式是由頂點的法線插值運算而來的(不知道大家能不能明白 = =)。簡單說,這樣可以用離散的幾何多邊形物體模擬光滑的表面,例如遊戲、CG 中常見的汽車那樣。因此,仍可以說,這是一個光滑(但不完美)的球面。實際上,我也在底下試過了平直著色,即面的法線完全就是多邊形的法線,而不是多邊形頂點法線插值而來。這種情況下的渲染結果完全不一樣。此外,光路追蹤引擎不同於遊戲中的光柵化投影引擎,光路追蹤引擎還是能相當真實地還原各種光學現象的,如折射、鏡面反射、散射等等。光路追蹤引擎的具體原理,網上可以很容易查到,在此就不多敘述了。

對於第二點,光線追蹤引擎完全可以「看到」虛像。舉個例子,平面鏡映像即是虛像,可鏡面在 3D 效果圖裏是一個司空見慣的東西。由此可見,使用光路追蹤引擎渲染鏡面是沒有任何問題的。就此可證明,光路追蹤引擎有能力表現虛像。

(多說一句,3D 遊戲中的鏡面反射材質效果,如跑車表面反射環境周圍環境的效果,跟 3D 動畫軟體渲染原理是大不一樣的。遊戲裏常用的技術是用虛擬攝影機捕捉物體周圍的畫面,然後組成環境立方貼圖,對映到物體表面上,並與漫反射、法線對映、高光對映等效果混合而來。)

對於第三點,是我這邊的錯誤,現在的回答已經據此修正。

就這樣。

評論請寄至信箱: