【简介与代码】
本章在上一章的基础上实现了运动模糊的功能:
本章代码使用VS2015编写,下载地址:
链接:https://pan.baidu.com/s/1sv_ie8DODAi-WG57q4SyxQ 提取码:v2v3 【具体实现】
这里面首先有个运动物体,定义一个时间范围(t0, t1)代表球从t0时间时开始,运动到t1时刻,再定义球在t0时的位置center0,在t1时的位置center1,这样就形成一个关于时间和位置的线性关系,根据任意时间对球的位置进行求取:
vec3 center(float time) const { return center0 + ((time - time0) / (time1 - time0))*(center1 - center0); }本章新定义一个moving_sphere类,它的碰撞函数里面只需要将sphere类hit函数里的center,改为center(time)就可以了。
球的位置与时间相关后,再定义相机快门的开、关时间。在相机快门开关的时候,比如(0, 1),代表从0秒开始,1秒关闭,在这个时间段时生成无数个时间点进行插值,生成光线,与球相交。此时的光线带有时间参数。
class ray { public: ray() {} ray(const vec3& a, const vec3& b, float ti = 0.0) { A = a; B = b; _time = ti; } vec3 origin() const { return A; } vec3 direction() const { return B; } float time() const { return _time; } vec3 point_at_parameter(float t) const { return A + t*B; } vec3 A; vec3 B; float _time; };camera中根据快门的开关时间来生成光线的代码:
ray get_ray(float s, float t) { vec3 rd = lens_radius * random_in_unit_disk(); vec3 offset = u*rd.x() + v*rd.y(); float time = time0 + drand48()*(time1 - time0); return ray(origin+offset, unit_vector(lower_left_corner + s*horizontal + t*vertical - origin-offset), time); }由于是50次的多重采样,最终随机的结果与正常的时间流逝相差不大。