A Scene with Metal Spheres
Now let’s add some metal spheres to our scene:
diff --git a/src/main.rs b/src/main.rs
index a016213..4f0fceb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,17 +1,46 @@
-use code::{camera::Camera, hittable_list::HittableList, prelude::*, sphere::Sphere};
+use code::{
+ camera::Camera,
+ hittable_list::HittableList,
+ material::{Lambertian, Metal},
+ prelude::*,
+ sphere::Sphere,
+};
fn main() -> std::io::Result<()> {
let mut world = HittableList::new();
- world.add(Rc::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5)));
- world.add(Rc::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0)));
+ let material_ground = Rc::new(Lambertian::new(Color::new(0.8, 0.8, 0.0)));
+ let material_center = Rc::new(Lambertian::new(Color::new(0.1, 0.2, 0.5)));
+ let material_left = Rc::new(Metal::new(Color::new(0.8, 0.8, 0.8)));
+ let material_right = Rc::new(Metal::new(Color::new(0.8, 0.6, 0.2)));
+
+ world.add(Rc::new(Sphere::new(
+ Point3::new(0.0, -100.5, -1.0),
+ 100.0,
+ material_ground,
+ )));
+ world.add(Rc::new(Sphere::new(
+ Point3::new(0.0, 0.0, -1.2),
+ 0.5,
+ material_center,
+ )));
+ world.add(Rc::new(Sphere::new(
+ Point3::new(-1.0, 0.0, -1.0),
+ 0.5,
+ material_left,
+ )));
+ world.add(Rc::new(Sphere::new(
+ Point3::new(1.0, 0.0, -1.0),
+ 0.5,
+ material_right,
+ )));
env_logger::init();
Camera::default()
.with_aspect_ratio(16.0 / 9.0)
.with_image_width(400)
.with_samples_per_pixel(100)
.with_max_depth(50)
.render(&world)
}
Listing 68: [main.rs] Scene with metal spheres
Which gives:

Image 13: Shiny metal