Welcome to Surreal! Surreal, as the name suggests, is a surrealistic scene of an art museum with moving objects, a slide show, a secret room, and a lot more. As we brainstormed, we came across ideas such as an ice-covered landscape, a lakeside landscape, and a room with a large window, but we finally decided to take the middle path between indoor and outdoor, with a bit of creativity to top it off. After two weeks of non-stop planning and programming, we finished the three scenes -- the museum, the outside, and the secret room -- and after another week, we finished the final touches on our animation. The animation consists of a girl walking through the museum and entering a secret room, but the scene could also be viewed using manual controls of the camera (see DETAILS for directions). Although we are quite happy with the outcome, we are not as satisfied with our code, as this was our first openGL program (in fact, it is a mess, but our second project is much cleaner!). Nevertheless, we hope that you enjoy our program!

The authors are Makiko Yasui and Dixon Koesdjojo
Please visit our second project, HAMS!
  Scene definitions:
1. A museum with three rooms.
2. An outdoor scene surrounding the museum.
3. A "secret" surreal scene.

Ground planes:
1. Museum floor.
2. Hills and green plane.
3. Street path.

Perspective projection is used in all three scenes.

Double buffering is used for all rendering.

Depth buffering is used to perform hidden surfaces.

Lighting and Shading:
- Lighting, we have ambient light for all three scenes and a spotlight for the "secret" surreal scene.
- Shading, we used all five types of materials defined in OpenGL for shading.

Texture Mapping:
We used a lot of texture mapping for the objects, we applied the different types of texturing (GL_REPLACE, GL_MODULATE, GL_BLEND) and also applied them to 3D shapes, i.e. spheres and nurbs.

Keyboard-and-Mouse-Based Camera motion
We implemented all posibilities of camera movement:
- Translating (Up-Down-Left-Right-Forward-Backward).
- Rotating (Horizontal-Vertical-Panning), not dependant on the main xyz axis.
- Zooming (In-Out).
- Mouse-based control for rotation.
- Camera reset.
- Camera information saving.
(To switch to manual camera controls, download the code, open Main.cpp, and change animationOn to false. The keyboard controls are listed in the readme file.)

Procedural Wireframe Model:
We built basic shapes wireframe model, including: boxes, cylinders, planes, rotating steps, from scratch without using the built-in primitives object. And computed all the normals for each planes of the objects created.

Object Animations:
- Girl animation: Walking, moving her arms, moving her legs, moving her head.
- Bouncing ball (reflection).
- Collision detection bouncing balls.
- Shadow clock.
- Fountain.
- Atoms orbit.

Scene Animation:
The scene animation was performed by positioning the camera based on time. And having four acting sequences for the girl.

Display Lists:
We used many display lists to optimize the overall performance.

We implemented two reflective planes, both reflect animated objects.

We implemented a shadow clock.

Multipass rendering:
We used stencil buffer to do multipass rendering for reflections and shadows.

Animated Textures:
We implemented a slideshows.

Curved Surfaces:
We implemented some NURBS surfaces, including the outdoor hills, the glass windows, and the roof tent.

We implemented occlusion culling. We divided the scenes into smaller areas and determined which objects to be rendered accordingly. And also, we computed whether or not certain objects are in the camera's view frustum.

Particle Effects:
We created a fountain with random flowing water particles. The particle system is configurable for different effects, i.e. we could have a rain simulation.

Collision Detection:
We created an aquarium with three moving balls with different direction vectors, when the ball hits the wall or another ball, it will rebound accoring to the physical properties.
  Entrance and Surreal - blah blah blah.

Three Balls and a Girl - Collision detection system, between each ball and the aquarium walls. It also has reflections.

Shiny Wooden Floor - Reflection on a plane using the stencil buffer (multipass rendering).

What Time Is It? - A floating clock to show shadows on a plane using the stencil buffer (multipass rendering).

Cool Sunroofs - Transparent curved surfaces using NURBS.

Water Fountain - Particle system to simulate a water fountain.

Trees and Hills - The use of curved surfaces (NURBS) and display lists.

Cinema Room - The use of time-based textures to perform slideshows.

The Other Side of the Board - blah blah blah.

The Cafe Terrace on the Place du Forum, Arles, at Night - The famous Van Gogh's painting.

Surreal - Showing the use of textured NURBS surface for the tent roof, display lists for the tables and chairs.

Sitting at the Cafe Terrace

Front View of the Cafe Terrace

From Above

  the code [Visual C++ 6]: Surreal_code.zip
the textures [needed to run the program]: Surreal_texture.zip
the executable: Surreal.exe
three-part [low fps] movie version of Surreal: Surreal_part1.avi / Surreal_part2.avi / Surreal_part3.avi
collision detection movie [low fps]: Surreal_collisiondetection.avi
the codec needed to play the movies: TSCC Codec version 2.0.4
Copyright 2003 Makiko Yasui and Dixon Koesdjojo. All rights reserved. No portion of Surreal website may be duplicated, redistributed or manipulated in any form.