' '

Difficulty

2

Reading material

design/primitives/ray-intersections

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

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

  var square1_material = Materials.uniform( [ "ambient": Colors.white() * 0.1,
                                              "diffuse": Colors.red() * 0.8,
                                              "specular": Colors.white() * 0.5,
                                              "specular_exponent": 10,
                                              "reflectivity": 0.1] )
  var square2_material = Materials.uniform( [ "ambient": Colors.white() * 0.1,
                                              "diffuse": Colors.green() * 0.8,
                                              "specular": Colors.white() * 0.5,
                                              "specular_exponent": 10,
                                              "reflectivity": 0.1] )
  var square3_material = Materials.uniform( [ "ambient": Colors.white() * 0.1,
                                              "diffuse": Colors.blue() * 0.8,
                                              "specular": Colors.white() * 0.5,
                                              "specular_exponent": 10,
                                              "reflectivity": 0.1] )

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

  var left  = decorate(square1_material, translate(vec(-4+t, 0, 0), yz_square(2)))
  var right = decorate(square1_material, translate(vec(4-t, 0, 0), yz_square(2)))
  var up    = decorate(square2_material, translate(vec(0,4-t,0), xz_square(2)))
  var down  = decorate(square2_material, translate(vec(0,-4+t,0), xz_square(2)))
  var front = decorate(square3_material, translate(vec(0,0,4-t), xy_square(2)))
  var back  = decorate(square3_material, translate(vec(0,0,-4+t), xy_square(2)))
  var sides = union([left, right, up, down, back, front])

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

  var root = union( [ sides, plane ] )

  var lights = [ Lights.omnidirectional( pos(5,5,5), Colors.white() ) ]

  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 rectangle primitive.

  • Make three variants.

    • xy_rectangle(x_size, y_size)

    • xz_rectangle(x_size, z_size)

    • yz_rectangle(y_size, z_size).

  • The rectangles should their its center at \((0, 0, 0)\).

Tip

Rectangles are in essence finite planes, so you might want to start off by looking at how planes are implemented.

Implement the square primitive.

  • Make three variants.

    • xy_square(size)

    • xz_square(size)

    • yz_square(size)

  • The squares should have its center at \((0, 0, 0)\).

Tip

KISS.

Implement a box primitive.

box(4, 2, 1)

should create a box centered around \((0, 0, 0)\), with dimensions \(4 \times 2 \times 1\).

Implement a cube primitive.

  • The cube should have dimensions 1 × 1 × 1.

  • The cube should be centered around \((0, 0, 0)\).

2. Evaluation

Reproduce the following animation: