balls: more experimentation.

This commit is contained in:
Bill Thiede 2021-07-22 20:51:02 -07:00
parent 166c87dfe5
commit c058d043e0

View File

@ -16,9 +16,9 @@ use rtchallenge::{
Float, WHITE, Float, WHITE,
}; };
/// End of chapter 9 challenge. /// Experimenting with balls.
#[derive(StructOpt, Debug)] #[derive(StructOpt, Debug)]
#[structopt(name = "eoc9")] #[structopt(name = "balls")]
struct Opt { struct Opt {
#[structopt(long, default_value = "rayon")] #[structopt(long, default_value = "rayon")]
render_strategy: RenderStrategy, render_strategy: RenderStrategy,
@ -47,39 +47,66 @@ fn main() -> Result<()> {
.intensity([0.2, 0.2, 0.1]) .intensity([0.2, 0.2, 0.1])
.build()?; .build()?;
let from = Tuple::point(0., 1.5, -5.); let ball_size = 0.5;
let to = Tuple::point(0., 1., 0.); let num_per_axis = 3;
let center_to_center = 4. * ball_size;
let from = Tuple::point(
-5. * center_to_center,
5. * center_to_center,
-4. * center_to_center,
);
let to = Tuple::point(
num_per_axis as Float * center_to_center / 2.,
0., //num_per_axis as Float * center_to_center / 2.,
num_per_axis as Float * center_to_center / 2.,
);
let up = Tuple::point(0., 1., 0.); let up = Tuple::point(0., 1., 0.);
let mut camera = Camera::new(width, height, PI / 4.); let mut camera = Camera::new(width, height, PI / 6.);
camera.set_transform(view_transform(from, to, up)); camera.set_transform(view_transform(from, to, up));
camera.render_strategy = opt.render_strategy; camera.render_strategy = opt.render_strategy;
camera.samples_per_pixel = opt.samples; camera.samples_per_pixel = opt.samples;
let floor = ShapeBuilder::default() let floor = ShapeBuilder::default()
.geometry(Geometry::Plane) .geometry(Geometry::Plane)
.transform(Matrix4x4::translation(0., -ball_size, 0.))
.material( .material(
MaterialBuilder::default() MaterialBuilder::default()
.color([1., 0.2, 0.2]) .color([0.2, 0.2, 0.2])
.specular(0.) .specular(0.)
.build()?, .build()?,
) )
.build()?; .build()?;
let mut objects = vec![floor];
const BALL_SIZE: Float = 0.2; for z in 0..num_per_axis {
let middle = ShapeBuilder::default() for y in 0..num_per_axis {
.transform(Matrix4x4::scaling(BALL_SIZE, BALL_SIZE, BALL_SIZE)) for x in 0..num_per_axis {
.material( objects.push(
MaterialBuilder::default() ShapeBuilder::default()
.color([0.1, 1., 0.5]) .transform(
.diffuse(0.7) Matrix4x4::translation(
.specular(0.3) x as Float * center_to_center,
.build()?, y as Float * center_to_center,
) z as Float * center_to_center,
.build()?; ) * Matrix4x4::scaling(ball_size, ball_size, ball_size),
)
.material(
MaterialBuilder::default()
.color([0.1, 1., 0.5])
.ambient(y as Float / 4.)
.diffuse(x as Float / 4.)
.specular(z as Float / 4.)
.build()?,
)
.build()?,
);
}
}
}
let world = WorldBuilder::default() let world = WorldBuilder::default()
.lights(vec![light1, light2, light3]) .lights(vec![light1, light2, light3])
.objects(vec![floor, middle]) .objects(objects)
.build()?; .build()?;
let image = camera.render(&world); let image = camera.render(&world);