From b28a6cc7f5d1e8dc21b006d3fdd22d61bf9ef153 Mon Sep 17 00:00:00 2001 From: dengqn Date: Tue, 12 Aug 2025 17:37:25 +0800 Subject: [PATCH] 10.6.Fuzzy Reflection --- src/main.rs | 4 ++-- src/material.rs | 11 ++++------- src/vec3.rs | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7b23ee7..4f3a6ac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -51,9 +51,9 @@ fn camera_render() { let plane_m = Some(MaterialKind::Lambertian(Lambertian{albedo: Color::new(0.899, 0.899, 0.999)})); // let plane2_m = Some(MaterialKind::Metal(Metal{albedo: Color::new(0.784,0.784,0.784)})); let center_m = Some(MaterialKind::Lambertian(Lambertian{albedo: Color::new(0.5, 0.5, 0.5)})); - let left_m = Some(MaterialKind::Metal(Metal{albedo: Color::new(0.799, 0.599, 0.799)})); + let left_m = Some(MaterialKind::Metal(Metal{albedo: Color::new(0.799, 0.599, 0.799), fuzz: 0.0005})); let left_behind_m = Some(MaterialKind::Lambertian(Lambertian{albedo: Color::new(0.799, 0.599, 0.599)})); - let right_m = Some(MaterialKind::Metal(Metal{albedo: Color::new(0.8, 0.6, 0.2)})); + let right_m = Some(MaterialKind::Metal(Metal{albedo: Color::new(0.8, 0.6, 0.2), fuzz: 0.3})); world.put(Box::new(Sphere::new(Point::new(0.0, 0.0, -1.0), 0.5, center_m))); world.put(Box::new(Sphere::new(Point::new(-1.0, 0.0, -1.0), 0.5, left_m))); diff --git a/src/material.rs b/src/material.rs index fe1fd62..26b8ff8 100644 --- a/src/material.rs +++ b/src/material.rs @@ -46,26 +46,23 @@ impl Material for Lambertian { #[derive(Debug)] pub struct Metal { pub albedo: Color, + pub fuzz: f32 } impl Clone for Metal { fn clone(&self) -> Self { Metal { albedo: self.albedo, + fuzz: self.fuzz } } } impl Material for Metal { fn scatter(&self, r_in: &Ray, hit_record: &mut HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool { - /* - vec3 reflected = reflect(r_in.direction(), rec.normal); - scattered = ray(rec.p, reflected); - attenuation = albedo; - return true; - */ let reflected = reflect(r_in.direction, hit_record.normal); - *scattered = Ray::new(hit_record.p, reflected); + let fuzz_relected = (reflected / reflected.length_squared()) + (Vec3::random_unit() * self.fuzz); + *scattered = Ray::new(hit_record.p, fuzz_relected); *attenuation = self.albedo.clone(); true } diff --git a/src/vec3.rs b/src/vec3.rs index 24ce443..ebe21ac 100644 --- a/src/vec3.rs +++ b/src/vec3.rs @@ -50,7 +50,7 @@ impl Vec3 { pub fn random_unit() -> Self { loop { let v = Vec3::random(); - if f32::MIN < v.length_squared() && v.length_squared() <= 1.0 { + if 1e-160 < v.length_squared() && v.length_squared() <= 1.0 { return v / v.length_squared(); } }