《再學一周光線追蹤》 學習 七 實物(二)旋轉

2021-10-07 03:28:45 字數 2348 閱讀 8497

蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術

旋轉不是很容易理解或生成公式。一種常見的圖形策略是應用圍繞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...