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.
Note that the four viewers share the same OpenGL context.
#include <QGLViewer/qglviewer.h> class Scene { public: void draw() const; }; class Viewer : public QGLViewer { public: Viewer(const Scene* const s, int type, QWidget* parent, const QGLWidget* shareWidget=NULL); protected : virtual void draw(); private: const Scene* const scene_; };
#include "multiView.h" using namespace qglviewer; using namespace std; Viewer::Viewer(const Scene* const s, int type, QWidget* parent, const QGLWidget* shareWidget) #if QT_VERSION < 0x040000 : QGLViewer(parent, "viewer", shareWidget), scene_(s) #else : QGLViewer(parent, shareWidget), scene_(s) #endif { setAxisIsDrawn(); setGridIsDrawn(); if (type < 3) { // Move camera according to viewer type (on X, Y or Z axis) camera()->setPosition(Vec((type==0)? 1.0 : 0.0, (type==1)? 1.0 : 0.0, (type==2)? 1.0 : 0.0)); camera()->lookAt(sceneCenter()); camera()->setType(Camera::ORTHOGRAPHIC); camera()->showEntireScene(); // Forbid rotation WorldConstraint* constraint = new WorldConstraint(); constraint->setRotationConstraintType(AxisPlaneConstraint::FORBIDDEN); camera()->frame()->setConstraint(constraint); } restoreStateFromFile(); } void Viewer::draw() { scene_->draw(); } // Draws a spiral void Scene::draw() const { const float nbSteps = 200.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(); }
#include "multiView.h" #include <qapplication.h> #include <qsplitter.h> int main(int argc, char** argv) { QApplication application(argc,argv); // Create Splitters QSplitter *hSplit = new QSplitter(Qt::Vertical); QSplitter *vSplit1 = new QSplitter(hSplit); QSplitter *vSplit2 = new QSplitter(hSplit); // Create the scene Scene* s = new Scene(); // Instantiate the viewers. Viewer side (s,0,vSplit1); Viewer top (s,1,vSplit1, &side); Viewer front (s,2,vSplit2, &side); Viewer persp (s,3,vSplit2, &side); #if QT_VERSION < 0x040000 application.setMainWidget(hSplit); #else hSplit->setWindowTitle("multiView"); #endif // Set main QSplitter as the main widget. hSplit->show(); return application.exec(); }
Back to the examples main page.