raytracer-c/scenes/christmas.yml
2020-12-18 23:29:24 -05:00

308 lines
7.7 KiB
YAML

# ======================================================
# christmas.yml
#
# This file describes a scene depicting a red Christmas
# ornament nestled among several fir branches.
#
# As each branch is generated programmatically, they
# cannot be described in this YAML format. Here is
# pseudo-code for the fir_branch object that appears in
# the YAML description.
#
# function fir_branch()
# # the length of the branch
# let length ← 2.0
#
# # the radius of the branch
# let radius ← 0.025
#
# # how many groups of needles cover the branch
# let segments ← 20
#
# # how needles per group, or segment
# let per_segment ← 24
#
# # the branch itself, just a cylinder
# let branch ← closed cylinder from y=0 to y=length
# set_transform(branch, scaling(radius, 1, radius))
# branch.material ← material with:
# color ← color(0.5, 0.35, 0.26)
# ambient ← 0.2
# specular ← 0.0
# diffuse ← 0.6
#
# # how much branch each segment gets
# let seg_size ← length / (segments - 1)
#
# # the radial distance, in radians, between adjacent needles
# # in a group
# let theta ← 2.1 * π / per_segment
#
# # the maximum length of each needle
# let max_length ← 20.0 * radius
#
# # the group that will contain the branch and all needles
# let object ← group(branch)
#
# for y ← 0 to segments - 1
# # create a subgroup for each segment of needles
# let subgroup ← group()
#
# for i ← 0 to per_segment - 1
# # each needle is a triangle.
# # y_base y coordinate of the base of the triangle
# let y_base ← seg_size * y + rand() * seg_size
#
# # y_tip is the y coordinate of the tip of the triangle
# let y_tip ← y_base - rand() * seg_size
#
# # y_angle is angle (in radians) that the needle should be
# # rotated around the branch.
# let y_angle ← i * theta + rand() * theta
#
# # how long is the needle?
# let needle_length ← max_length / 2 * (1 + rand())
#
# # how much is the needle offset from the center of the branch?
# let ofs ← radius / 2
#
# # the three points of the triangle that form the needle
# let p1 ← point(ofs, y_base, ofs)
# let p2 ← point(-ofs, y_base, ofs)
# let p3 ← point(0.0, y_tip, needle_length)
#
# # create, transform, and texture the needle
# let tri ← triangle(p1, p2, p3)
# set_transform(tri, rotation_y(y_angle))
# tri.material ← material with:
# color ← color(0.26, 0.36, 0.16)
# specular ← 0.1
#
# add_child(subgroup, tri)
# end for
#
# add_child(object, subgroup)
# end for
#
# return object
# end function
#
# by Jamis Buck <jamis@jamisbuck.org>
# ======================================================
# ======================================================
# the camera
# ======================================================
- add: camera
width: 400
height: 300
field-of-view: 1.047
from: [0, 0, -4]
to: [0, 0, 0]
up: [0, 1, 0]
# ======================================================
# the light sources are all coupled with physical
# objects, so that they appear as reflections on the
# ornament.
# ======================================================
- add: light
at: [-10, 10, -10]
intensity: [0.6, 0.6, 0.6]
- add: sphere
shadow: false
transform:
- [ scale, 1.5, 1.5, 1.5 ]
- [ translate, -10, 10, -10 ]
material:
color: [1, 1, 1]
ambient: 0.6
diffuse: 0
specular: 0
- add: light
at: [10, 10, -10]
intensity: [0.6, 0.6, 0.6]
- add: sphere
shadow: false
transform:
- [ scale, 1.5, 1.5, 1.5 ]
- [ translate, 10, 10, -10 ]
material:
color: [1, 1, 1]
ambient: 0.6
diffuse: 0
specular: 0
- add: light
at: [-2, 1, -6]
intensity: [0.2, 0.1, 0.1]
- add: sphere
shadow: false
transform:
- [ scale, 0.4, 0.4, 0.4 ]
- [ translate, -2, 1, -6 ]
material:
color: [1, 0.5, 0.5]
ambient: 0.6
diffuse: 0
specular: 0
- add: light
at: [-1, -2, -6]
intensity: [0.1, 0.2, 0.1]
- add: sphere
shadow: false
transform:
- [ scale, 0.4, 0.4, 0.4 ]
- [ translate, -1, -2, -6 ]
material:
color: [0.5, 1, 0.5]
ambient: 0.6
diffuse: 0
specular: 0
- add: light
at: [3, -1, -6]
intensity: [0.2, 0.2, 0.2]
- add: sphere
shadow: false
transform:
- [ scale, 0.5, 0.5, 0.5 ]
- [ translate, 3, -1, -6 ]
material:
color: [1, 1, 1]
ambient: 0.6
diffuse: 0
specular: 0
# ======================================================
# the scene
# ======================================================
# The ornament itself. Note that specular=0, because we're
# making the ornament reflective and then putting each light
# source inside another sphere, so that they show up as
# reflections. The specular component of Phong shading
# simulates this sort of reflection, so we don't need it here.
- add: sphere
material:
color: [1, 0.25, 0.25]
ambient: 0
specular: 0
diffuse: 0.5
reflective: 0.5
# the silver crown atop the ornament
- add: cylinder
min: 0.0
max: 1.0
transform:
- [ scale, 0.2, 0.3, 0.2 ]
- [ translate, 0, 0.9, 0 ]
- [ rotate-z, -0.1 ]
material:
pattern:
type: checkers
colors:
- [ 1, 1, 1 ]
- [ 0.94, 0.94, 0.94 ]
transform:
- [ scale, 0.2, 0.2, 0.2 ]
ambient: 0.02
diffuse: 0.7
specular: 0.8
shininess: 20
reflective: 0.05
# the branches
# WARNING: by default, each branch consists of 20 segments * 24 needles per
# segment, or 480 triangles. There are 11 branches, so there are
# 5,280 triangles used by default. While bounding boxes are not necessary
# to render this, you will find your ray tracer works much, MUCH more quickly
# with them, than without them.
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-y, 0.349 ]
- [ translate, -1, -1, 0 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-y, 0.349 ]
- [ translate, -1, 1, 0 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-y, -0.1745 ]
- [ translate, 1, -1, 0 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-y, -0.349 ]
- [ translate, 1, 1, 0 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-y, -0.349 ]
- [ translate, 0.2, -1.25, 0 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-y, 0.349 ]
- [ translate, -0.2, -1.25, 0 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-x, 0.087 ]
- [ rotate-y, 0.5236 ]
- [ translate, -1.2, 0.1, 0 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-x, -0.1745 ]
- [ rotate-y, 0.5236 ]
- [ translate, -1.2, -0.35, 0.5 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-x, 0.087 ]
- [ rotate-y, -0.5236 ]
- [ translate, -0.2, 1.5, 0.25 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-x, -0.087 ]
- [ rotate-y, -0.5236 ]
- [ translate, 1.3, 0.4, 0 ]
- add: fir_branch
transform:
- [ translate, 0, -0.5, 0 ]
- [ rotate-x, -1.5708 ]
- [ rotate-x, 0.087 ]
- [ rotate-y, -0.1745 ]
- [ translate, 1.5, -0.4, 0 ]