NameNachapon (Art) Chaidarun
Computing IDnc5rk
AssignmentCS 4810 Assignment 2, due October 31, 2012
Environmentg++, Sublime Text, Fedora 17 (64-bit)
Commandsmake; ./; python
Late days used5
FeaturesGreen features are fully implemented; yellow features are partially implemented; red features are unimplemented. Due to the slowness of jittered supersampling, it was implemented only as a proof-of-concept and turned off for the generation of all other image examples shown below.
test.ray, 4.29 seconds
First version: Local transformation and bounding volume information ignored
First version: Texture coordinates ignored
First version: Texture coordinates ignored
First version: Only ambient and emissive properties calculated
 (2)RayPointLight::getDiffuse, RaySpotLight::getDiffuse, RayDirectionalLight::getDiffuse
 (2)RayPointLight::getSpecular, RaySpotLight::getSpecular, RayDirectionalLight::getSpecular
 (2)RayPointLight::isInShadow, RaySpotLight::isInShadow, RayDirectionalLight::isInShadow
Second version: Diffuse and specular contributions from light sources added
Second version: Local transformations taken into account
Second version: Reflected color contributions added
dog.ray, 26.30 seconds
bunny.ray, 31.10 seconds
Third version: Refracted color contributions added, but refraction indices ignored
 (2)RayPointLight::transparency, RaySpotLight::transparency, RayDirectionalLight::transparency
Fourth version: Refraction indices taken into account
 (3)RayShape::setBoundingBox, RayGroup::setBoundingBox, BoundingBox3D::intersect, RayGroup::intersect
Fourth version: Bounding boxes ordered and tested before shapes intersected
Second version: Texture coordinates taken into account
Second version: Texture coordinates taken into account
 (1)Jittered supersampling
test.ray, 29.58 seconds, 8 jittered rays per pixel (note smooth edges)
 (1)Generate .ray with spheres, triangles, all three types of light sources, and primitive with transparent material
The scene below contains a pure red directional light, a pure blue point light, and a pure green spotlight. All other intermediate color values are derived from the combination of these three light sources.
lights.ray, 38.03 seconds
 (1)Soft shadows
Example: Walls of
Example: Columns of
 (2)Perlin noise
 (1)Bump mapping
 (1)SIGGRAPH paper procedure
 (2)Octree or BSP
 (?)Impress us with something we hadn't considered...

I think I've found a problem with line 773 of the provided geometry.cpp, which deals with matrix-ray multiplication. Take the sphere from the provided test.ray for example. Translation along the y-axis by 2.5 units is specified; the inverse transpose of the sphere's transformation matrix then has a bottom row of [0, -2.5, 0, 1]. Line 773 inexplicably calculates the fourth homogeneous coordinate t by simply summing these bottom-row entries. This means that t will be positive or negative depending on whether the translation amount is less than or greater than 1, which has serious implications: any RayGroup transformed with this matrix will have correct normals on one half of an arbitrary plane and backwards normals on the other side!

I initially discovered this effect when I tried decreasing the translation amount specified in test.ray. Half of the resultant ellipsoid appeared correct while the other half was pitch black, due to reversed normals (whose directions I manually checked with generous amounts of std::cout). I've confirmed this behavior with a classmate, Raymond Tang, who was able to reproduce the anomaly with his ray tracer. My workaround was to disregard the t value by altering line 774 to return q instead of q/t.

Other points(1)Submitting one or more images for the art contests
I wrote the script to generate a 50-frame sequence with varying camera locations and directions. I used the Beier-Neeley morph feature of Assignment 1 to morph the rendered scene into the nickel and photo images. The entire animation contains 100 distinct frames, each separated by 40 milliseconds.
 (1)Submitting one or more .ray files for the art contests
See monticello.ray, which was used to create the final three-quarter portrait frame of
 (?)Trace hundreds of thousands of triangles in few minutes with recursion depth 5
The provided buddha.ray file contains 318416 triangles and was traced in 113.64 seconds with recursion depth 5:
And finally...For your viewing pleasure