梁瑞堯,張蕓禎
摘要:黑洞是1915年愛因斯坦廣義相對(duì)論預(yù)言存在的一種天體,它具有的超強(qiáng)引力,使得光也無法逃脫它的勢(shì)力范圍。黑洞可以用愛因斯坦場方程[1]來描述,但愛因斯坦場方程是一組復(fù)雜的二階非線性微分方程,并沒有通解。傳統(tǒng)渲染黑洞的方法一般是使用離線渲染的方法,例如在電影《星際穿越》中的卡岡圖雅黑洞,特效實(shí)現(xiàn)就由30個(gè)人,數(shù)千臺(tái)計(jì)算機(jī)耗時(shí)一年才完成[2]。本文描述一種高質(zhì)量實(shí)時(shí)渲染黑洞的方法,用光線追蹤和引力方程,模擬黑洞的空間彎曲效果,用柏林噪聲模擬吸積盤,并給出一種簡單而美觀的相對(duì)論噴流模擬方法。這些模擬方法易于實(shí)現(xiàn),可以在PC或移動(dòng)設(shè)備上以較高的幀率運(yùn)行。
關(guān)鍵詞:黑洞;渲染;光纖追蹤
中圖分類號(hào):TP311? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)21-0165-03
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
1 黑洞簡介
黑洞由四個(gè)部分組成:
1) 奇點(diǎn),位于黑洞的最中心,體積無限小,質(zhì)量無限大的點(diǎn),這兩種特性使得奇點(diǎn)的密度無限大,具有很強(qiáng)大的引力,以至于所有掉入黑洞的物質(zhì)和能量最終都會(huì)坍縮和終結(jié)于這里。
2) 事件視界,以奇點(diǎn)為中心某一特定半徑的球形區(qū)域,物質(zhì)和能量一旦跨越該邊界將被黑洞引力吸入奇點(diǎn),一去不復(fù)返。
3) 吸積盤,事件視界之外的氣體、星塵在黑洞強(qiáng)大的引力作用下,會(huì)朝向黑洞下落。這個(gè)過程被稱作“黑洞吸積”。由于氣體具有一定的角動(dòng)量,這些氣體在下落過程中會(huì)形成一個(gè)圍繞黑洞高速旋轉(zhuǎn)的盤狀結(jié)構(gòu),如同太陽系的各大行星軌道平面一樣,這就是黑洞吸積盤。
4) 相對(duì)論噴流,吸積盤上的氣體、星塵有部分會(huì)跨越事件視界落入黑洞,從而產(chǎn)生粒子,能量等從黑洞的兩極接近光速噴射而出,形成相對(duì)論噴流。
2 傳統(tǒng)黑洞的渲染方法
傳統(tǒng)渲染黑洞的核心思想是模擬光線在強(qiáng)引力下的傳播,計(jì)算出光線在傳播路徑中與場景中的各個(gè)點(diǎn)交互產(chǎn)生的顏色值,一般使用光線追蹤算法來實(shí)現(xiàn)。但在引力作用下,光線不再沿直線傳播,而會(huì)因?yàn)橐ν哥R效應(yīng)而產(chǎn)生彎曲,光線的路徑可以用愛因斯坦的場方程來描述 :
盡管愛因斯坦方程的形式看起來很簡單,但求解比較復(fù)雜,并沒有通解。但對(duì)于一些比較特殊的情況,比如史瓦西解(度規(guī)),所對(duì)應(yīng)的幾何是一個(gè)是靜止不旋轉(zhuǎn)、不帶電荷之黑洞。 有了史瓦西度規(guī),我們可以對(duì)時(shí)空距離
1) 用Ray Marching方法來替代光線追蹤算法,其優(yōu)點(diǎn)是不在限制光線以直線傳播,我們可以選擇適當(dāng)?shù)牟介L,累積光線路徑與場景交互的不同點(diǎn)的顏色;
2) 使用萬有引力計(jì)算加速度以模擬光線路徑彎曲,雖然違背光速不變?cè)瓌t物理規(guī)律,但相對(duì)于求解愛因斯坦場方程,其計(jì)算量較小,只涉及簡單乘法和除法。
3 Ray Marching簡介
光線步進(jìn)(Ray Marching)是光線追蹤(Ray Tracing)的一種數(shù)值實(shí)現(xiàn)方法,在屏幕后放置一個(gè)相機(jī),從相機(jī)發(fā)出一條與(下圖中藍(lán)色的線)屏幕連上像素點(diǎn)連接的射線。用該射線與場景中的物體作相交檢測(cè)。 沿著這條射線一步一步往前進(jìn),直到光線與場景中的物體相交或者達(dá)到最大步數(shù)。如果光線與物體相交,則將屏幕上的該像素點(diǎn)設(shè)置為交點(diǎn)的顏色。如圖1所示,屏幕上該點(diǎn)發(fā)出的射線往前走了6步,最終于綠色小球相交,固將該點(diǎn)的顏色設(shè)置為綠色。算法偽代碼如下:
for(int i = 0;i { vec3 p = eye + ray_dir * step; float hit = HitTest(p); //hit表示距物體的最小距離 step += hit; //ray marhing 光線步進(jìn) if(hit < 0.01){ col = vec3(0.); break; } } 4 引力透鏡下的Ray Marching 在第三節(jié)的Ray Marching的基礎(chǔ)上,每次光線步進(jìn)時(shí)都使用萬有引力來計(jì)算光線的加速度,以使用光線產(chǎn)生彎曲。 可以把屏幕上發(fā)出的射線步進(jìn)想象為由星球發(fā)出向前運(yùn)動(dòng)的光子,在黑洞的引力作用下,光子的運(yùn)動(dòng)軌跡由于加速度不在以直線運(yùn)動(dòng),而是以曲線的軌跡到達(dá)相機(jī)位置,如圖2所示。 · 讓光子產(chǎn)生彎曲的引力公式: · 光子引力加速度 核心代碼如下: for(int i = 0;i { p += v * dt; vec3 relP = p - black_hole_pos; //黑洞相對(duì)原點(diǎn)的位置 float r2 = dot(relP,relP); vec3 a = GM/r2 * normalize(-relP); //加速度方向朝向黑洞,為-relP v += a * dt; float hit = HitTest(relP); //hit表示距物體的最小距離