Animation.cpp

Go to the documentation of this file.
00001 
00010 #ifdef MT_OPENMP
00011 #include <omp.h>
00012 #endif
00013 
00017 #include <sstream>
00018 #include <iostream>
00019 
00023 #include "Image.h"
00024 
00028 #include "Object.h"
00029 #include "Scene.h"
00030 #include "Sphere.h"
00031 
00035 #include "PerspectiveCamera.h"
00036 #include "CylindricCamera.h"
00037 #include "DepthOfFieldCamera.h"
00038 
00042 #include "PointLight.h"
00043 #include "QuadAreaLight.h"
00044 
00048 #include "Texture2D.h"
00049 #include "FlatShader.h"
00050 #include "DebugShader.h"
00051 #include "EdgeShader.h"
00052 #include "FlatTransparentShader.h"
00053 #include "MirrorShader.h"
00054 #include "EyeLightShader.h"
00055 #include "PhongShader.h"
00056 #include "CloudShader.h"
00057 #include "PlasmaShader.h"
00058 #include "MarbleShader.h"
00059 #include "BumpMappedDebugShader.h"
00060 #include "BumpMappedPhongShader.h"
00061 #include "BumpMappedMarblePhongShader.h"
00062 #include "TransparentShader.h"
00063 #include "UniAxialCrystalShader.h"
00064 #include "MixShader.h"
00065 #include "MapShader.h"
00066 #include "WoodShader.h"
00067 #include "BumpMappedWoodPhongShader.h"
00068 #include "GoldShader.h"
00069 #include "SilverShader.h"
00070 #include "SteelShader.h"
00071 #include "CopperShader.h"
00072 
00076 #include "SampleGenerator.h"
00077 #include "RegularSampleGenerator.h"
00078 #include "RandomSampleGenerator.h"
00079 #include "StratifiedSampleGenerator.h"
00080 #include "PoissonDiskSampleGenerator.h"
00081 
00082 using namespace std;
00083 
00097 Object* AddObject(char* fileName, Scene& scene, bool useAcc = true, const Object::PrimitiveFactory& factory = Object::TriangleFactory() )
00098 {
00099     Object* obj = new Object(useAcc);
00100     obj->ParseOBJ(fileName, factory);
00101     obj->setColor(ColorRGBA(1,1,1));
00102     obj->BuildAccelStructure();
00103 
00104     scene.AddObject(obj);
00105 
00106     return obj;
00107 }
00108 
00117 Object* AddSphere(Sphere* sphere, Scene& scene, bool useAcc = true)
00118 {
00119     Object* obj = new Object(useAcc);
00120     obj->Add(sphere);
00121     obj->setColor(Vector3D(1,1,1));
00122     obj->BuildAccelStructure();
00123 
00124     scene.AddObject(obj);
00125 
00126     return obj;
00127 }
00128 
00144 void RenderFrame (Scene* scene, string prefix,
00145                   Vector3D pos, Vector3D dir, float angle,
00146                   int resX, int resY) 
00147 {
00148     // compute filename
00149     stringstream s;
00150     s << prefix << scene->timer.GetTime() << ".png";
00151 
00152     // print some debug info
00153     printf("render %s (%dx%d)\n", s.str().c_str(), resX, resY);
00154 
00155     // setup image
00156     Image img(resX, resY);
00157 
00158     // setup camera
00159     PerspectiveCamera camera(pos, dir, Vector3D(0,1,0), angle, resX, resY);
00160 
00161 #ifdef MT_OPENMP
00162 #pragma omp parallel
00163 {
00164 #pragma omp for schedule(dynamic) nowait
00165 #endif
00166 
00167     // now render the scene
00168     for (int y=0; y < resY; y++) {
00169     for (int x=0; x < resX; x++) {
00170         // primary ray to trace
00171         Ray ray = camera.InitRay(x, y);
00172 
00173         // ray trace one pixel 
00174             ColorRGBA color = scene->RayTrace(ray);
00175             color.normalize();
00176             img.setPixel(color, x, y);
00177     }
00178     }
00179 
00180 #ifdef MT_OPENMP
00181 }
00182 #endif
00183 
00184     // write final image
00185     img.WritePNG(s.str().c_str());
00186 }
00187 
00206 void RenderSupersampledFrame(Scene* scene, string prefix, 
00207                              Vector3D pos, Vector3D dir, float angle,
00208                              int resX, int resY, 
00209                              const SampleGenerator& sampler = SampleGenerator(), int sampleCount = 1)
00210 {    
00211     // compute filename
00212     stringstream s;
00213     s << prefix << scene->timer.GetTime() << ".png";
00214 
00215     // print some debug info
00216     printf("render supersampled %s (%dx%d)\n", s.str().c_str(), resX, resY);
00217 
00218     // setup image
00219     Image img(resX, resY);
00220 
00221     // setup camera
00222     PerspectiveCamera camera(pos, dir, Vector3D(0,1,0), angle, resX, resY);
00223 
00224 #ifdef MT_OPENMP
00225 #pragma omp parallel
00226 {
00227 #endif
00228 
00229     // prepare for supersampling 
00230     float* xv = new float[sampleCount];
00231     float* yv = new float[sampleCount];
00232     float* weight = new float[sampleCount];
00233 
00234 #ifdef MT_OPENMP
00235 #pragma omp for schedule(dynamic) nowait
00236 #endif
00237 
00238 // now render the scene
00239     for (int y=0; y < resY; y++) {
00240     for (int x=0; x < resX; x++) {
00241         ColorRGBA color(0,0,0);
00242         sampler.GetSamples(sampleCount, xv, yv, weight);
00243         for (int s=0; s < sampleCount; s++) {
00244             // primary ray to trace
00245         Ray ray = camera.InitRay(x + xv[s], y + yv[s]);
00246 
00247         // ray trace one pixel (supersampled)
00248         color = color + weight[s] * scene->RayTrace(ray);
00249         }
00250         color.normalize(); 
00251         img.setPixel(color, x, y);
00252     }
00253     }
00254 
00255     // cleanup
00256     delete [] xv;
00257     delete [] yv;
00258     delete [] weight;
00259 
00260 #ifdef MT_OPENMP
00261 }
00262 #endif
00263 
00264     // write final image
00265     img.WritePNG(s.str().c_str());
00266 }
00267 
00287 void RenderDepthOfFieldFrame(Scene* scene, string prefix, 
00288                              Vector3D pos, Vector3D dir, float angle,
00289                              int resX, int resY, 
00290                              float lensRadius, float focalDistance,
00291                              const SampleGenerator& sampler = SampleGenerator(), int sampleCount = 1)
00292 {    
00293     // compute filename
00294     stringstream s;
00295     s << prefix << scene->timer.GetTime() << ".png";
00296 
00297     // print some debug info
00298     printf("render %s (%dx%d)\n", s.str().c_str(), resX, resY);
00299 
00300     // setup image
00301     Image img(resX, resY);
00302 
00303 #ifdef MT_OPENMP
00304 #pragma omp parallel
00305 {
00306 #endif
00307 
00308     // prepare for supersampling 
00309     float* xv = new float[sampleCount];
00310     float* yv = new float[sampleCount];
00311     float* weight = new float[sampleCount];
00312 
00313 #ifdef MT_OPENMP
00314 #pragma omp for schedule(dynamic) nowait
00315 #endif
00316 
00317     // now render the scene
00318     for (int y=0; y < resY; y++) {
00319     for (int x=0; x < resX; x++) {
00320         ColorRGBA color(0,0,0);
00321         sampler.GetSamples(sampleCount, xv, yv, weight);
00322         for (int s=0; s < sampleCount; s++) {
00323                 // setup camera
00324                 DepthOfFieldCamera camera(pos, dir, Vector3D(0,1,0), angle, resX, resY, lensRadius, focalDistance, xv[s], yv[s]);
00325 
00326             // primary ray to trace
00327         Ray ray = camera.InitRay(x, y);
00328 
00329         // ray trace one pixel (supersampled)
00330         color = color + weight[s] * scene->RayTrace(ray);
00331         }
00332         color.normalize(); 
00333         img.setPixel(color, x, y);
00334     }
00335     }
00336 
00337     // cleanup
00338     delete [] xv;
00339     delete [] yv;
00340     delete [] weight;
00341 
00342 #ifdef MT_OPENMP
00343 }
00344 #endif
00345 
00346     // write final image
00347     img.WritePNG(s.str().c_str());
00348 }
00349 
00350 
00365 void RenderLinearFramePath (Scene* scene, string prefix,
00366                             Vector3D pos, Vector3D dir, float angle,
00367                             int resX, int resY, 
00368                             Vector3D path, int times)
00369 {
00370     // setup image
00371     Image img(resX, resY);
00372 
00373     for (int i=0; i < times; i++) {
00374         // compute filename
00375         stringstream s;
00376         s << prefix << scene->timer.GetTime() << ".png";
00377 
00378         // print some debug info
00379         printf("render %s (%dx%d)\n", s.str().c_str(), resX, resY);
00380 
00381         // setup camera
00382         PerspectiveCamera camera(pos + i * path, dir, Vector3D(0,1,0), angle, resX, resY);
00383 
00384 #ifdef MT_OPENMP
00385 #pragma omp parallel
00386 {
00387 #pragma omp for schedule(dynamic) nowait
00388 #endif
00389 
00390         // now render the scene
00391         for (int y=0; y < resY; y++) {
00392         for (int x=0; x < resX; x++) {
00393             // primary ray to trace
00394                 Ray ray = camera.InitRay(x, y);
00395     
00396             // ray trace one pixel 
00397                 ColorRGBA color = scene->RayTrace(ray);
00398                 color.normalize();
00399                 img.setPixel(color, x, y);
00400             }
00401         }
00402 
00403 #ifdef MT_OPENMP
00404 }
00405 #endif
00406 
00407     // write final image
00408     img.WritePNG(s.str().c_str());
00409     
00410     // next tick
00411     scene->timer.Tick();
00412     }
00413 }
00414     
00428 void RenderStereoFrame (Scene* scene, string prefix,
00429                         Vector3D pos, Vector3D dir, float angle,
00430                         int resX, int resY,
00431                         float distance = 0.01f) 
00432 {
00433     // compute filename
00434     stringstream s;
00435     s << prefix << scene->timer.GetTime() << ".png";
00436 
00437     // print some debug info
00438     printf("render %s (%dx%d)\n", s.str().c_str(), resX, resY);
00439 
00440     // setup image
00441     Image img(resX, resY);
00442 
00443     // setup cameras
00444     Vector3D greenpos = pos + Vector3D(distance,0,0);
00445     Vector3D greendir = (pos + dir) - greenpos;
00446     PerspectiveCamera red(pos, dir, Vector3D(0,1,0), angle, resX, resY);
00447     PerspectiveCamera green(greenpos, greendir, Vector3D(0,1,0), angle, resX, resY);
00448     
00449 #ifdef MT_OPENMP
00450 #pragma omp parallel
00451 {
00452 #pragma omp for schedule(dynamic) nowait
00453 #endif
00454 
00455     // now render the scene
00456     for (int y=0; y < resY; y++) {
00457     for (int x=0; x < resX; x++) {
00458         // primary ray to trace
00459         Ray redray = red.InitRay(x, y);
00460         Ray greenray = green.InitRay(x, y);
00461         
00462             // ray trace one pixel 
00463             ColorRGBA color;
00464             color.red() = scene->RayTrace(redray).average();
00465             color.green() = scene->RayTrace(greenray).average();
00466             color.normalize();
00467             img.setPixel(color, x, y);
00468     }
00469     }
00470                          
00471 #ifdef MT_OPENMP
00472 }
00473 #endif
00474 
00475     // write final image
00476     img.WritePNG(s.str().c_str());
00477 }
00478 
00487 void moveSphere(Sphere* sphere, float deltaRadius, float rotAngle, Vector3D posOffset)
00488 {
00489     rotAngle *= M_PI / 180;
00490     sphere->ChangeRadius(deltaRadius);
00491     Vector3D pos = sphere->GetPosition();
00492     sphere->SetPosition(Vector3D(posOffset.x() + (cos(rotAngle)*pos.x() + sin(rotAngle)*pos.z()), posOffset.y() + pos.y(), posOffset.z() + (-sin(rotAngle)*pos.x() + cos(rotAngle)*pos.z())));
00493 }
00494 
00502 Vector3D rotateVec(Vector3D vec, float rotAngle)
00503 {
00504     rotAngle *= M_PI / 180;
00505     return Vector3D((cos(rotAngle)*vec.x() + sin(rotAngle)*vec.z()), vec.y(), (-sin(rotAngle)*vec.x() + cos(rotAngle)*vec.z()));
00506 }
00507 
00513 void hideSphere(Sphere* sphere)
00514 {
00515     sphere->SetRadius(0.0);
00516 }
00517  
00518 #define USE_KDTREE 1
00519 
00531 int main(int argc, char **argv)
00532 {
00533     int toFrame=-1;
00534     int fromFrame=-1;
00535     int resX = 800;
00536     int resY = 600;
00537     int numSamples = 9;
00538     SampleGenerator* sampler = 0;
00539     
00540     if (argc > 4) 
00541     {
00542     fromFrame = atoi(argv[1]);
00543     toFrame = atoi(argv[2]);
00544     resX = atoi(argv[3]);
00545     resY = atoi(argv[4]);
00546         
00547         if (argc >= 7) 
00548         {
00549             if (strcmp(argv[5],"-super") == 0)
00550             {
00551                 if (strcmp(argv[6],"stratified") == 0)
00552                     sampler = new StratifiedSampleGenerator();
00553                 else if (strcmp(argv[6],"random") == 0)
00554                     sampler = new RandomSampleGenerator();
00555                 else if (strcmp(argv[6],"regular") == 0)
00556                     sampler = new RegularSampleGenerator();
00557                 else if (strcmp(argv[6],"poisson") == 0)
00558                     sampler = new PoissonDiskSampleGenerator();
00559             }
00560             
00561             if (argc == 8)
00562                 numSamples = atoi(argv[7]);
00563         }
00564     }
00565     else 
00566     {
00567         std::cout << "Usage: ./Animation fromFrame toFrame ResX ResY [-super (stratified|random|regular|poisson)]" << std::endl ;
00568         exit(0);
00569     }
00570 
00571     
00572     if ((toFrame < 0) || (fromFrame < 0))
00573     {
00574         std::cout << "Usage: ./Animation fromFrame toFrame ResX ResY [-super (stratified|random|regular|poisson)]" << std::endl ;
00575         exit(0);
00576     }
00577     
00578     // setup default scene 
00579     Scene* scene = new Scene();
00580     scene->setBgColor(Vector3D(0.5,0.5,0.5));
00581 
00582     QuadAreaLight* light1 = new QuadAreaLight(Vector3D(200.0,200.0,200.0), Vector3D(3, 3, 3), Vector3D(0.5,0,0.5), Vector3D(0,0.2,0.5));
00583     light1->SetNumberOfRays(16);
00584     scene->AddLight(light1);
00585     QuadAreaLight* light2 = new QuadAreaLight(Vector3D(100.0,100.0,100.0), Vector3D(-3, 3, -4), Vector3D(0.5,0,0.5), Vector3D(0,0.2,0.5));
00586     light2->SetNumberOfRays(16);
00587     scene->AddLight(light2);
00588     PointLight* light3 = new PointLight(Vector3D(0,5,5), ColorRGBA(0,0,0));
00589     scene->AddLight(light3);
00590     scene->castShadows = true;
00591     
00592 
00593     // Ground
00594     Object* ground = AddObject("../objs/ground3.obj", *scene, USE_KDTREE, Object::TexturedSmoothTriangleFactory()); 
00595     Texture* bumptex = new Texture2D("textures/bump.png");
00596     bumptex->setWrapMode(Texture::REPEAT); 
00597     bumptex->setInterpolationMode(Texture::LINEAR); 
00598     Shader* groundshader = new BumpMappedMarblePhongShader(scene, ColorRGBA (0.8,0.8,0.85), 0, 1, 0, 5, bumptex, 0, Vector3D(0,0,0));
00599     ground->setShader(groundshader); 
00600 
00601 
00602     // Skydome
00603     Object* skydome = AddObject("../objs/skydome3.obj", *scene, USE_KDTREE, Object::TexturedSmoothTriangleFactory());
00604     Shader* skyShader = new CloudShader(scene);   
00605     skydome->setShader(skyShader);
00606 
00607     // disco
00608     Sphere* dSphere = new Sphere(Vector3D(0,2,0), 0.4);
00609     Object* disco = AddSphere(dSphere, *scene, false);
00610     Shader* discoShader = new SteelShader(scene);
00611     disco->setShader(discoShader);
00612 
00613     // Jonas
00614     Object* jonas = AddObject("../objs/jonas2.obj", *scene, USE_KDTREE, Object::TexturedSmoothTriangleFactory());
00615     Shader* jonasShader = new BumpMappedMarblePhongShader(scene, ColorRGBA (0.9,0.9,1), 0, 1, 0, 0.5, bumptex, -0.7, Vector3D(0,0,0));
00616     jonas->setShader(jonasShader);
00617     jonas->setVisible(false);
00618     // Simon
00619     Object* simon = AddObject("../objs/simon2.obj", *scene, USE_KDTREE, Object::TexturedSmoothTriangleFactory());
00620     Shader* simonShader = new BumpMappedWoodPhongShader(scene, ColorRGBA(0.9,0.9,1), 0, 1, 0, 0.5, bumptex, 0, Vector3D(0,0,0));
00621     simon->setShader(simonShader);
00622     simon->setVisible(false);
00623 
00624     // first four spheres on the ground
00625     Sphere * sphere1 = new Sphere(Vector3D(1.5,0.3,0), 0);
00626     Sphere * sphere2 = new Sphere(Vector3D(-1.5,0.3,0), 0);
00627     Sphere * sphere3 = new Sphere(Vector3D(0,0.3,1.5), 0);
00628     Sphere * sphere4 = new Sphere(Vector3D(0,0.3,-1.5), 0);
00629     // second four spheres near the disco :)
00630     Sphere * sphere5 = new Sphere(Vector3D(0.75, 1.8,0), 0);
00631     Sphere * sphere6 = new Sphere(Vector3D(-0.75, 1.8,0), 0);
00632     Sphere * sphere7 = new Sphere(Vector3D(0, 1.8,0.75), 0);
00633     Sphere * sphere8 = new Sphere(Vector3D(0, 1.8,-0.75), 0);
00634 
00635     Object* objectSphere1 = AddSphere(sphere1, *scene, false);
00636     Object* objectSphere2 = AddSphere(sphere2, *scene, false);
00637     Object* objectSphere3 = AddSphere(sphere3, *scene, false);
00638     Object* objectSphere4 = AddSphere(sphere4, *scene, false);
00639     Object* objectSphere5 = AddSphere(sphere5, *scene, false);
00640     Object* objectSphere6 = AddSphere(sphere6, *scene, false);
00641     Object* objectSphere7 = AddSphere(sphere7, *scene, false);
00642     Object* objectSphere8 = AddSphere(sphere8, *scene, false);
00643 
00644     Shader* sphereShader1 = new TransparentShader(scene,1,1.5);
00645     objectSphere1->setShader(sphereShader1);
00646     objectSphere2->setShader(sphereShader1);
00647     objectSphere3->setShader(sphereShader1);
00648     objectSphere4->setShader(sphereShader1);
00649     Shader* sphereShader2 = new SilverShader(scene);
00650     objectSphere5->setShader(sphereShader2);
00651     objectSphere6->setShader(sphereShader2);
00652     Shader* sphereShader3 = new CopperShader(scene);
00653     objectSphere7->setShader(sphereShader3);
00654     objectSphere8->setShader(sphereShader3);
00655 
00656 
00657     float angle = 2;
00658     angle *= M_PI / 180;
00659     float trans_fac = 0.007;
00660     float z=0;
00661     
00662     Vector3D camera_pos(0,2,17);
00663     Vector3D camera_dir(0,-2,-17);
00664     
00665     int tmp_i = 0;
00666     Vector3D tmp_v = Vector3D(0,0,0.005); 
00667 
00668     for (int i = 0; i < toFrame; ++i) 
00669     {
00670         // only render the frames [fromFrame, toFrame]!
00671         if ( i >= fromFrame)
00672         {
00673             if (sampler == 0) {
00674                 RenderFrame(scene, "../result/result", camera_pos, camera_dir, 70, resX, resY);
00675             } 
00676             else 
00677             {   
00678                 RenderSupersampledFrame(scene, "../result/result", camera_pos, camera_dir, 70, resX, resY, *sampler, numSamples);
00679             }
00680         }
00681         // increment the timer
00682         scene->timer.Tick();    
00683             
00684 
00687         // The movement in the scene
00688         //
00689         // From frame 0 to 100 the camera moves in the empty scene
00690         if (i < 71) 
00691         {
00692             camera_pos += Vector3D(0,0,-0.15);
00693             camera_dir = - camera_pos;
00694         }
00695 
00696         if (i < 100 && i >= 71)
00697         {
00698             tmp_i++;
00699             camera_pos += Vector3D(0,0,-0.15) + tmp_i * tmp_v;
00700             camera_dir = - camera_pos;
00701         }
00702 
00703         // From frame 100 to 460 the spheres appear and start moving
00704         if ((i >= 100) && (i < 460))
00705         {
00706             int t = i-100;
00707             if ( t < 90)
00708             {
00709                 moveSphere(sphere1, 0.002777, 2, Vector3D(0,0,0));
00710                 moveSphere(sphere2, 0.002777, 2, Vector3D(0,0,0));
00711                 moveSphere(sphere3, 0.002777, 2, Vector3D(0,0,0));
00712                 moveSphere(sphere4, 0.002777, 2, Vector3D(0,0,0));
00713             } 
00714             else if ( t < 180)
00715             {
00716                 moveSphere(sphere1, 0.0, 2, Vector3D(0,0.002,0));
00717                 moveSphere(sphere2, 0.0, 2, Vector3D(0,0.002,0));
00718                 moveSphere(sphere3, 0.0, 2, Vector3D(0,0.002,0));
00719                 moveSphere(sphere4, 0.0, 2, Vector3D(0,0.002,0));
00720                 
00721                 moveSphere(sphere5, 0.001666, 4, Vector3D(0,-0.017, 0));
00722                 moveSphere(sphere6, 0.001666, 4, Vector3D(0,-0.017, 0));
00723                 moveSphere(sphere7, 0.001666, 4, Vector3D(0,-0.017, 0));
00724                 moveSphere(sphere8, 0.001666, 4, Vector3D(0,-0.017, 0));
00725             }
00726             else if ( t < 270)
00727             {
00728                 light3->changeIllumination(0.007*(float)(t-180));
00729                 moveSphere(sphere1, 0.0, 2, Vector3D(0,0.002,0));
00730                 moveSphere(sphere2, 0.0, 2, Vector3D(0,0.002,0));
00731                 moveSphere(sphere3, 0.0, 2, Vector3D(0,0.002,0));
00732                 moveSphere(sphere4, 0.0, 2, Vector3D(0,0.002,0));
00733                 
00734                 moveSphere(sphere5, -0.001666, 4, Vector3D(0,0.017, 0));
00735                 moveSphere(sphere6, -0.001666, 4, Vector3D(0,0.017, 0));
00736                 moveSphere(sphere7, -0.001666, 4, Vector3D(0,0.017, 0));
00737                 moveSphere(sphere8, -0.001666, 4, Vector3D(0,0.017, 0));
00738             }
00739             else 
00740             {
00741                 moveSphere(sphere1, 0.0, 2, Vector3D(0,0.002,0));
00742                 moveSphere(sphere2, 0.0, 2, Vector3D(0,0.002,0));
00743                 moveSphere(sphere3, 0.0, 2, Vector3D(0,0.002,0));
00744                 moveSphere(sphere4, 0.0, 2, Vector3D(0,0.002,0));
00745                 
00746                 moveSphere(sphere5, 0.001666, 4, Vector3D(0,-0.017, 0));
00747                 moveSphere(sphere6, 0.001666, 4, Vector3D(0,-0.017, 0));
00748                 moveSphere(sphere7, 0.001666, 4, Vector3D(0,-0.017, 0));
00749                 moveSphere(sphere8, 0.001666, 4, Vector3D(0,-0.017, 0));
00750             }
00751         }
00752         // From frame 460 to 820 the spheres keep movin' and simon and jonas appear in the middle.
00753         if ((i >= 460) && (i < 820))
00754         {
00755             
00756             jonas->setVisible(true);
00757             simon->setVisible(true);
00758         
00759         
00760             int t = i-460;
00761             if ( t < 90)
00762             {
00763                 moveSphere(sphere1, 0.0, 2, Vector3D(0,0,0));
00764                 moveSphere(sphere2, 0.0, 2, Vector3D(0,0,0));
00765                 moveSphere(sphere3, 0.0, 2, Vector3D(0,0,0));
00766                 moveSphere(sphere4, 0.0, 2, Vector3D(0,0,0));
00767 
00768                 moveSphere(sphere5, -0.001666, 4, Vector3D(0,0.017, 0));
00769                 moveSphere(sphere6, -0.001666, 4, Vector3D(0,0.017, 0));
00770                 moveSphere(sphere7, -0.001666, 4, Vector3D(0,0.017, 0));
00771                 moveSphere(sphere8, -0.001666, 4, Vector3D(0,0.017, 0));
00772             } 
00773             else if ( t < 180)
00774             {
00775                 moveSphere(sphere1, 0.0, 2, Vector3D(0,-0.002,0));
00776                 moveSphere(sphere2, 0.0, 2, Vector3D(0,-0.002,0));
00777                 moveSphere(sphere3, 0.0, 2, Vector3D(0,-0.002,0));
00778                 moveSphere(sphere4, 0.0, 2, Vector3D(0,-0.002,0));
00779                 
00780                 moveSphere(sphere5, 0.001666, 4, Vector3D(0,-0.017, 0));
00781                 moveSphere(sphere6, 0.001666, 4, Vector3D(0,-0.017, 0));
00782                 moveSphere(sphere7, 0.001666, 4, Vector3D(0,-0.017, 0));
00783                 moveSphere(sphere8, 0.001666, 4, Vector3D(0,-0.017, 0));
00784             }
00785             else if ( t < 270)
00786             {
00787                 moveSphere(sphere1, 0.0, 2, Vector3D(0,-0.002,0));
00788                 moveSphere(sphere2, 0.0, 2, Vector3D(0,-0.002,0));
00789                 moveSphere(sphere3, 0.0, 2, Vector3D(0,-0.002,0));
00790                 moveSphere(sphere4, 0.0, 2, Vector3D(0,-0.002,0));
00791                 
00792                 moveSphere(sphere5, -0.001666, 4, Vector3D(0,0.017, 0));
00793                 moveSphere(sphere6, -0.001666, 4, Vector3D(0,0.017, 0));
00794                 moveSphere(sphere7, -0.001666, 4, Vector3D(0,0.017, 0));
00795                 moveSphere(sphere8, -0.001666, 4, Vector3D(0,0.017, 0));
00796             }
00797             else 
00798             {
00799                 moveSphere(sphere1, 0.0, 2, Vector3D(0,-0.002,0));
00800                 moveSphere(sphere2, 0.0, 2, Vector3D(0,-0.002,0));
00801                 moveSphere(sphere3, 0.0, 2, Vector3D(0,-0.002,0));
00802                 moveSphere(sphere4, 0.0, 2, Vector3D(0,-0.002,0));
00803                 
00804                 moveSphere(sphere5, 0.001666, 4, Vector3D(0,-0.017, 0));
00805                 moveSphere(sphere6, 0.001666, 4, Vector3D(0,-0.017, 0));
00806                 moveSphere(sphere7, 0.001666, 4, Vector3D(0,-0.017, 0));
00807                 moveSphere(sphere8, 0.001666, 4, Vector3D(0,-0.017, 0));
00808             }
00809             
00810         }
00811         // From frame 820 to 1200 the camera screws around us ;) and the spheres disappear...
00812         if ((i >= 820) && (i < 1200))
00813         {
00814             int t = i-820;
00815             if ( t < 90)
00816             {
00817                 moveSphere(sphere1, -0.002777, 2, Vector3D(0,0,0));
00818                 moveSphere(sphere2, -0.002777, 2, Vector3D(0,0,0));
00819                 moveSphere(sphere3, -0.002777, 2, Vector3D(0,0,0));
00820                 moveSphere(sphere4, -0.002777, 2, Vector3D(0,0,0));
00821 
00822                 moveSphere(sphere5, -0.001666, 4, Vector3D(0,0.0, 0));
00823                 moveSphere(sphere6, -0.001666, 4, Vector3D(0,0.0, 0));
00824                 moveSphere(sphere7, -0.001666, 4, Vector3D(0,0.0, 0));
00825                 moveSphere(sphere8, -0.001666, 4, Vector3D(0,0.0, 0));
00826             } 
00827             
00828             if (i < 1000) {
00829             
00830                 camera_pos = 0.995*rotateVec(camera_pos, 1);
00831                 camera_dir = -camera_pos;
00832             } 
00833             else
00834             {
00835                 camera_pos = rotateVec(camera_pos, 1);
00836                 camera_dir = -camera_pos;
00837             }
00838         }
00841 
00842     }
00843 
00844     delete skyShader;
00845     delete discoShader;
00846     delete jonasShader;
00847     delete simonShader;
00848     delete sphereShader1;
00849     delete sphereShader2;
00850     delete sphereShader3;
00851     
00852     delete bumptex;
00853     delete groundshader;
00854     
00855     // beep if finished correctly
00856     std::cout << "\a\a\a\a\a" << std::endl;
00857 
00858 }
00859 

Generated on Thu Jan 31 21:48:48 2008 for RayTracer by  doxygen 1.5.4