蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術
旋轉不是很容易理解或生成公式。一種常見的圖形策略是應用圍繞x、y和z軸的所有旋轉。這些旋轉在某種意義上是軸對齊的。首先,讓我們繞z軸旋轉θ。這只會改變x和y,而不依賴於z。
這涉及到一些基本的三角學,使用的公式,我將不在這裡介紹。這給你乙個正確的印象,它有點複雜,但它是直截了當的,你可以在任何圖形文字和許多課堂講稿中找到它。圍繞z逆時針旋轉的結果是:
x』 = cos(theta)*x - sin(theta)*y
y』 = sin(theta)*x + cos(theta)*y
最棒的是它適用於任何θ,不需要任何象限或類似的情況。反變換是相反的幾何運算:旋轉θ。這裡,回想一下cos(θ)=cos(-θ)和sin(-θ)=-sin(θ),公式非常簡單。
類似地,對於圍繞y旋轉(我們希望對框中的塊執行此操作),公式如下:
x』 = cos(theta)*x + sin(theta)*z
z』 = -sin(theta)*x + cos(theta)*z
關於x軸:
y』 = cos(theta)*y - sin(theta)*z
z』 = sin(theta)*y + cos(theta)*z
與平移不同的是,曲面法向量也會發生變化,因此,如果命中,我們也需要變換方向。幸運的是,同樣的公式也適用於旋轉。如果你加上scale,事情會變得更複雜,可以檢視網頁www.in1weekend.com找到加入scale後的方法。
對於y旋轉類,我們有:
class rotate_y :public hitable
hitable *ptr;
float sin_theta;
float cos_theta;
bool hasbox;
aabb bbox;
};
使用建構函式和hit函式:
float flt_max = 2000;
rotate_y::rotate_y(hitable*p, float angle) :ptr(p)
}} }
bbox = aabb(min, max);
}bool rotate_y::hit(const ray&r, float t_min, float t_max, hit_record&rec)const
else
return false;
}
康奈爾牆程式也要改改:
好像不對啊,為什麼乙個顯示的物體這麼亮,乙個顯示的物體這麼暗呢?
正常來說,位置變動也不大,不應該都是同樣亮度嗎?
除錯發現:
vec3 min_p(flt_max, flt_max, flt_max);
vec3 max_p(-flt_max, flt_max, flt_max);
應該改為:
vec3 min_p(flt_max, flt_max, flt_max);
vec3 max_p(-flt_max, -flt_max, -flt_max);
還有一處錯誤在hit函式裡,改為:
normal[0] = cos_theta*rec.normal[0] + sin_theta*rec.normal[2];
normal[2] = -sin_theta*rec.normal[0] + cos_theta*rec.normal[2];
這才對嘛! 《再學一周光線追蹤》 學習 七 實物(一)
蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 康奈爾盒子裡通常有兩個街區。它們相對於牆旋轉。首先,讓我們製作乙個軸對齊的塊原語,它包含6個矩形 class box public hitable box const vec3 p0,const vec3 p1,material ptr virtu...
再學一周光線追蹤 bvh樹流程
蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 這次詳細分析一下 再學一周光線追蹤 裡面bvh樹和包圍盒繫結的流程,為了加入三角麵片來進行優化。在hitable類的派生類sphere中只有乙個返回項bounding box,返回sphere的包圍盒。但是sphere和這個返回的包圍盒並沒有直接聯...
《再學一周光線追蹤》 學習 二點五 程式測試
蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 上節寫的程式太多,這一節我們測試一下。首先我們要把 hitable list裡面繼承的類實現一下,裡面的內容可以是空的,否則抽象類不能初始化。當然這段程式裡我們也不需要初始化抽象類 bool hitable list bounding box fl...