| Home | Documentation | Download | Screenshots | Developer |
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.
#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_;
};
#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();
}
#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