• <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];這句代碼有錯誤。不能這樣用變量定義數組吧。應該用循環吧?  回復  更多評論
              

            久久午夜福利电影| 国产精品久久久久久福利69堂| 亚洲精品国精品久久99热一| 亚洲精品高清国产一久久| 久久精品卫校国产小美女| 伊人色综合久久天天网| 一本久久综合亚洲鲁鲁五月天| 久久久艹| 久久嫩草影院免费看夜色| 久久久久国产精品麻豆AR影院 | 蜜桃麻豆www久久国产精品| 久久成人18免费网站| 国产成人无码精品久久久免费| 成人久久精品一区二区三区 | 久久影院久久香蕉国产线看观看| 亚洲国产成人久久综合碰碰动漫3d | 欧美日韩精品久久久免费观看| 国产999精品久久久久久| 国产精品九九久久免费视频| 国产成人精品久久| 久久精品国产国产精品四凭| 久久久精品久久久久影院| 亚洲国产精品久久久天堂| 久久亚洲国产精品一区二区| 精品久久久久国产免费| 久久热这里只有精品在线观看| 久久人人爽人人爽人人AV东京热| 东京热TOKYO综合久久精品| 99久久综合国产精品二区| 久久经典免费视频| 97久久超碰国产精品2021| 欧洲国产伦久久久久久久| 亚洲狠狠婷婷综合久久久久| 国产999精品久久久久久| 久久久久亚洲AV无码观看| 久久99中文字幕久久| 久久精品国产清自在天天线| 久久天堂电影网| 99久久国产综合精品女同图片| 热99re久久国超精品首页| 97久久国产综合精品女不卡|