Loading [MathJax]/extensions/tex2jax.js
Logo ROOT  
Reference Guide
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
glViewerExercise.C File Reference

Detailed Description

Script showing how to use the GL viewer API to animate a picture.

#include "TGLViewer.h"
#include "TGLOrthoCamera.h"
#include "TTimer.h"
#include "TRandom.h"
#include "TVirtualPad.h"
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)
if (randGen.Integer(2) == 0)
if (randGen.Integer(2) == 0)
if (randGen.Integer(2) == 0)
// 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());
}
// Now animate the camera
TGLSAViewer* sav = dynamic_cast<TGLSAViewer*>(v);
if (sav)
sav->GetFrame()->Connect("CloseWindow()", "TTimer", &timer, "TurnOff()");
timer.SetCommand("AnimateCamera()");
timer.TurnOn();
}
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: RtypesCore.h:88
double Double_t
Definition: RtypesCore.h:55
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define gROOT
Definition: TROOT.h:415
#define gPad
Definition: TVirtualPad.h:286
Encapsulates a set of lights for OpenGL.
Definition: TGLLightSet.h:22
void SetLight(ELight light, Bool_t on)
Set a light on/off.
Definition: TGLLightSet.cxx:55
Orthographic projection camera.
void SetEnableRotate(Bool_t x)
@ kWireFrame
Definition: TGLRnrCtx.h:48
@ kOutline
Definition: TGLRnrCtx.h:47
The top level standalone GL-viewer - created via plugin manager.
Definition: TGLSAViewer.h:38
TGCompositeFrame * GetFrame() const
Return the main-frame.
Base GL viewer object - used by both standalone and embedded (in pad) GL.
Definition: TGLViewer.h:57
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
Non-static method is used to connect from the signal of this object to the receiver slot.
Definition: TQObject.cxx:867
This is the base class for the ROOT Random number generators.
Definition: TRandom.h:27
Handles synchronous and a-synchronous timer events.
Definition: TTimer.h:51
constexpr Double_t PiOver2()
Definition: TMath.h:52
Double_t Sqrt(Double_t x)
Definition: TMath.h:681
constexpr Double_t TwoPi()
Definition: TMath.h:45
TCanvas * style()
Definition: style.C:1
Author
Richard Maunder

Definition in file glViewerExercise.C.