C++ gui QT4 OPENGL 开发6--使用遞迴分割繪製一顆茶壺形物體

Qt4.8下的OpenGL以及Glut画茶壶 好多东西没弄懂,先记下来,省的以后再重复今天的麻烦 1.工程里的文件都怎么写? QT += core gui opengl 这句话是指包含了G:\Qt\Qt481\Desktop\Qt\4.8.1\mingw\include下的那一堆qt自己的库 其中的QT +=opengl 就是QtOpenGL文件夹的所在了,里面有QGLWidget类,这个类里有gl.h, 阅读详情

//main.cpp

 

#include <QApplication>
#include <iostream>

#include "teapots.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    if (!QGLFormat::hasOpenGL()) {
        std::cerr << "This system has no OpenGL support" << std::endl;
        return 1;
    }

  

    Teapots teapots;
    teapots.setWindowTitle(QObject::tr("Teapots"));
    teapots.resize(400, 400);
    teapots.show();

    return app.exec();
}

 

//teapots.h

 

#ifndef TEAPOTS_H
#define TEAPOTS_H

#include <QGLFramebufferObject>
#include <QGLWidget>

typedef GLfloat point[3];


class Teapots : public QGLWidget
{
    Q_OBJECT

public:
    Teapots(QWidget *parent = 0);
    ~Teapots();

protected:
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);

private:
    void createGLTeapotObject();

    GLuint glTeapotObject;
   
    point data[32][4][4];

    int level;
    void normal(point n, point p, point q, point r);
    void transpose(point a[4][4]);
    void divide_patch(point p[4][4], int n);
    void divide_curve(point c[4], point r[4], point l[4]);
    void draw_patch(point p[4][4]);
   
    int xRot;
    int yRot;
    int zRot;
    QPoint lastPos;
    void setXRotation(int angle);
    void normalizeAngle(int *angle);
};

#endif

//teapots.cpp

 


#include <QtGui>
#include <QtOpenGL>

#include "teapots.h"
/* 306 vertices */

point vertices[306]={{1.4 , 0.0 , 2.4}, {1.4 , -0.784 , 2.4},
{0.784 , -1.4 , 2.4}, {0.0 , -1.4 , 2.4}, {1.3375 , 0.0 , 2.53125},
{1.3375 , -0.749 , 2.53125}, {0.749 , -1.3375 , 2.53125}, {0.0 , -1.3375 , 2.53125},
{1.4375 , 0.0 , 2.53125}, {1.4375 , -0.805 , 2.53125}, {0.805 , -1.4375 , 2.53125},
{0.0 , -1.4375 , 2.53125}, {1.5 , 0.0 , 2.4}, {1.5 , -0.84 , 2.4},
{0.84 , -1.5 , 2.4}, {0.0 , -1.5 , 2.4}, {-0.784 , -1.4 , 2.4},
{-1.4 , -0.784 , 2.4}, {-1.4 , 0.0 , 2.4}, {-0.749 , -1.3375 , 2.53125},
{-1.3375 , -0.749 , 2.53125}, {-1.3375 , 0.0 , 2.53125}, {-0.805 , -1.4375 , 2.53125},
{-1.4375 , -0.805 , 2.53125}, {-1.4375 , 0.0 , 2.53125}, {-0.84 , -1.5 , 2.4},
{-1.5 , -0.84 , 2.4}, {-1.5 , 0.0 , 2.4}, {-1.4 , 0.784 , 2.4},
{-0.784 , 1.4 , 2.4}, {0.0 , 1.4 , 2.4}, {-1.3375 , 0.749 , 2.53125},
{-0.749 , 1.3375 , 2.53125}, {0.0 , 1.3375 , 2.53125}, {-1.4375 , 0.805 , 2.53125},
{-0.805 , 1.4375 , 2.53125}, {0.0 , 1.4375 , 2.53125}, {-1.5 , 0.84 , 2.4},
{-0.84 , 1.5 , 2.4}, {0.0 , 1.5 , 2.4}, {0.784 , 1.4 , 2.4},
{1.4 , 0.784 , 2.4}, {0.749 , 1.3375 , 2.53125}, {1.3375 , 0.749 , 2.53125},
{0.805 , 1.4375 , 2.53125}, {1.4375 , 0.805 , 2.53125}, {0.84 , 1.5 , 2.4},
{1.5 , 0.84 , 2.4}, {1.75 , 0.0 , 1.875}, {1.75 , -0.98 , 1.875},
{0.98 , -1.75 , 1.875}, {0.0 , -1.75 , 1.875}, {2.0 , 0.0 , 1.35},
{2.0 , -1.12 , 1.35}, {1.12 , -2.0 , 1.35}, {0.0 , -2.0 , 1.35},
{2.0 , 0.0 , 0.9}, {2.0 , -1.12 , 0.9}, {1.12 , -2.0 , 0.9},
{0.0 , -2.0 , 0.9}, {-0.98 , -1.75 , 1.875}, {-1.75 , -0.98 , 1.875},
{-1.75 , 0.0 , 1.875}, {-1.12 , -2.0 , 1.35}, {-2.0 , -1.12 , 1.35},
{-2.0 , 0.0 , 1.35}, {-1.12 , -2.0 , 0.9}, {-2.0 , -1.12 , 0.9},
{-2.0 , 0.0 , 0.9}, {-1.75 , 0.98 , 1.875}, {-0.98 , 1.75 , 1.875},
{0.0 , 1.75 , 1.875}, {-2.0 , 1.12 , 1.35}, {-1.12 , 2.0 , 1.35},
{0.0 , 2.0 , 1.35}, {-2.0 , 1.12 , 0.9}, {-1.12 , 2.0 , 0.9},
{0.0 , 2.0 , 0.9}, {0.98 , 1.75 , 1.875}, {1.75 , 0.98 , 1.875},
{1.12 , 2.0 , 1.35}, {2.0 , 1.12 , 1.35}, {1.12 , 2.0 , 0.9},
{2.0 , 1.12 , 0.9}, {2.0 , 0.0 , 0.45}, {2.0 , -1.12 , 0.45},
{1.12 , -2.0 , 0.45}, {0.0 , -2.0 , 0.45}, {1.5 , 0.0 , 0.225},
{1.5 , -0.84 , 0.225}, {0.84 , -1.5 , 0.225}, {0.0 , -1.5 , 0.225},
{1.5 , 0.0 , 0.15}, {1.5 , -0.84 , 0.15}, {0.84 , -1.5 , 0.15},
{0.0 , -1.5 , 0.15}, {-1.12 , -2.0 , 0.45}, {-2.0 , -1.12 , 0.45},
{-2.0 , 0.0 , 0.45}, {-0.84 , -1.5 , 0.225}, {-1.5 , -0.84 , 0.225},
{-1.5 , 0.0 , 0.225}, {-0.84 , -1.5 , 0.15}, {-1.5 , -0.84 , 0.15},
{-1.5 , 0.0 , 0.15}, {-2.0 , 1.12 , 0.45}, {-1.12 , 2.0 , 0.45},
{0.0 , 2.0 , 0.45}, {-1.5 , 0.84 , 0.225}, {-0.84 , 1.5 , 0.225},
{0.0 , 1.5 , 0.225}, {-1.5 , 0.84 , 0.15}, {-0.84 , 1.5 , 0.15},
{0.0 , 1.5 , 0.15}, {1.12 , 2.0 , 0.45}, {2.0 , 1.12 , 0.45},
{0.84 , 1.5 , 0.225}, {1.5 , 0.84 , 0.225}, {0.84 , 1.5 , 0.15},
{1.5 , 0.84 , 0.15}, {-1.6 , 0.0 , 2.025}, {-1.6 , -0.3 , 2.025},
{-1.5 , -0.3 , 2.25}, {-1.5 , 0.0 , 2.25}, {-2.3 , 0.0 , 2.025},
{-2.3 , -0.3 , 2.025}, {-2.5 , -0.3 , 2.25}, {-2.5 , 0.0 , 2.25},
{-2.7 , 0.0 , 2.025}, {-2.7 , -0.3 , 2.025}, {-3.0 , -0.3 , 2.25},
{-3.0 , 0.0 , 2.25}, {-2.7 , 0.0 , 1.8}, {-2.7 , -0.3 , 1.8},
{-3.0 , -0.3 , 1.8}, {-3.0 , 0.0 , 1.8}, {-1.5 , 0.3 , 2.25},
{-1.6 , 0.3 , 2.025}, {-2.5 , 0.3 , 2.25}, {-2.3 , 0.3 , 2.025},
{-3.0 , 0.3 , 2.25}, {-2.7 , 0.3 , 2.025}, {-3.0 , 0.3 , 1.8},
{-2.7 , 0.3 , 1.8}, {-2.7 , 0.0 , 1.575}, {-2.7 , -0.3 , 1.575},
{-3.0 , -0.3 , 1.35}, {-3.0 , 0.0 , 1.35}, {-2.5 , 0.0 , 1.125},
{-2.5 , -0.3 , 1.125}, {-2.65 , -0.3 , 0.9375}, {-2.65 , 0.0 , 0.9375},
{-2.0 , -0.3 , 0.9}, {-1.9 , -0.3 , 0.6}, {-1.9 , 0.0 , 0.6},
{-3.0 , 0.3 , 1.35}, {-2.7 , 0.3 , 1.575}, {-2.65 , 0.3 , 0.9375},
{-2.5 , 0.3 , 1.125}, {-1.9 , 0.3 , 0.6}, {-2.0 , 0.3 , 0.9},
{1.7 , 0.0 , 1.425}, {1.7 , -0.66 , 1.425}, {1.7 , -0.66 , 0.6},
{1.7 , 0.0 , 0.6}, {2.6 , 0.0 , 1.425}, {2.6 , -0.66 , 1.425},
{3.1 , -0.66 , 0.825}, {3.1 , 0.0 , 0.825}, {2.3 , 0.0 , 2.1},
{2.3 , -0.25 , 2.1}, {2.4 , -0.25 , 2.025}, {2.4 , 0.0 , 2.025},
{2.7 , 0.0 , 2.4}, {2.7 , -0.25 , 2.4}, {3.3 , -0.25 , 2.4},
{3.3 , 0.0 , 2.4}, {1.7 , 0.66 , 0.6}, {1.7 , 0.66 , 1.425},
{3.1 , 0.66 , 0.825}, {2.6 , 0.66 , 1.425}, {2.4 , 0.25 , 2.025},
{2.3 , 0.25 , 2.1}, {3.3 , 0.25 , 2.4}, {2.7 , 0.25 , 2.4},
{2.8 , 0.0 , 2.475}, {2.8 , -0.25 , 2.475}, {3.525 , -0.25 , 2.49375},
{3.525 , 0.0 , 2.49375}, {2.9 , 0.0 , 2.475}, {2.9 , -0.15 , 2.475},
{3.45 , -0.15 , 2.5125}, {3.45 , 0.0 , 2.5125}, {2.8 , 0.0 , 2.4},
{2.8 , -0.15 , 2.4}, {3.2 , -0.15 , 2.4}, {3.2 , 0.0 , 2.4},
{3.525 , 0.25 , 2.49375}, {2.8 , 0.25 , 2.475}, {3.45 , 0.15 , 2.5125},
{2.9 , 0.15 , 2.475}, {3.2 , 0.15 , 2.4}, {2.8 , 0.15 , 2.4},
{0.0 , 0.0 , 3.15}, {0.0 , -0.002 , 3.15}, {0.002 , 0.0 , 3.15},
{0.8 , 0.0 , 3.15}, {0.8 , -0.45 , 3.15}, {0.45 , -0.8 , 3.15},
{0.0 , -0.8 , 3.15}, {0.0 , 0.0 , 2.85}, {0.2 , 0.0 , 2.7},
{0.2 , -0.112 , 2.7}, {0.112 , -0.2 , 2.7}, {0.0 , -0.2 , 2.7},
{-0.002 , 0.0 , 3.15}, {-0.45 , -0.8 , 3.15}, {-0.8 , -0.45 , 3.15},
{-0.8 , 0.0 , 3.15}, {-0.112 , -0.2 , 2.7}, {-0.2 , -0.112 , 2.7},
{-0.2 , 0.0 , 2.7}, {0.0 , 0.002 , 3.15}, {-0.8 , 0.45 , 3.15},
{-0.45 , 0.8 , 3.15}, {0.0 , 0.8 , 3.15}, {-0.2 , 0.112 , 2.7},
{-0.112 , 0.2 , 2.7}, {0.0 , 0.2 , 2.7}, {0.45 , 0.8 , 3.15},
{0.8 , 0.45 , 3.15}, {0.112 , 0.2 , 2.7}, {0.2 , 0.112 , 2.7},
{0.4 , 0.0 , 2.55}, {0.4 , -0.224 , 2.55}, {0.224 , -0.4 , 2.55},
{0.0 , -0.4 , 2.55}, {1.3 , 0.0 , 2.55}, {1.3 , -0.728 , 2.55},
{0.728 , -1.3 , 2.55}, {0.0 , -1.3 , 2.55}, {1.3 , 0.0 , 2.4},
{1.3 , -0.728 , 2.4}, {0.728 , -1.3 , 2.4}, {0.0 , -1.3 , 2.4},
{-0.224 , -0.4 , 2.55}, {-0.4 , -0.224 , 2.55}, {-0.4 , 0.0 , 2.55},
{-0.728 , -1.3 , 2.55}, {-1.3 , -0.728 , 2.55}, {-1.3 , 0.0 , 2.55},
{-0.728 , -1.3 , 2.4}, {-1.3 , -0.728 , 2.4}, {-1.3 , 0.0 , 2.4},
{-0.4 , 0.224 , 2.55}, {-0.224 , 0.4 , 2.55}, {0.0 , 0.4 , 2.55},
{-1.3 , 0.728 , 2.55}, {-0.728 , 1.3 , 2.55}, {0.0 , 1.3 , 2.55},
{-1.3 , 0.728 , 2.4}, {-0.728 , 1.3 , 2.4}, {0.0 , 1.3 , 2.4},
{0.224 , 0.4 , 2.55}, {0.4 , 0.224 , 2.55}, {0.728 , 1.3 , 2.55},
{1.3 , 0.728 , 2.55}, {0.728 , 1.3 , 2.4}, {1.3 , 0.728 , 2.4},
{0.0 , 0.0 , 0.0}, {1.5 , 0.0 , 0.15}, {1.5 , 0.84 , 0.15},
{0.84 , 1.5 , 0.15}, {0.0 , 1.5 , 0.15}, {1.5 , 0.0 , 0.075},
{1.5 , 0.84 , 0.075}, {0.84 , 1.5 , 0.075}, {0.0 , 1.5 , 0.075},
{1.425 , 0.0 , 0.0}, {1.425 , 0.798 , 0.0}, {0.798 , 1.425 , 0.0},
{0.0 , 1.425 , 0.0}, {-0.84 , 1.5 , 0.15}, {-1.5 , 0.84 , 0.15},
{-1.5 , 0.0 , 0.15}, {-0.84 , 1.5 , 0.075}, {-1.5 , 0.84 , 0.075},
{-1.5 , 0.0 , 0.075}, {-0.798 , 1.425 , 0.0}, {-1.425 , 0.798 , 0.0},
{-1.425 , 0.0 , 0.0}, {-1.5 , -0.84 , 0.15}, {-0.84 , -1.5 , 0.15},
{0.0 , -1.5 , 0.15}, {-1.5 , -0.84 , 0.075}, {-0.84 , -1.5 , 0.075},
{0.0 , -1.5 , 0.075}, {-1.425 , -0.798 , 0.0}, {-0.798 , -1.425 , 0.0},
{0.0 , -1.425 , 0.0}, {0.84 , -1.5 , 0.15}, {1.5 , -0.84 , 0.15},
{0.84 , -1.5 , 0.075}, {1.5 , -0.84 , 0.075}, {0.798 , -1.425 , 0.0},
{1.425 , -0.798 , 0.0}};

/* 32 patches each defined by 16 vertices, arranged in a 4 x 4 array */
/* NOTE: numbering scheme for teapot has vertices labeled from 1 to 306 */
/* remnent of the days of FORTRAN */

int indices[32][4][4]={{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
{4, 17, 18, 19, 8, 20, 21, 22, 12, 23, 24, 25, 16, 26, 27, 28},
{19, 29, 30, 31, 22, 32, 33, 34, 25, 35, 36, 37, 28, 38, 39, 40},
{31, 41, 42, 1, 34, 43, 44, 5, 37, 45, 46, 9, 40, 47, 48, 13},
{13, 14, 15, 16, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60},
{16, 26, 27, 28, 52, 61, 62, 63, 56, 64, 65, 66, 60, 67, 68, 69},
{28, 38, 39, 40, 63, 70, 71, 72, 66, 73, 74, 75, 69, 76, 77, 78},
{40, 47, 48, 13, 72, 79, 80, 49, 75, 81, 82, 53, 78, 83, 84, 57},
{57, 58, 59, 60, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96},
{60, 67, 68, 69, 88, 97, 98, 99, 92, 100, 101, 102, 96, 103, 104, 105},
{69, 76, 77, 78, 99, 106, 107, 108, 102, 109, 110, 111, 105, 112, 113, 114},
{78, 83, 84, 57, 108, 115, 116, 85, 111, 117, 118, 89, 114, 119, 120, 93},
{121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136},
{124, 137, 138, 121, 128, 139, 140, 125, 132, 141, 142, 129, 136, 143, 144, 133},
{133, 134, 135, 136, 145, 146, 147, 148, 149, 150, 151, 152, 69, 153, 154, 155},
{136, 143, 144, 133, 148, 156, 157, 145, 152, 158, 159, 149, 155, 160, 161, 69},
{162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177},
{165, 178, 179, 162, 169, 180, 181, 166, 173, 182, 183, 170, 177, 184, 185, 174},
{174, 175, 176, 177, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197},
{177, 184, 185, 174, 189, 198, 199, 186, 193, 200, 201, 190, 197, 202, 203, 194},
{204, 204, 204, 204, 207, 208, 209, 210, 211, 211, 211, 211, 212, 213, 214, 215},
{204, 204, 204, 204, 210, 217, 218, 219, 211, 211, 211, 211, 215, 220, 221, 222},
{204, 204, 204, 204, 219, 224, 225, 226, 211, 211, 211, 211, 222, 227, 228, 229},
{204, 204, 204, 204, 226, 230, 231, 207, 211, 211, 211, 211, 229, 232, 233, 212},
{212, 213, 214, 215, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245},
{215, 220, 221, 222, 237, 246, 247, 248, 241, 249, 250, 251, 245, 252, 253, 254},
{222, 227, 228, 229, 248, 255, 256, 257, 251, 258, 259, 260, 254, 261, 262, 263},
{229, 232, 233, 212, 257, 264, 265, 234, 260, 266, 267, 238, 263, 268, 269, 242},
{270, 270, 270, 270, 279, 280, 281, 282, 275, 276, 277, 278, 271, 272, 273, 274},
{270, 270, 270, 270, 282, 289, 290, 291, 278, 286, 287, 288, 274, 283, 284, 285},
{270, 270, 270, 270, 291, 298, 299, 300, 288, 295, 296, 297, 285, 292, 293, 294},
{270, 270, 270, 270, 300, 305, 306, 279, 297, 303, 304, 275, 294, 301, 302, 271}};

Teapots::Teapots(QWidget *parent)
    : QGLWidget(parent)
{
   
    xRot = 0;
    yRot = 0;
    zRot = 0;

int i,j, k, m, n;

    level=3;

    for(i=0;i<32;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) for(n=0;n<3;n++)
    {

/* put teapot data into single array for subdivision */

        m=indices[i][j][k];
        for(n=0;n<3;n++) data[i][j][k][n]=vertices[m-1][n];
    }

}

Teapots::~Teapots()
{

}

void Teapots::initializeGL()
{

    static const GLfloat mat_specular[]={1.0, 1.0, 1.0, 1.0};
    static const GLfloat mat_diffuse[]={1.0, 1.0, 1.0, 1.0};
    static const GLfloat mat_ambient[]={1.0, 1.0, 1.0, 1.0};
    static const GLfloat mat_shininess={100.0};
    static const GLfloat light_ambient[]={0.0, 0.0, 0.0, 1.0};
    static const GLfloat light_diffuse[]={1.0, 1.0, 0.0, 1.0};
    static const GLfloat light_specular[]={1.0, 1.0, 1.0, 1.0};
    static const GLfloat light_position[]={10.0, 10.0, 10.0, 0.0};

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);

    glEnable(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    glEnable(GL_DEPTH_TEST);
    glClearColor (0.0, 0.0, 0.0, 1.0);
    glColor3f (1.0, 1.0, 1.0);
    glEnable(GL_NORMALIZE); /* automatic normaization of normals */
    glEnable(GL_CULL_FACE); /* eliminate backfacing polygons */
    glCullFace(GL_BACK);

}

void Teapots::resizeGL(int width, int height)
{
     int w,h;
     w = width;
     h = height;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
        glOrtho(-4.0, 4.0, -4.0 * (GLfloat) h / (GLfloat) w,
            4.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
    else
        glOrtho(-4.0 * (GLfloat) w / (GLfloat) h,
            4.0 * (GLfloat) w / (GLfloat) h, -4.0, 4.0, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);

}

void Teapots::paintGL()
{
    int i;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

/* data aligned along z axis, rotate to align with y axis */

    //glRotatef(-90.0, 1.0,0.0, 0.0);
    glRotated(xRot / 16.0, 1.0, 0.0, 0.0);
    for(i=0;i<32;i++) divide_patch(data[i], level); /* divide all 32 patches */

    glFlush();

}

void Teapots::mousePressEvent(QMouseEvent *event)
{
    lastPos = event->pos();
}

void Teapots::mouseMoveEvent(QMouseEvent *event)
{
   
    int dx = event->x() - lastPos.x();
    int dy = event->y() - lastPos.y();

    if (event->buttons() & Qt::LeftButton) {
        setXRotation(xRot + 8 * dy);
        //setYRotation(yRot + 8 * dx);
    } else if (event->buttons() & Qt::RightButton) {
        setXRotation(xRot + 8 * dy);
       // setZRotation(zRot + 8 * dx);
    }
    lastPos = event->pos();
}
void Teapots::setXRotation(int angle)
{
    normalizeAngle(&angle);
    if (angle != xRot) {
        xRot = angle;
        //emit xRotationChanged(angle);
        updateGL();
    }
}
void Teapots::normalizeAngle(int *angle)
{
    while (*angle < 0)
        *angle += 360 * 16;
    while (*angle > 360 * 16)
        *angle -= 360 * 16;
}
void Teapots::mouseReleaseEvent(QMouseEvent * /* event */)
{

}

void Teapots::createGLTeapotObject()
{

}

void Teapots::normal(point n, point p, point q, point r)
{
n[0]=(q[1]-p[1])*(r[2]-p[2])-(q[2]-p[2])*(r[1]-p[1]);
n[1]=(q[2]-p[2])*(r[0]-p[0])-(q[0]-p[0])*(r[2]-p[2]);
n[2]=(q[0]-p[0])*(r[2]-p[2])-(q[2]-p[2])*(r[0]-p[0]);
}

void Teapots::transpose(point a[4][4])
{

/* transpose wastes time but makes program more readable */

int i,j, k;
GLfloat tt;
for(i=0;i<4;i++) for(j=i;j<4; j++) for(k=0;k<3;k++)
    {
        tt=a[i][j][k];
        a[i][j][k]=a[j][i][k];
        a[j][i][k]=tt;
    }
}

void Teapots::divide_patch(point p[4][4], int n)
   {
   point q[4][4], r[4][4], s[4][4], t[4][4];
   point a[4][4], b[4][4];
   int i,j, k;
   if(n==0) draw_patch(p); /* draw patch if recursion done */

/* subdivide curves in u direction, transpose results, divide
in u direction again (equivalent to subdivision in v) */

   else
       {
       for(k=0; k<4; k++) divide_curve(p[k], a[k], b[k]);
       transpose(a);
       transpose(b);
       for(k=0; k<4; k++)
           {
           divide_curve(a[k], q[k], r[k]);
           divide_curve(b[k], s[k], t[k]);
           }

/* recursive division of 4 resulting patches */

       divide_patch(q, n-1);
       divide_patch(r, n-1);
       divide_patch(s, n-1);
       divide_patch(t, n-1);
       }
}

void Teapots::divide_curve(point c[4], point r[4], point l[4])
{

/* division of convex hull of Bezier curve */

   int i;
   point t;
   for(i=0;i<3;i++)
   {
       l[0][i]=c[0][i];
       r[3][i]=c[3][i];
       l[1][i]=(c[1][i]+c[0][i])/2;
       r[2][i]=(c[2][i]+c[3][i])/2;
       t[i]=(l[1][i]+r[2][i])/2;
       l[2][i]=(t[i]+l[1][i])/2;
       r[1][i]=(t[i]+r[2][i])/2;
       l[3][i]=r[0][i]=(l[2][i]+r[1][i])/2;
   }
}

void Teapots::draw_patch(point p[4][4])
{
    point n;
    normal(n, p[0][0], p[3][0], p[3][3]);
    glBegin(GL_QUADS);
    glNormal3fv(n);
    glVertex3fv(p[0][0]);
    glVertex3fv(p[3][0]);
    glVertex3fv(p[3][3]);
    glVertex3fv(p[0][3]);
    glEnd();
}

 

弧度角归一化 描述 在编写代码时,一般都是使用弧度角进行计算。弧度角可以是任意的,但作为工程处理来说,一般需要弧度角保持在 -π ~ π 之间 代码 实现方式是有很多的,这里贴出的是百度apollo代码中的实现方式 #include <math.h> double NormalizeAngle(double angle) { double a = fmod(angle + M_PI, 2.0 * M_PI); if (a < 0.0) { a += (2.0 * 阅读详情

相关推荐

MoveIt控制睿尔曼RM65机械臂:从仿真到实机的3种控制模式对比

本文详细解析了使用MoveIt框架控制睿尔曼RM65机械臂的三种核心模式:拖动规划、目标姿态规划和Python API控制,从Gazebo仿真到实机部署的完整实现路径。通过ROS环境配置、控制参数优化及实机过渡技术,为工业自动化和机器人研究提供实用指南。

727

基于C++OpenGL实现的小桌茶壶图形绘制

在模型变换实验的基础上,通过实现下述实验内容,掌握OpenGL中三维观察、透视投影、正交投影的参数设置,并能使用键盘移动观察相机,在透视投影和正交投影间切换,验证课程中三维观察的内容;进一步加深对OpenGL三维坐标和矩阵变换的理解和应用。使用Visual Studio C++编译已有项目工程,并修改代码生成以下图形: 添加键盘对茶壶的控制,主要是茶壶沿着桌面的平移操作(如下图中绿色和蓝色标示)和茶壶绕自身轴(如下图中红色标示)的旋转操作;按键为:l, j, I, k, e。具体对应关系可查看参考答案中

毕业作品网站 4931

Unreal Engine鸿蒙移植实战:环境配置、构建流程与性能优化指南

游戏引擎移植是跨平台开发中的关键技术环节,其核心原理在于通过适配目标操作系统的底层接口和工具链,实现同一套代码在不同硬件和软件环境下的高效运行。这项技术的价值在于最大化代码复用率,降低多平台维护成本,并能让应用快速触达新兴生态系统的用户。在移动游戏和XR应用领域,随着鸿蒙HarmonyOS生态的快速发展,将成熟的商业引擎如Unreal Engine迁移至此平台,成为开发者探索新市场机会的重要路径。本文聚焦于Unreal Engine项目向鸿蒙系统的移植实践,详细解析了从环境搭建、源码适配到构建打包的全链路流

weixin_29011395的博客 402

C++ gui QT4 OPENGL 开发7--另一个逼真的opengl qt4茶壺代码

//main.cpp #include #include #include "teapots.h"int main(int argc, char *argv[]){    QApplication app(argc, argv);    if (!QGLFormat::hasOpenGL()) {        std::cerr         return 1;    }

itclock的专栏 2300

基于单片机控制的开关电源设计

采用开关电源技术和MCU模块,凭借可靠性高、易于调适的特点,可以更高效地发挥出二者的优势,从而实现更好的组合。stm32的起动模式是通过Boot0和Boot1两个管脚的高低电平来决定的,当stm32被供电之后,这两个管脚的电平。在 VCC上,键盘的一头(列线)被连接到 VCC上,而在“0”的编程输出中,则用来进。,在开关管打开的情况下,由输入电力供给电流,感应装置存储   Buck变换器是一种非隔离式的电压转换器[10]整流电路对输入电压进行整流,再经过滤波电路,即Dc电压是直流/直流变换器的直流输入。

QQ1694456187的博客 2307

PADS Layout新手必看:从元件摆放到地线处理的10个实用技巧

本文为PADS Layout新手提供了10个实用技巧,涵盖元件摆放、地线处理等关键环节。从功能模块化布局到高频信号处理,再到电磁兼容性设计,帮助初学者快速掌握PCB设计核心技能,提升Layout效率和质量。特别适合需要优化PADS Layout工作流程的设计师参考。

stone的博客 252

OpenGL入门学习二——绘制旋转的茶壶

from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * def drawFunc(): # 清空之前画面 glClear(GL_COLOR_BUFFER_BIT) # 旋转,参数为 旋转角度、xyz轴的布尔值变量。表示绕哪些轴旋转 glRotate(0.1,0,1,0)...

风源- 4875

Windows BITS服务:后台智能文件传输技术详解

后台文件传输技术是现代IT基础设施中的关键组件,Windows BITS(Background Intelligent Transfer Service)作为微软原生解决方案,通过队列管理和智能调度实现高效数据传输。其核心技术原理包括分块传输、断点续传和带宽自适应,能够根据网络状况动态调整传输速率(默认占用空闲带宽的80%)。在工程实践中,BITS特别适用于企业软件分发和自动化数据采集场景,通过PowerShell命令即可实现高优先级传输和代理配置。相比传统FTP方案,BITS在跨国文件传输中将失败率从30

weixin_42116058的博客 274

使用opengl绘制茶壶并实现鼠标拖动

OPENGL中封存有对鼠标进行相应的函数,但使用起来无法实现效果,于是我们需要进行一些偏移量计算以完成角度的拖拽,这在一定程度上给参考了solidworks中3D物品旋转的方式。选定一个原点,将坐标轴正方向和反方向的俩个点进行连线,代码及效果如上图所示(本次程序中由于渲染原因,坐标轴颜色统一为棕色)2.把偏移量添加到摄像机的俯仰角和偏航角中。3.对偏航角和俯仰角进行最大和最小值的限制。1.计算鼠标距上一帧的偏移量。5.将其封装到函数中。

indigo_xx的博客 1604

SAP_SD模块信用管理-最早未清项判断逾期

在 SAP SD 模块的信用管理(Credit Management) 中,系统可以通过 最早未清项(Oldest Open Item) 来判断客户是否存在逾期,从而影响订单的信用检查结果。例如: 定义最大未清项目%为1%,未清天数为1天,即允许客户“逾期1天的未清应收帐款/该客户的应收帐款余额”最大比例为1%,若超过1%则将被信用冻结。的信用检查功能,用于判断客户是否有账龄过长的未清款项,并据此决定是否允许新的销售订单继续处理。然后在查看客户的信贷信息可以看到,最早的未清信息显示在系统中。

我小时候很黑的博客 861

QT+OPenGL绘图例子

环境:Qt4.7.3 + VS2008 效果图:   //***************  glutttt.h #ifndef GLUTTTT_H #define GLUTTTT_H   #include #include #include #include   #pragma comment(lib, "glaux.lib")   class glu

24K程序猿 9926

Autosar NvM配置-手动配置Nvblock及使用-基于ETAS软件

NVM作为存储协议栈中最顶层的模块,是必须要掌握的。目前项目基本使用MCU带的Dflash模块,使用Fee模拟eeprom。在项目前期阶段,应该充分讨论需要存储的内容,包括应用数据,诊断数据等,用以评估Dflash空间是否够用。本文基于ETAS软件介绍NVBlock配置生成NVM参数及使用。使用NVBlock配置生成,基本不用手写代码,还是比较方便的。对于Nv block的划分,建议将同时写的一类数据放到一个block中,因为block除了data以外,Fee还会增加一些header数据,占用不少内存。

赞的博客 1884

OpenGL彩色茶壶

#include <gl/glut.h> void init(void) { glClearColor(0.0,0.0,1.0,0.0); glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); GLfloat light0_ambient[]={1,0.0,0.0,0.0}; GLfloat light0_diffuse[]={1,0.0,0.0,0.0}; GLfloat light0_spe.

qq_45693271的博客 864

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

DX 简单阴影

View Code //// 在场景中渲染出一个茶壶Mesh以及这个茶壶的影子//#include "header.h"ID3DXMesh *pTeapot = NULL;D3DMATERIAL9 teapotMtrl;D3DLIGHT9 pointLight; // 点光bool DXSetup(){ // 初始化材质 ::Z...

aibulie0537的博客 294

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ROS angles包说明

在看move_base源码时,有几处用到了 angles::shortest_angular_distance以及angles::normalize_angle,就查了下angle这个类,发现是ros中的一个名称为angle的软件包,就读了下源码。 一.函数功能说明 功能说明:该软件包提供了一组简单的数学实用程序来处理角度。 该实用程序涵盖了简单的事情,例如标准化角度以及度和弧度之间的转换 角度包含以下方法: 角度转换:angles :: from_degrees,angles :: to_degrees

ゃ﹏淸凨ゞ 3946

角度校准代码

#include "ros/ros.h" #include "geometry_msgs/Twist.h" #include <cmath> #include <string> #include <iostream> #include "tf/tf.h" #include "tf/transform_listener.h" #include "dynamic_reconfigure/server.h" #include "xtark_linear_calibrate/xt

dwell548560的博客 635

FOC控制

核心代码: #include "foc_kernel.h" #include <math.h> #include "FOC_utils.h" #define PWM_Period 100 #define _PI 3.14159265359 #define _PI_2 1.57079632679 #define _PI_3 1.0471975512 #define _2PI 6.28318530718 #define _3PI_2 4.71238898038 #define _PI_6.

chilian12321的博客 3699

颜色转换

const RGB_MAX = 255 const HUE_MAX = 360 const SV_MAX = 100 var colorsys = module.exports = {} colorsys.rgb2Hsl = function (r, g, b) { if (typeof r === ‘object’) { const args = r r = args.r; g = args.g; b = args.b; } // It converts [0,255] format, to [0,1]

weixin_45575273的博客 296

FOC学习笔记——开环

【代码】FOC学习笔记——开环。

m0_68756466的博客 1196

用c语言实现“归一化角度“后的cos(x)与sin(x)

在C语言中,本人发现网上基本上都是教你如何直接使用C语言库函数来调用cos与sin,但由于很多限制,特别硬件编程,必须要自己写cos和sin函数。网上也有几篇自己实现了cos与sin函数的文章,但是都只有单独实现cos和单独实现sin,没有两个函数一起实现的文章,导致算法完全不一样,造成很多麻烦。 我已经写了一篇文章是“用c语言实现cos(x)与sin(x) 函数以及“绝对值函数”和“阶乘函数”” 链接是 但是这个文章里面所提供的代码有一个问题就是: 就是如果输入的弧度特别大,可能会出现超出数据类

suxiao6666的博客 2403

ceres学习笔记(四)

对于pose_graph_2d.cc部分的学习记录。

weixin_45572737的博客 2197

避免角度相减时的不连续性的函数

179度和-179度之间的差应该是2度而不是358度。

qq_41816368的博客 374

Apollo6.0代码Lattice算法详解——Part2:寻找匹配点

Apollo6.0代码Lattice算法详解——Part2:寻找匹配点0.前置知识1.涉及主要函数2.函数关系3.函数代码详解    3.1 lattice_planner.cc中代码部分    3.2 函数-MatchToPath    3.3 函数-FindProjectionPoint    3.4 函数

weixin_44558122的博客 1万+

圆弧点计算方式-c++代码

轨迹规划中,常用到圆弧点的计算,已知一个轨迹点的坐标(x,y,theta),求这个点以R为半径,向前走len米的距离,产生的新数据点的坐标。 好,接下来确认下输入输出: 输入为:起点坐标x,y,theta,半径R,向前走len距离 输出为:终点坐标:X,Y,Thetas #include <iostream> #include <math.h> #include <cmath> #include <vector> //角度归一 将角度转化为 -M_P

行走的漂流瓶的博客 3247

计算机视觉基础---图像处理(几何变换)cpp+python

2.1 简介 该部分将对基本的几何变换进行学习,几何变换的原理大多都是相似,只是变换矩阵不同,因此,我们以最常用的平移和旋转为例进行学习。在深度学习领域,我们常用平移、旋转、镜像等操作进行数据增广;在传统CV领域,由于某些拍摄角度的问题,我们需要对图像进行矫正处理,而几何变换正是这个处理过程的基础,因此了解和学习几何变换也是有必要的。 这次我们带着几个问题进行,以旋转为例: 1:变换的形式(公...

weixin_44023658的博客 1250
上一篇: C++ gui QT4 OPENGL 开发5
下一篇: C++ gui QT4 OPENGL 开发7--另一个逼真的opengl qt4茶壺代码
itclock
博客等级 码龄25年 19粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值