10.6.Fuzzy Reflection
This commit is contained in:
parent
37b793287d
commit
b28a6cc7f5
|
@ -51,9 +51,9 @@ fn camera_render() {
|
||||||
let plane_m = Some(MaterialKind::Lambertian(Lambertian{albedo: Color::new(0.899, 0.899, 0.999)}));
|
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 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 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 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(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)));
|
world.put(Box::new(Sphere::new(Point::new(-1.0, 0.0, -1.0), 0.5, left_m)));
|
||||||
|
|
|
@ -46,26 +46,23 @@ impl Material for Lambertian {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Metal {
|
pub struct Metal {
|
||||||
pub albedo: Color,
|
pub albedo: Color,
|
||||||
|
pub fuzz: f32
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Clone for Metal {
|
impl Clone for Metal {
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
Metal {
|
Metal {
|
||||||
albedo: self.albedo,
|
albedo: self.albedo,
|
||||||
|
fuzz: self.fuzz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Material for Metal {
|
impl Material for Metal {
|
||||||
fn scatter(&self, r_in: &Ray, hit_record: &mut HitRecord, attenuation: &mut Color, scattered: &mut Ray) -> bool {
|
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);
|
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();
|
*attenuation = self.albedo.clone();
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ impl Vec3 {
|
||||||
pub fn random_unit() -> Self {
|
pub fn random_unit() -> Self {
|
||||||
loop {
|
loop {
|
||||||
let v = Vec3::random();
|
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();
|
return v / v.length_squared();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue