• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::

            ==================================[GLWidget.h]==================================

            #ifndef GLWIDGET_H

            #define GLWIDGET_H


            #include <QtOpenGL/QGLWidget>


            class GLWidget : public QGLWidget {

                Q_OBJECT


            public:

                GLWidget(QWidget *parent = 0);

                ~GLWidget();


            protected:

                virtual void initializeGL();

                virtual void resizeGL(int w, int h);

                virtual void paintGL();


                virtual void hideEvent(QHideEvent *event);

                virtual void showEvent(QShowEvent *event);

                virtual void timerEvent(QTimerEvent *event);

                virtual void mousePressEvent(QMouseEvent *event);

                virtual void mouseMoveEvent(QMouseEvent *event);

                virtual void mouseReleaseEvent(QMouseEvent *event);

                virtual void wheelEvent(QWheelEvent *event);


            private:

                int     timerId;

                QPoint  lastPos;

                GLfloat rotateX;

                GLfloat rotateY;

                GLfloat rotateZ;

                GLfloat zoom;


                void drawCube(GLfloat factorX = 1, GLfloat factorY = 1,

                              GLfloat factorZ = 1, GLfloat w = 1);

                void drawCone(GLfloat radius = 1.0f, GLfloat height = 1,

                              GLuint steps = 18);

            };


            #endif // GLWIDGET_H



            ==================================[GLWidget.cpp]==================================

            #include "GLWidget.h"

            #include <qDebug>

            #include <QTimerEvent>

            #include <QMouseEvent>

            #include <cmath>


            GLWidget::GLWidget(QWidget *parent)

                : QGLWidget(parent) {

                setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer));


                rotateX = 0.0f;

                rotateY = 0.0f;

                rotateZ = 0.0f;

                zoom = 1.0f;

            }


            GLWidget::~GLWidget() {


            }


            void GLWidget::hideEvent(QHideEvent *event) {

                this->killTimer(this->timerId);

            }


            void GLWidget::showEvent(QShowEvent *event) {

                this->timerId = this->startTimer(500);

            }


            void GLWidget::timerEvent(QTimerEvent *event) {

                if (event->timerId() == this->timerId) {

                } else {

                    QGLWidget::timerEvent(event);

                }

            }


            void GLWidget::mousePressEvent(QMouseEvent *event) {

                if (Qt::LeftButton == event->button()) {

                    lastPos = event->pos();

                } else if (Qt::RightButton == event->button()) {

                    lastPos = event->pos();

                }

            }


            void GLWidget::mouseMoveEvent(QMouseEvent *event) {

                if (Qt::LeftButton & event->buttons()) {

                    GLfloat dx = event->pos().x() - lastPos.x();

                    GLfloat dy = event->pos().y() - lastPos.y();


                    rotateX += dy;

                    rotateY += dx;


                    updateGL();

                    //qDebug() << QString("RotateX:%1, RotateY:%2").arg(rotateX).arg(rotateY);

                } else if (Qt::RightButton & event->buttons()) {

                    GLfloat dz = event->pos().y() - lastPos.y();

                    dz *= 0.01f;

                    zoom += dz;

                    updateGL();

                }


                lastPos = event->pos();

            }


            void GLWidget::mouseReleaseEvent(QMouseEvent *event) {


            }


            void GLWidget::wheelEvent(QWheelEvent *event) {

                GLfloat degrees = event->delta();

                zoom -= degrees * 0.0002f;

                // 注意, 如果zoom為負值, eye就會被放置到z軸的負方向, 而從物體的背面看了.

                if (zoom < 1.0f) {

                    zoom = 1.0f;

                }


                updateGL();

            }


            ///////////////////////////////////////////////////////////////////////////////

            //                               Opengl Code

            ///////////////////////////////////////////////////////////////////////////////

            void GLWidget::initializeGL() {

                glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

                glEnable(GL_DEPTH_TEST);

                glFrontFace(GL_CCW);

                //glEnable(GL_CULL_FACE);

                glCullFace(GL_BACK);

                glShadeModel(GL_SMOOTH);


                // Point size

                // glPointSize(GLfloat size);

                GLfloat sizes[2];

                GLfloat step;

                glGetFloatv(GL_LINE_WIDTH_RANGE, sizes);

                glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step);

            }


            void GLWidget::resizeGL(int w, int h) {

                glViewport(0, 0, w, h);

                glMatrixMode(GL_PROJECTION);

                glLoadIdentity();

                gluPerspective(75, (GLdouble)w / h, 0.1, 100);

                glMatrixMode(GL_MODELVIEW);

                glLoadIdentity();

            }


            void GLWidget::paintGL() {

                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

                glLoadIdentity();

                //glTranslatef(0.0f, 0.0f, zoom);

                gluLookAt(0.0f, 0.0f, zoom, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);


                glRotatef(rotateX, 1, 0, 0);

                glRotatef(rotateY, 0, 1, 0);

                glRotatef(rotateZ, 0, 0, 1);


                // Real draw code.

                //glColor3f(1.0f, 0.0f, 0.0f);

                //drawCube(1, 1, 1, 1);

                glPolygonMode(GL_BACK, GL_LINE);

                drawCone(1.0f, 1.50, 48);


            }


            void GLWidget::drawCube(GLfloat factorX, GLfloat factorY,

                                    GLfloat factorZ, GLfloat w) {

                GLfloat x = factorX * 0.5f;

                GLfloat y = factorY * 0.5f;

                GLfloat z = factorZ * 0.5f;


                // x / w, y / w, z / w

                // 前左下, 前右下, 前右上, 前左上: p0, p1, p2, p3

                // 后左下, 后右下, 后右上, 后左上: p4, p5, p6, p7

                GLfloat p0[4] = {-x, -y, z, w};

                GLfloat p1[4] = {x, -y, z, w};

                GLfloat p2[4] = {x, y, z, w};

                GLfloat p3[4] = {-x, y, z, w};


                GLfloat p4[4] = {-x, -y, -z, w};

                GLfloat p5[4] = {x, -y, -z, w};

                GLfloat p6[4] = {x, y, -z, w};

                GLfloat p7[4] = {-x, y, -z, w};


                // 開始繪制Cube的六個面: 逆時針

                glBegin(GL_QUADS);

                // 前面: p0, p1, p2, p3

                glVertex4fv(p0);

                glVertex4fv(p1);

                glVertex4fv(p2);

                glVertex4fv(p3);

                // 右面: p1, p5, p6, p2

                glVertex4fv(p1);

                glVertex4fv(p5);

                glVertex4fv(p6);

                glVertex4fv(p2);

                // 后面: p5, p4, p7, p6

                glVertex4fv(p5);

                glVertex4fv(p4);

                glVertex4fv(p7);

                glVertex4fv(p6);

                // 左右: p4, p0, p3, p7

                glVertex4fv(p4);

                glVertex4fv(p0);

                glVertex4fv(p3);

                glVertex4fv(p7);

                // 上面: p2, p6, p7, p3

                glVertex4fv(p2);

                glVertex4fv(p6);

                glVertex4fv(p7);

                glVertex4fv(p3);

                // 下面: p0, p4, p5, p1

                glVertex4fv(p0);

                glVertex4fv(p4);

                glVertex4fv(p5);

                glVertex4fv(p1);

                glEnd();

            }



            void GLWidget::drawCone(GLfloat radius, GLfloat height,

                                    GLuint steps) {

                const GLfloat GL_PI = 3.1415f;

                GLfloat angles = 2 * GL_PI / steps;

                GLfloat vertices[steps][3];


                for (int i = 0; i < steps; ++i) {

                    vertices[i][0] = radius * cos(i * angles);

                    vertices[i][1] = radius * sin(i * angles);

                    vertices[i][2] = 0;

                }


                // top surface

                glBegin(GL_TRIANGLE_FAN);

                    glColor3f(0.0f, 0.0f, 1.0f);

                    glVertex3f(0.0f, 0.0f, height);

                    for (int i = 0; i < steps; ++i) {

                        glVertex3fv(vertices[i]);

                        if ((i & 1) == 0) {

                            glColor3f(1.0f, 0.0f, 0.0f);

                        } else {

                            glColor3f(0.0f, 0.0f, 1.0f);

                        }

                    }

                    glVertex3fv(vertices[0]);

                glEnd();


                // bottom surface

                glBegin(GL_TRIANGLE_FAN);

                    glVertex3f(0.0f, 0.0f, 0);

                    for (int i = steps - 1; i >= 0; --i) {

                        glVertex3fv(vertices[i]);

                        if ((i & 1) == 0) {

                            glColor3f(0.0f, 1.0f, 0.0f);

                        } else {

                            glColor3f(1.0f, 0.0f, 1.0f);

                        }

                    }

                    glVertex3fv(vertices[steps - 1]);

                glEnd();

            }


            posted on 2009-05-19 15:15 逛奔的蝸牛 閱讀(2944) 評論(1)  編輯 收藏 引用 所屬分類: QtOpenGL

            評論

            # re: Qt: OpenGL模板 2012-12-14 15:19 wsc
            GLfloat vertices[steps][3];這句代碼有錯誤。不能這樣用變量定義數組吧。應該用循環吧?  回復  更多評論
              

            狠狠久久综合伊人不卡| 91精品国产高清91久久久久久 | 97视频久久久| 亚洲精品乱码久久久久久蜜桃图片| 国内精品久久久久久久久电影网 | 日本五月天婷久久网站| 亚洲国产精品无码久久| 婷婷综合久久狠狠色99h| 亚洲?V乱码久久精品蜜桃 | 久久久久久国产精品无码下载| 久久99精品国产麻豆宅宅| 久久精品一区二区国产| 超级97碰碰碰碰久久久久最新| 久久精品国产亚洲AV无码娇色 | 7777精品久久久大香线蕉| 久久综合九色综合精品| 国产69精品久久久久9999APGF | 久久精品国产99国产精偷| 精品久久久一二三区| 99热都是精品久久久久久| 狼狼综合久久久久综合网| 久久久精品国产亚洲成人满18免费网站| 久久精品一区二区三区AV| 久久久久无码国产精品不卡| 潮喷大喷水系列无码久久精品| 国内精品久久久久影院薰衣草 | 久久国产精品-久久精品| 久久综合88熟人妻| 人妻无码精品久久亚瑟影视| 久久高潮一级毛片免费| 91精品国产91热久久久久福利 | 国产精品无码久久久久久| 久久久久四虎国产精品| 老司机午夜网站国内精品久久久久久久久 | 一本综合久久国产二区| 国内精品人妻无码久久久影院| 美女久久久久久| 激情久久久久久久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 要久久爱在线免费观看| 热久久国产欧美一区二区精品|