蒙特卡洛光線追蹤技術系列 見 蒙特卡洛光線追蹤技術
測試一:在main函數裏把第二個球體的改爲如下:
list[1] = new sphere(vec3(-0.8, 0, -1), 0.5);
結果:
這說明我們的攝像機還存在一定的問題。攝像機由於是一個透視結構(近大遠小),所以會造成形變。
測試二:把兩個球順序交換一下:
list[0] = new sphere(vec3(-0.8, 0, -1), 0.5);
list[1] = new sphere(vec3(0, 0, -1), 0.5);
得到結果:
和上面一樣,說明交點不與列表先後順序有關。我們重看一下剛纔的程序:
double closest_so_far = tmax;
for (int i = 0;i < list_size;i++) {
if (list[i]->hit(r, tmin, closest_so_far, temp_rec)) {
hit_anything = true;
closest_so_far = temp_rec.t;
rec = temp_rec;
}
}
可知我們的視野範圍會不斷變化,把能看到的最遠點不斷更新,所以前面的會擋住後面的。
測試三:繼續修改爲:
list[0] = new sphere(vec3(0.0, 0.0, -1.0), 1.5);
list[1] = new sphere(vec3(0, 0, -1), 0.5);
結果:
這個時候小球被套在大球內部了。
我們再修改爲:
list[0] = new sphere(vec3(0.0, 0.0, -2.0), 1.3);
list[1] = new sphere(vec3(0, 0, -0.5), 0.2);
結果: