蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術
康奈爾盒子裡通常有兩個街區。它們相對於牆旋轉。首先,讓我們製作乙個軸對齊的塊原語,它包含6個矩形:
class box :public hitable
box(const vec3&p0, const vec3&p1, material *ptr);
virtual bool hit(const ray&r, float t0, float t1, hit_record&rec)const;
virtual bool bounding_box(float t0, float t1, aabb&box)const
vec3 pmin, pmax;
hitable *list_ptr;
};box::box(const vec3&p0, const vec3&p1, material *ptr)
bool box::hit(const ray&r, float t0, float t1, hit_record&rec)const
現在我們可以新增兩個塊(但不能旋轉):
list[i++] = new box(vec3(130, 0, 65), vec3(295, 165, 230), white);
list[i++] = new box(vec3(265, 0, 295), vec3(430, 330, 460), white);
list[i++] = new flip_normals(new xz_rect(0, 555, 0, 555, 555, white));
list[i++] = new xz_rect(0, 555, 0, 555, 0, white);
得到:
每個畫素點取樣1000次,得到下圖:(執行了五分鐘)
現在我們有了盒子,我們需要旋轉它們一點,讓它們與真正的康奈爾盒子相匹配。在光線跟蹤中,這通常是通過實物完成的。實物是以某種方式移動或旋轉的幾何圖元。這在光線跟蹤中特別容易,因為我們不移動任何東西;相反,我們將光線移動到相反的方向。例如,考慮乙個translate(通常稱為移動(move))。我們可以在原點處取粉紅色的方框,並將其所有x分量相加2,或者(就像我們在光線跟蹤中幾乎總是做的那樣)保留該方框,但在其命中實物中,從光線原點的x分量中減去2。
你認為這是乙個移動還是座標的改變取決於你。用於移動任何底層hitable的**是乙個translate例項。
#ifndef __change_h__
#define __change_h__
#include "hitable.h"
class translate :public hitable
virtual bool hit(const ray&r, float t_min, float t_max, hit_record&rec)const;
virtual bool bounding_box(float t0, float t1, aabb&box)const;
hitable *ptr;
vec3 offset;
};bool translate::hit(const ray&r, float t_min, float t_max, hit_record&rec)const
else
return false;
}bool translate::bounding_box(float t0, float t1, aabb&box)const
else
return false;
}#endif
《再學一周光線追蹤》 學習 七 實物(二)旋轉
蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 旋轉不是很容易理解或生成公式。一種常見的圖形策略是應用圍繞x y和z軸的所有旋轉。這些旋轉在某種意義上是軸對齊的。首先,讓我們繞z軸旋轉 這只會改變x和y,而不依賴於z。這涉及到一些基本的三角學,使用的公式,我將不在這裡介紹。這給你乙個正確的印象,...
再學一周光線追蹤 bvh樹流程
蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 這次詳細分析一下 再學一周光線追蹤 裡面bvh樹和包圍盒繫結的流程,為了加入三角麵片來進行優化。在hitable類的派生類sphere中只有乙個返回項bounding box,返回sphere的包圍盒。但是sphere和這個返回的包圍盒並沒有直接聯...
《再學一周光線追蹤》 學習 一 引子和運動模糊
蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術 在 一周學完光線跟蹤 書本中,您構建了乙個簡單且蠻力的光線 在本期中,我們將新增紋理 體 如霧 矩形 例項 燈光,並支援使用bvh的許多物件。完成後,你會有乙個 真正的 光線 許多人 包括我 相信,光線跟蹤中的乙個啟發是,大多數優化會使 複雜化,而...