|
2257 | 2257 |
|
2258 | 2258 | class onb {
|
2259 | 2259 | public:
|
2260 |
| - onb() {} |
2261 |
| - |
2262 |
| - vec3 operator[](int i) const { return axis[i]; } |
2263 |
| - vec3& operator[](int i) { return axis[i]; } |
2264 |
| - |
2265 |
| - vec3 u() const { return axis[0]; } |
2266 |
| - vec3 v() const { return axis[1]; } |
2267 |
| - vec3 w() const { return axis[2]; } |
2268 |
| - |
2269 |
| - vec3 local(double a, double b, double c) const { |
2270 |
| - return a*u() + b*v() + c*w(); |
| 2260 | + onb(const vec3& n) { |
| 2261 | + axis[2] = unit_vector(n); |
| 2262 | + vec3 a = (std::fabs(axis[2].x()) > 0.9) ? vec3(0,1,0) : vec3(1,0,0); |
| 2263 | + axis[1] = unit_vector(cross(axis[2], a)); |
| 2264 | + axis[0] = cross(axis[2], axis[1]); |
2271 | 2265 | }
|
2272 | 2266 |
|
2273 |
| - vec3 local(const vec3& a) const { |
2274 |
| - return a.x()*u() + a.y()*v() + a.z()*w(); |
2275 |
| - } |
| 2267 | + const vec3& u() const { return axis[0]; } |
| 2268 | + const vec3& v() const { return axis[1]; } |
| 2269 | + const vec3& w() const { return axis[2]; } |
2276 | 2270 |
|
2277 |
| - void build_from_w(const vec3& w) { |
2278 |
| - vec3 unit_w = unit_vector(w); |
2279 |
| - vec3 a = (std::fabs(unit_w.x()) > 0.9) ? vec3(0,1,0) : vec3(1,0,0); |
2280 |
| - vec3 v = unit_vector(cross(unit_w, a)); |
2281 |
| - vec3 u = cross(unit_w, v); |
2282 |
| - axis[0] = u; |
2283 |
| - axis[1] = v; |
2284 |
| - axis[2] = unit_w; |
| 2271 | + vec3 transform(const vec3& v) const { |
| 2272 | + // Transform from basis coordinates to local space. |
| 2273 | + return (v[0] * axis[0]) + (v[1] * axis[1]) + (v[2] * axis[2]); |
2285 | 2274 | }
|
2286 | 2275 |
|
2287 | 2276 | private:
|
|
2332 | 2321 | bool scatter(
|
2333 | 2322 | const ray& r_in, const hit_record& rec, color& attenuation, ray& scattered, double& pdf
|
2334 | 2323 | ) const override {
|
2335 |
| - onb uvw; |
2336 |
| - uvw.build_from_w(rec.normal); |
2337 |
| - auto scatter_direction = uvw.local(random_cosine_direction()); |
| 2324 | + onb uvw(rec.normal); |
| 2325 | + auto scatter_direction = uvw.transform(random_cosine_direction()); |
2338 | 2326 |
|
2339 | 2327 | scattered = ray(rec.p, unit_vector(scatter_direction), r_in.time());
|
2340 | 2328 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
|
|
2428 | 2416 | ...
|
2429 | 2417 | };
|
2430 | 2418 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
2431 |
| - [Listing [scatter-onb-ray-color]: <kbd>[camera.h]</kbd> |
| 2419 | + [Listing [scatter-ray-color]: <kbd>[camera.h]</kbd> |
2432 | 2420 | Updated ray_color function with returned PDF value
|
2433 | 2421 | ]
|
2434 | 2422 |
|
|
2769 | 2757 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
|
2770 | 2758 | class cosine_pdf : public pdf {
|
2771 | 2759 | public:
|
2772 |
| - cosine_pdf(const vec3& w) { uvw.build_from_w(w); } |
| 2760 | + cosine_pdf(const vec3& w) : uvw(w) {} |
2773 | 2761 |
|
2774 | 2762 | double value(const vec3& direction) const override {
|
2775 | 2763 | auto cosine_theta = dot(unit_vector(direction), uvw.w());
|
2776 | 2764 | return std::fmax(0, cosine_theta/pi);
|
2777 | 2765 | }
|
2778 | 2766 |
|
2779 | 2767 | vec3 generate() const override {
|
2780 |
| - return uvw.local(random_cosine_direction()); |
| 2768 | + return uvw.transform(random_cosine_direction()); |
2781 | 2769 | }
|
2782 | 2770 |
|
2783 | 2771 | private:
|
|
3756 | 3744 | vec3 random(const point3& origin) const override {
|
3757 | 3745 | vec3 direction = center1 - origin;
|
3758 | 3746 | auto distance_squared = direction.length_squared();
|
3759 |
| - onb uvw; |
3760 |
| - uvw.build_from_w(direction); |
3761 |
| - return uvw.local(random_to_sphere(radius, distance_squared)); |
| 3747 | + onb uvw(direction); |
| 3748 | + return uvw.transform(random_to_sphere(radius, distance_squared)); |
3762 | 3749 | }
|
3763 | 3750 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
|
3764 | 3751 |
|
|
0 commit comments