乙個光線跟蹤的簡單例項

2022-05-07 15:45:06 字數 1846 閱讀 1331

零、一些效果圖

如下所示:

一、光線跟蹤的基本原理(引用)

如上圖所示,聯結觀察點和螢幕上的乙個象素,即形成一根視線。因此,視線的數目等於象素的數目。對於每一根視線作如下處理:

計算視線v與各平面的交點。以距離最小的交點為可見交點p0。視線v在p0處產生反射和透射,所產生的反射線和透視線作為新的視線與各平面求交幾時出新的交點p1、p2,並分別產生新的反射線和透視線,……。這樣不斷遞迴,直至所產生的視線射出場景。結果是得到視線跟蹤軌跡上的一系列交點:p0、p1、p2、…、pn。這個過程可以表示為一棵光線跟蹤樹。

下圖所示是一棵與上圖對應的光線跟蹤樹。樹的結點代表物體表面與跟蹤線的交點。結點連線代表跟蹤線。每個結點的左兒子代表反射產生的跟蹤線(r),右兒子代表透射產生的跟蹤線(t)。空箭頭表示跟蹤絲射出場景。p0處的光強是p0、p1、p2、p3點光強的合成。計算方法是以後序周遊的演算法遍歷這顆光線跟蹤樹。在每一結點處,遞迴呼叫光照模型,算出跟蹤射線方向的光強,並按兩表面交點之間的距離進行衰減後,傳遞給父結點。如此上遞,最後得出p0點處的光強,亦即得到螢幕象素處的亮度。

二、光線跟蹤演算法的優缺點(摘錄)

用光線跟蹤方法顯示真實感圖形有如下優點:

1)顯示它不僅考慮到光源的光照,而且考慮到場景中各物體之間彼此反射的影響,因此顯示效果十分逼真。

2)有消隱功能

採用光線跟蹤方法,在顯示的同時,自然完成消隱功能。而且,事先消隱的做法也不適用光線跟蹤,因為那些背面和被遮擋的面,雖然看不見,但仍榀能通過反射或透射影響著看得見的面上的光強。

3)有影子效果

光線跟蹤能完成影子的顯示,方法是從p0處向光源發射一根陰影探測光線。如果該光線在到達光源之前與場景中任一不透明的面相交,則p0處於陰影之中,否則,p0處於陰影之外。

4)該演算法具有並行性質

每條光線的處理過程相同,結果彼此獨立,因此可以大並行處理的硬體上快速實現光線跟蹤演算法。

光線跟蹤演算法的缺點是計算量非常大,因此,顯示速度極慢。

三、程式**及說明(本程式沒有考慮折射效果)

getcolourforray()

//獲取射線ray的顏色,存入colour_out,最多跟蹤tracenum次

void world::getcolourforray(const ray& ray, colour& colour_out,int tracenum)

}total1 = ambient_lighting * obj->getmaterial().ka

+ diffuse * obj->getmaterial().kd + specular * obj->getmaterial().ks;

getcolourforray(ray(hitpos,r),total2,tracenum-1);//遞迴計算下個交點的光照

colour_out = total1 + total2*bf;//累加

return;

} } colour_out = colour::black();//其餘情況返回黑色

}

乙個簡單的路由跟蹤程式

usr bin python2.7 coding utf 8 import requests import os import re import time import sys baseurl def exectrace dest result os.popen traceroute dest r...

乙個簡單的爬蟲例項

獲取網頁html文字內容 usr bin python coding utf 8 import urllib import re 根據url獲取網頁html內容 defgethtmlcontent url page urllib.urlopen url return page.read 從html中...

乙個簡單的Ant例項

在eclipse裡面做web專案確實是一件比較煩人的事,所有的事都得自己做。但卻不失為乙個學習,提高自己知識的好機會。像myeclipse,只要發布一下,web應用就可以訪問了,但是eclipse裡面,需要自己手動編譯,手動打包發布到伺服器才能訪問。下面就是乙個簡單用ant發布web應用的例子,別小...