Home Documentation Download Screenshots Developer

The multiView example

multiView

A multi-view application, with constrained camera displacements.

Four viewers are created, each displaying the same scene. The camera displacements are constrained for three of the viewers to create the classical top, front, side views. The last viewer is a classical 3D viewer.

multiView.h

#include "qglviewer.h"


class Scene
{
public:
  void draw() const;
};


class Viewer : public QGLViewer
{
public:
  Viewer(const Scene* const s, int type, QWidget* parent);
  
protected :
  void draw();

private:
  const Scene* const scene_; 
};

multiView.cpp

#include "multiView.h"

using namespace qglviewer;
using namespace std;

Viewer::Viewer(const Scene* const s, int type, QWidget* parent)
  : QGLViewer(parent), scene_(s)
{
  setDrawAxis();
  setDrawGrid();

  if (type < 3)
    {
      // Move camera according to viewer type (on X, Y or Z axis)
      camera()->setPosition((type==0)? 1.0 : 0.0, (type==1)? 1.0 : 0.0, (type==2)? 1.0 : 0.0);
      camera()->lookAt(sceneCenter());

      camera()->setType(Camera::ORTHO);
      camera()->showEntireScene();
      
      // Forbid rotation
      WorldConstraint* constraint = new WorldConstraint();
      constraint->setRotationConstraintType(AxisPlaneConstraint::FORBIDDEN);
      camera()->frame()->setConstraint(constraint);
    }
  restoreFromFile();
}

void Viewer::draw()
{
  scene_->draw();
}

// Draws a spiral
void Scene::draw() const
{
  const float nbSteps = 500.0;
  glBegin(GL_QUAD_STRIP);
  for (float i=0; i<nbSteps; ++i)
    {
      float ratio = i/nbSteps;
      float angle = 21.0*ratio;
      float c = cos(angle);
      float s = sin(angle);
      float r1 = 1.0 - 0.8*ratio;
      float r2 = 0.8 - 0.8*ratio;
      float alt = ratio - 0.5;
      const float nor = .5;
      const float up = sqrt(1.0-nor*nor);
      glColor3f(1-ratio, .2 , ratio);
      glNormal3f(nor*c, up, nor*s);
      glVertex3f(r1*c, alt, r1*s);
      glVertex3f(r2*c, alt+0.05, r2*s);
    }
  glEnd();
}

main.cpp

#include "multiView.h"
#include <qapplication.h>
#include <qsplitter.h>

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

  // Create the scene
  Scene* s = new Scene();

  // Create Splitters
  QSplitter *hSplit  = new QSplitter(Qt::Vertical);
  QSplitter *vSplit1 = new QSplitter(hSplit);
  QSplitter *vSplit2 = new QSplitter(hSplit);
  
  // Instantiate the viewers.
  Viewer side  (s,0,vSplit1);
  Viewer top   (s,1,vSplit1);
  Viewer front (s,2,vSplit2);
  Viewer viewer(s,3,vSplit2);
  
  // Set main QSplitter as the main widget.
  hSplit->show();
  hSplit->resize(640, 480);
  application.setMainWidget(hSplit);

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

Back to the main page

Valid XHTML 1.0! Valid CSS!