//script showing how to use the GL viewer API to animate a picture //Author: Richard maunder #include "TGLViewer.h" #include "TGLPerspectiveCamera.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) { TGLOrthoCamera& o = 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 |
|