// This code example is created for educational purpose // by Thorsten Thormaehlen (contact: www.thormae.de). // It is distributed without any warranty. #include #include #include #include #include #include class Renderer : protected QOpenGLFunctions_2_0{ public: float t; public: Renderer() : t(0.0) {} public: void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // camera orbits in the y=10 plane // and looks at origin double rad = M_PI / 180.0f * t; gluLookAt(10.0*cos(rad), 10.0 , 10.0*sin(rad), // eye 0.0, 0.0, 0.0, // look at 0.0, 1.0, 0.0); // up //draw model at origin //drawCube(); drawCubeHierarchy(0, 4); } void init() { initializeOpenGLFunctions(); glEnable(GL_DEPTH_TEST); } void resize(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective (30.0, (float)w/(float)h, 2.0, 20.0); } void dispose() { } private: void drawCube() { glColor3f(1.0,0.0,0.0); glBegin(GL_POLYGON); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glEnd(); glColor3f(0.0,1.0,0.0); glBegin(GL_POLYGON); glVertex3f( 1.0f, 1.0f,-1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glEnd(); glColor3f(0.0,0.0,1.0); glBegin(GL_POLYGON); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); glEnd(); glColor3f(1.0,1.0,0.0); glBegin(GL_POLYGON); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glEnd(); glColor3f(1.0,1.0,1.0); glBegin(GL_POLYGON); glVertex3f( 1.0f, 1.0f,-1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glEnd(); glColor3f(0.0,1.0,1.0); glBegin(GL_POLYGON); glVertex3f( 1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f,-1.0f); glVertex3f( 1.0f, -1.0f,-1.0f); glEnd(); } void drawCubeHierarchy(int depth, int neighbors) { drawCube(); // draw parent depth +=1; if (depth < 6){ for (int n = 0; n < neighbors; n++){ glPushMatrix(); glRotatef(n*90.0f-90.0f, 0.0f, 0.0f, 1.0f); glTranslatef(2.5f, 0.0f, 0.0f ); glScalef(0.5f, 0.5f, 0.5f); drawCubeHierarchy(depth, 3); // draw children glPopMatrix(); } } } }; class MyWidget : public QOpenGLWidget { private: Renderer *renderer; QTimer *timer; public: MyWidget(QWidget *parent = NULL) : QOpenGLWidget(parent) { this->setWindowTitle("Demo for gluLookAt and chains of local transformations"); this->resize(320, 320); renderer = new Renderer(); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(30); } ~MyWidget() { makeCurrent(); renderer->dispose(); doneCurrent(); delete renderer; delete timer; } protected: void initializeGL() { renderer->init(); } void resizeGL(int w, int h){ renderer->resize(w, h); } void paintGL() { float offset = 1.0f; renderer->t += offset; renderer->display(); } }; int main (int argc, char* argv[]) { // create a QApplication object that handles initialization, // finalization, and the main event loop QApplication appl(argc, argv); MyWidget widget; // create a widget widget.show(); //show the widget and its children return appl.exec(); // execute the application }