Ray Tracer

A toy ray tracer for educational purposes (i.e. my own education).

Live Demo (WebAssembly)

demo-img

Features

Usage

```rust use raytracer::vector::Vec3; use raytracer::scene::Scene; use raytracer::hitable::primitive::Sphere; use raytracer::hitable::primitive::Rectangle; use raytracer::hitable::transform::Translation; use raytracer::camera::perspective::PerspectiveCamera; use raytracer::renderer::Renderer; use raytracer::material::Material; use raytracer::material::plain::PlainMaterial; use raytracer::material::lambertian::LambertianMaterial; use raytracer::material::metal::MetalMaterial; use raytracer::actor::Actor; use raytracer::texture::uniform::UniformTexture; use raytracer::constants::Axis;

let mut scene = Scene::::new(); scene.setbackground(Vec3::fromarray([0.2, 0.2, 0.2]));

// The floor let hitable = Box::new(Rectangle::new(100.0, Axis::X, 100.0, Axis::Y)); let texture = Box::new(UniformTexture::new(Vec3::fromarray([0.8, 0.8, 0.8]))); let material = Box::new(LambertianMaterial::new(texture, 0.65)); let actor = Actor { hitable, material}; scene.addactor(actor);

// A sphere let hitable = Box::new(Sphere::new(1.5)); let hitable = Box::new(Translation::new(hitable, Vec3::fromarray([0.0, 0.0, 1.5]))); let texture = Box::new(UniformTexture::new(Vec3::fromarray([1.0, 0.2, 0.2]))); let material = Box::new(MetalMaterial::new(texture, 0.0)); let actor = Actor { hitable, material}; scene.add_actor(actor);

// A light let hitable = Box::new(Sphere::new(2.5)); let hitable = Box::new(Translation::new(hitable, Vec3::fromarray([0.0, -2.0, 12.5]))); let texture = Box::new(UniformTexture::new(Vec3::fromarray([1.0, 1.0, 1.0]))); let material = Box::new(PlainMaterial::new(texture)); let actor = Actor { hitable, material}; scene.add_actor(actor);

// Set up the camera let width = 320; let height = 180; let aspect = width as f64 / height as f64;

let mut camera = PerspectiveCamera::::new(); camera.setfov(0.37 * std::f64::consts::PI); camera.setposition(&[0.0, - 4.0, 1.5]); // camera.setdirection(&[0.0, 1.0, 0.0]); camera.setlookat(&[0.0, 0.0, 1.5]); camera.setup(&[0.0, 0.0, 1.0]); camera.setfov(0.35 * std::f64::consts::PI);

// Set up the renderer let samples = 256; let maxreflections = 8; let antialiasing = false let renderer = Renderer::new(width, height, samples, maxreflections, antialiasing);

// Process the image let image = renderer.render(&scene, &camera); ```