From $ROOTSYS/tutorials/gl/glViewerExercise.C

//script showing how to use the GL viewer API to animate a picture
//Author: Richard maunder

#include "TGLViewer.h"
#include "TGLOrthoCamera.h"
#include "TTimer.h"
#include "TRandom.h"
#include "TVirtualPad.h"

TGLViewer::ECameraType camera;
TTimer timer(25);
TRandom randGen(0);

Int_t moveCount = 0;

void AnimateCamera()
{
   // initialization
   static Double_t fov = 30;
   static Double_t zoom = 0.78;
   static Double_t dolly = 1500.0;
   static Double_t center[3] = {-164.0, -164.0, -180.0};
   static Double_t hRotate = 0.0;
   static Double_t vRotate = 0.0;
   // steps
   static Double_t fovStep = randGen.Rndm()*3.0 - 0.5;
   static Double_t zoomStep = (20 - randGen.Rndm())/1000.;
   static Double_t dollyStep = randGen.Rndm()*5.0 - 1.0;
   static Double_t centerStep[3] = {randGen.Rndm()*4, randGen.Rndm()*4,
                                    randGen.Rndm()*4 };
   static Double_t hRotateStep = randGen.Rndm()*0.025;
   static Double_t vRotateStep = randGen.Rndm()*0.05;

   // move center
   center[0] += centerStep[0];
   center[1] += centerStep[1];
   center[2] += centerStep[2];
   Double_t mag = TMath::Sqrt(center[0]*center[0] + center[1]*center[1] +
                              center[2]*center[2]);
   if(mag > 500)
   {
      centerStep[0] = -centerStep[0];
      centerStep[1] = -centerStep[1];
      centerStep[2] = -centerStep[2];
   }

   // rotate
   hRotate += hRotateStep;
   vRotate += vRotateStep;
   if (vRotate >= TMath::TwoPi() || vRotate <= 0.0)
      vRotateStep = -vRotateStep;

   if (hRotate >= (TMath::PiOver2()- 0.02f) ||
       hRotate <= (0.07f -TMath::PiOver2())) {
      hRotateStep = -hRotateStep;
   }

   // dolly
   dolly += dollyStep;
   if (dolly >= 2000.0 || dolly <= 1500.0)
      dollyStep = -dollyStep;

   // modify frustum
   TGLViewer * v = (TGLViewer *)gPad->GetViewer3D();
   if(camera < 3)
   {
      fov += fovStep;
      if (fov > 130.0 || fov < 5.0)
         fovStep = - fovStep; }
   else
   {
      zoom += zoomStep;
      if (zoom > 4.0 || zoom < 0.25)
         zoomStep = - zoomStep;
   }

   // apply
   if(camera < 3)
      v->SetPerspectiveCamera(camera, fov, dollyStep, center, hRotateStep,
                              vRotateStep);
   else
      v->SetOrthoCamera(camera, zoom, dollyStep, center, hRotateStep,
                        vRotateStep);

   if (++moveCount % 10 == 0)
      v->RefreshPadEditor(v);
}

void glViewerExercise()
{
   gROOT->ProcessLine(".x nucleus.C");
   TGLViewer * v = (TGLViewer *)gPad->GetViewer3D();

   // Random draw style
   Int_t style = randGen.Integer(3);
   switch (style)
   {
      case 0: v->SetStyle(TGLRnrCtx::kFill); break;
      case 1: v->SetStyle(TGLRnrCtx::kOutline); break;
      case 2: v->SetStyle(TGLRnrCtx::kWireFrame); break;
   }

   // Lights - turn some off randomly
   TGLLightSet* ls = v->GetLightSet();
   if (randGen.Integer(2) == 0)
      ls->SetLight(TGLLightSet::kLightLeft, kFALSE);
   if (randGen.Integer(2) == 0)
      ls->SetLight(TGLLightSet::kLightRight, kFALSE);
   if (randGen.Integer(2) == 0)
      ls->SetLight(TGLLightSet::kLightTop, kFALSE);
   if (randGen.Integer(2) == 0)
      ls->SetLight(TGLLightSet::kLightBottom, kFALSE);

   // Random camera type
   Int_t id = randGen.Integer(6);
   camera = (TGLViewer::ECameraType)id;
   v->SetCurrentCamera(camera);
   v->CurrentCamera().SetExternalCenter(kTRUE);
   if (id > 2) {
      //0, 1, and 2 - are different 'perspective' camers.
      TGLOrthoCamera& o = static_cast<TGLOrthoCamera &>(v->CurrentCamera());
      o.SetEnableRotate(kTRUE);
   }

   // Now animate the camera
   TGLSAViewer* sav = dynamic_cast<TGLSAViewer*>(v);
   if (sav)
     sav->GetFrame()->Connect("CloseWindow()", "TTimer", &timer, "TurnOff()");
   timer.SetCommand("AnimateCamera()");
   timer.TurnOn();
}


 glViewerExercise.C:1
 glViewerExercise.C:2
 glViewerExercise.C:3
 glViewerExercise.C:4
 glViewerExercise.C:5
 glViewerExercise.C:6
 glViewerExercise.C:7
 glViewerExercise.C:8
 glViewerExercise.C:9
 glViewerExercise.C:10
 glViewerExercise.C:11
 glViewerExercise.C:12
 glViewerExercise.C:13
 glViewerExercise.C:14
 glViewerExercise.C:15
 glViewerExercise.C:16
 glViewerExercise.C:17
 glViewerExercise.C:18
 glViewerExercise.C:19
 glViewerExercise.C:20
 glViewerExercise.C:21
 glViewerExercise.C:22
 glViewerExercise.C:23
 glViewerExercise.C:24
 glViewerExercise.C:25
 glViewerExercise.C:26
 glViewerExercise.C:27
 glViewerExercise.C:28
 glViewerExercise.C:29
 glViewerExercise.C:30
 glViewerExercise.C:31
 glViewerExercise.C:32
 glViewerExercise.C:33
 glViewerExercise.C:34
 glViewerExercise.C:35
 glViewerExercise.C:36
 glViewerExercise.C:37
 glViewerExercise.C:38
 glViewerExercise.C:39
 glViewerExercise.C:40
 glViewerExercise.C:41
 glViewerExercise.C:42
 glViewerExercise.C:43
 glViewerExercise.C:44
 glViewerExercise.C:45
 glViewerExercise.C:46
 glViewerExercise.C:47
 glViewerExercise.C:48
 glViewerExercise.C:49
 glViewerExercise.C:50
 glViewerExercise.C:51
 glViewerExercise.C:52
 glViewerExercise.C:53
 glViewerExercise.C:54
 glViewerExercise.C:55
 glViewerExercise.C:56
 glViewerExercise.C:57
 glViewerExercise.C:58
 glViewerExercise.C:59
 glViewerExercise.C:60
 glViewerExercise.C:61
 glViewerExercise.C:62
 glViewerExercise.C:63
 glViewerExercise.C:64
 glViewerExercise.C:65
 glViewerExercise.C:66
 glViewerExercise.C:67
 glViewerExercise.C:68
 glViewerExercise.C:69
 glViewerExercise.C:70
 glViewerExercise.C:71
 glViewerExercise.C:72
 glViewerExercise.C:73
 glViewerExercise.C:74
 glViewerExercise.C:75
 glViewerExercise.C:76
 glViewerExercise.C:77
 glViewerExercise.C:78
 glViewerExercise.C:79
 glViewerExercise.C:80
 glViewerExercise.C:81
 glViewerExercise.C:82
 glViewerExercise.C:83
 glViewerExercise.C:84
 glViewerExercise.C:85
 glViewerExercise.C:86
 glViewerExercise.C:87
 glViewerExercise.C:88
 glViewerExercise.C:89
 glViewerExercise.C:90
 glViewerExercise.C:91
 glViewerExercise.C:92
 glViewerExercise.C:93
 glViewerExercise.C:94
 glViewerExercise.C:95
 glViewerExercise.C:96
 glViewerExercise.C:97
 glViewerExercise.C:98
 glViewerExercise.C:99
 glViewerExercise.C:100
 glViewerExercise.C:101
 glViewerExercise.C:102
 glViewerExercise.C:103
 glViewerExercise.C:104
 glViewerExercise.C:105
 glViewerExercise.C:106
 glViewerExercise.C:107
 glViewerExercise.C:108
 glViewerExercise.C:109
 glViewerExercise.C:110
 glViewerExercise.C:111
 glViewerExercise.C:112
 glViewerExercise.C:113
 glViewerExercise.C:114
 glViewerExercise.C:115
 glViewerExercise.C:116
 glViewerExercise.C:117
 glViewerExercise.C:118
 glViewerExercise.C:119
 glViewerExercise.C:120
 glViewerExercise.C:121
 glViewerExercise.C:122
 glViewerExercise.C:123
 glViewerExercise.C:124
 glViewerExercise.C:125
 glViewerExercise.C:126
 glViewerExercise.C:127
 glViewerExercise.C:128
 glViewerExercise.C:129
 glViewerExercise.C:130
 glViewerExercise.C:131
 glViewerExercise.C:132
 glViewerExercise.C:133
 glViewerExercise.C:134