' '

Difficulty

3

Prerequisites

ray-tracers/v1

Reading material

design/primitives/ray-intersections

def scene_at(now)
{
  var t = Animations.ease( Animations.animate( 0, 3, seconds(5) ), Easing.quadratic_inout() )[now]

  var camera = Cameras.perspective( [ "eye": pos(3 - t, 2 + t / 3, 5 + t),
                                      "look_at": pos(0,0,0) ] )

  var disk1_material = Materials.uniform( [ "ambient": Colors.white() * 0.1,
                                            "diffuse": Colors.red() * 0.8,
                                            "specular": Colors.white() * 0.0,
                                            "specular_exponent": 10,
                                            "reflectivity": 0.0] )

  var disk2_material = Materials.uniform( [ "ambient": Colors.white() * 0.1,
                                            "diffuse": Colors.green() * 0.8,
                                            "specular": Colors.white() * 0.0,
                                            "specular_exponent": 10,
                                            "reflectivity": 0.0] )

  var disk3_material = Materials.uniform( [ "ambient": Colors.white() * 0.1,
                                            "diffuse": Colors.blue() * 0.8,
                                            "specular": Colors.white() * 0.0,
                                            "specular_exponent": 10,
                                            "reflectivity": 0.0] )

  var plane_material = Materials.uniform( [ "ambient": Colors.white() * 0.1,
                                            "diffuse": Colors.white() * 0.8,
                                            "reflectivity": 0.2 ] )

  var disk1 = decorate(disk1_material, translate(vec(-t, 0, 0), yz_disk(1)))
  var disk2 = decorate(disk2_material, translate(vec( 0, 0, 0), xy_disk(1)))
  var disk3 = decorate(disk3_material, translate(vec( t, 0, 0), xz_disk(1)))
  var disks = union( [disk1, disk2, disk3] )

  var plane = decorate(plane_material, translate(vec(0,-2,0), xz_plane()))

  var root = union( [ disks, plane ] )

  var lights = [ Lights.omnidirectional( pos(3-t,1,4), Colors.white() * 0.8 ) ]

  create_scene(camera, root, lights)
}

var raytracer = Raytracers.v6()

var renderer = Renderers.standard( [ "width": 500,
                                     "height": 500,
                                     "sampler": Samplers.multijittered(2),
                                     "ray_tracer": raytracer ] )

pipeline( scene_animation(scene_at, seconds(5)),
          [ Pipeline.animation(30),
            Pipeline.renderer(renderer),
            Pipeline.studio() ] )

1. Implementation

Implement the disc primitive.

  • Make three variants: xy_disk(radius), xz_disk(radius) and yz_disk(radius).

    • The disks should have center \((0, 0, 0)\).

2. Evaluation

Recreate the scene below: