Home Documentation Download Examples Developer

# The simpleViewer example

The simplest application example: 20 lines of code and yet all the power !

A Viewer class is derived from QGLViewer and its `draw()` function is overloaded to specify the user defined OpenGL orders that describe the scene.

This is the first example you should try, as it explains some of the default keyboard shortcuts and the mouse behavior of the viewer.

This example can be cut and pasted to start the development of a new application.

## simpleViewer.h

    #include <QGLViewer/qglviewer.h>

    class Viewer : public QGLViewer
    {
    protected :
      virtual void draw();
      virtual void init();
      virtual QString helpString() const;
    };

## simpleViewer.cpp

    #include "simpleViewer.h"

    using namespace std;

    // Draws a spiral
    void Viewer::draw()
    {
      const float nbSteps = 200.0;

      glBegin(GL_QUAD_STRIP);
      for (int i=0; i<nbSteps; ++i)
        {
          const float ratio = i/nbSteps;
          const float angle = 21.0*ratio;
          const float c = cos(angle);
          const float s = sin(angle);
          const float r1 = 1.0 - 0.8f*ratio;
          const float r2 = 0.8f - 0.8f*ratio;
          const float alt = ratio - 0.5f;
          const float nor = 0.5f;
          const float up = sqrt(1.0-nor*nor);
          glColor3f(1.0-ratio, 0.2f , ratio);
          glNormal3f(nor*c, up, nor*s);
          glVertex3f(r1*c, alt, r1*s);
          glVertex3f(r2*c, alt+0.05f, r2*s);
        }
      glEnd();
    }

    void Viewer::init()
    {
      // Restore previous viewer state.
      restoreStateFromFile();

      // Opens help window
      help();
    }

    QString Viewer::helpString() const
    {
      QString text("<h2>S i m p l e V i e w e r</h2>");
      text += "Use the mouse to move the camera around the object. ";
      text += "You can respectively revolve around, zoom and translate with the three mouse buttons. ";
      text += "Left and middle buttons pressed together rotate around the camera view direction axis<br><br>";
      text += "Pressing <b>Alt</b> and one of the function keys (<b>F1</b>..<b>F12</b>) defines a camera keyFrame. ";
      text += "Simply press the function key again to restore it. Several keyFrames define a ";
      text += "camera path. Paths are saved when you quit the application and restored at next start.<br><br>";
      text += "Press <b>F</b> to display the frame rate, <b>A</b> for the world axis, ";
      text += "<b>Alt+Return</b> for full screen mode and <b>Control+S</b> to save a snapshot. ";
      text += "See the <b>Keyboard</b> tab in this window for a complete shortcut list.<br><br>";
      text += "Double clicks automates single click actions: A left button double click aligns the closer axis with the camera (if close enough). ";
      text += "A middle button double click fits the zoom of the camera and the right button re-centers the scene.<br><br>";
      text += "A left button double click while holding right button pressed defines the camera <i>Revolve Around Point</i>. ";
      text += "See the <b>Mouse</b> tab and the documentation web pages for details.<br><br>";
      text += "Press <b>Escape</b> to exit the viewer.";
      return text;
    }

## main.cpp

    #include "simpleViewer.h"
    #include <qapplication.h>

    int main(int argc, char** argv)
    {
      // Read command lines arguments.
      QApplication application(argc,argv);

      // Instantiate the viewer.
      Viewer viewer;

    #if QT_VERSION < 0x040000
      // Set the viewer as the application main widget.
      application.setMainWidget(&viewer);
    #else
      viewer.setWindowTitle("simpleViewer");
    #endif

      // Make the viewer window visible on screen.
      viewer.show();

      // Run main loop.
      return application.exec();
    }

Back to the examples main page.

Last modified on Sunday, February 28, 2010.