蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術
在最後一章中,我們開發了生成與日晷相對的隨機方向的方法。我們要做的是基於任意曲面的法向量。正交正規基(onb)是三個相互正交的單位向量的集合。笛卡爾xyz軸就是這樣的乙個onb,我有時忘記了它必須坐在某個真實的地方,有真實的方向,才能在真實世界中有意義,而在虛擬世界中有一些虛擬的地方和方向。是相機和場景相對位置/方向的結果,只要相機和場景在同一座標系中描述,一切都是可以的。
假設我們有乙個原點o和笛卡爾單位向量x/y/z。當我們說乙個位置是(3,-2,7)時,我們實際上是說:
位置為o + 3*x - 2*y + 7*z
如果我們想測量另乙個座標系中原點為o'且基向量為u/v/w的座標,我們只需找到數字(u,v,w)即可:
位置是o'+uu+vv+w。
如果你學習圖形入門課程,你會花很多時間在座標系和4x4座標變換矩陣上。注意,這在圖形中是很重要的!但我們不需要它。我們需要的是用相對於n的集合分布生成隨機方向。我們不需要原點,因為方向與原點無關。我們需要兩個相互垂直於n的餘切向量。
有些模型至少會有乙個餘切向量。製作onb的最困難的情況是我們只有乙個向量。假設我們有任何不為零長或不平行於n的向量a,我們可以利用 cross(c,d) 同時垂直於c和d的叉積的性質得到垂直於n的向量s和t:
t = unit_vector( cross(a, n) )
s = cross(t,n)
關鍵是,我們沒有a,如果我們在某個點上選擇乙個特定的a,我們將得到乙個與a平行的n。乙個常見的方法是使用if語句來確定n是否是乙個特定的軸,如果不是,則使用該軸。
if (fabs(n.x()) > 0.9)
a = (0,1,0)
else
s = (1,0,0)
一旦我們有乙個onb,並且我們有乙個相對於z軸的隨機向量 (x,y,z) ,(該項量在原始座標系中的值是(x,y,z))我們就可以得到相對於n的向量:
random vector= x*s + y*t + z*n
你可能會注意到我們用了類似的數學方法從相機獲取光線。這可以看作是對相機自然座標系的改變。我們應該為onb建立乙個類還是實用函式足夠了?我不確定,但讓我們建立乙個類,因為它不會比實用函式更複雜:
#ifndef __onb_h__
#define __onb_h__
#include "vec3.h"
class onb
inline vec3 operator(int i)const
vec3 u()const
vec3 v()const
vec3 w()const
vec3 local(float a, float b, float c)const
vec3 local(const vec3&a)const
void build_from_w(const vec3&);
vec3 axis[3];
};void onb::build_from_w(const vec3&n)
#endif
我們可以用這個重寫lambertian材料,得到:
inline vec3 random_cosine_direction()
virtual bool scatter(const ray& r_in, const hit_record& rec, vec3& alb, ray& scattered, float &pdf)const
得到結果:
這個結果對嗎?我們還不能確定。在缺乏可靠的參考解決方案的情況下,追蹤錯誤是很困難的。讓我們暫時把它擱置一下,然後繼續消除一些噪音。
一輩子 好美
走過了很多的春夏秋冬,見過了太多了大事小事,唯有坦然面對才會看到希望就在眼前。一輩子,好短。真的需要好好的疼自己,你的世界,有了自己的那束陽光才更加的耀眼。一輩子,好累。真的不需要苛求自己,一切要達到完美。你的世界,有了你的腳印,你就來過。一輩子,好美。自己的世界,好好綻放自己的美麗。時間飛逝,隨著...
都是一輩子
1.小強每天在村里晃悠,爹媽看著發愁,心想這孩子將來怎麼辦呀 小明每日都苦讀詩書,父母喜在心裡,村裡人都認定他必有出息。2.那年,小強和小明都是十九歲,小強跟著村里的外出打工,來到了高速公路的工地,保底工資三千塊 小明考上了一所重點大學,讀的是道路與橋梁專業,學費每年五千多。3.那年,小強和小明都是...
認識網路(一) 幹一輩子革命學一輩子c
網路 網路其實就是跨主機的 程序間 通訊協議分層 分層的意義 網路協議比較複雜,如果不拆分就會很複雜 分層的好處 拆分成多個模組相當於降低了整個系統的耦合程度,根據實際需要,隨時可以替換其中的某一層協議osi七層模型 tcp ip五層 或四層 模型 由圖可見網路層和傳輸層都是由作業系統核心來實現的,...