QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等) |
您所在的位置:网站首页 › opengl三维坐标 › QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等) |
#include "GLWidget.h"
#include #define PI 3.14 #define ROT_DELTA 0.5f void qgluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) { const GLdouble ymax = zNear * tan(qDegreesToRadians(fovy) / 2.0); const GLdouble ymin = -ymax; const GLdouble xmin = ymin * aspect; const GLdouble xmax = ymax * aspect; glFrustum(xmin, xmax, ymin, ymax, zNear, zFar); } GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) , xRot( 0.0f) , yRot(0.0f) , zRot(0.0f) { // 设置画面的双缓冲和深度缓存 setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer)); }GLWidget::~GLWidget() { } void GLWidget::initializeGL() { // 启用阴影平滑 glShadeModel(GL_SMOOTH); // 白色背景 glClearColor(1.0, 1.0, 1.0, 1.0); // 设置深度缓存 glClearDepth(1.0); // 启用深度测试 glEnable(GL_DEPTH_TEST); // 所作深度测试的类型 glDepthFunc(GL_LEQUAL); // 告诉系统对透视进行修正 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 启用2D纹理映射 glEnable(GL_TEXTURE_2D); // 加载纹理 loadGLTextures(); } void GLWidget::paintGL() { renderScene(); update(); } void GLWidget::resizeGL(int width, int height) { // 防止窗口大小变为0 if ( height == 0 ) { height = 1; } // 重置当前的视口 glViewport(0, 0, (GLint)width, (GLint)height); // 选择投影矩阵 glMatrixMode(GL_PROJECTION); // 重置投影矩阵 glLoadIdentity(); // 设置视口的大小 qgluPerspective(45.0, (GLdouble)width / (GLdouble)height, 0.1, 100.0); // 选择模型观察矩阵 glMatrixMode(GL_MODELVIEW); // 重置投影矩阵 glLoadIdentity(); } // 绘制立方体 void GLWidget::drawCube() { glBegin(GL_QUAD_STRIP); //填充凸多边形 glColor3f(1, 0, 0); glVertex3f(0.0f, 0.0f, 0.0f); glColor3f(1, 1, 0); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0, 1, 0); glVertex3f(1.0f, 0.0f, 0.0f); glColor3f(0, 1, 1); glVertex3f(1.0f, 1.0f, 0.0f); glColor3f(1, 0, 0); glVertex3f(1.0f, 0.0f, -1.0f); glColor3f(1, 1, 0); glVertex3f(1.0f, 1.0f, -1.0f); glColor3f(0, 1, 0); glVertex3f(0.0f, 0.0f, -1.0f); glColor3f(0, 1, 1); glVertex3f(0.0f, 1.0f, -1.0f); glColor3f(1, 0, 0); glVertex3f(0.0f, 0.0f, 0.0f); glColor3f(1, 1, 0); glVertex3f(0.0f, 1.0f, 0.0f); glEnd(); glBegin(GL_QUAD_STRIP); glColor3f(0, 0, 1); glVertex3f(0.0f, 0.0f, 0.0f); glColor3f(1, 0, 1); glVertex3f(1.0f, 0.0f, 0.0f); glColor3f(0, 1, 0); glVertex3f(0.0f, 0.0f, -1.0f); glColor3f(1, 0, 0); glVertex3f(1.0f, 0.0f, -1.0f); glColor3f(1, 1, 0); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(1, 0, 1); glVertex3f(1.0f, 1.0f, 0.0f); glColor3f(0, 0, 1); glVertex3f(0.0f, 1.0f, -1.0f); glColor3f(1, 0, 0); glVertex3f(1.0f, 1.0f, -1.0f); glEnd(); } // 绘制圆形 void GLWidget::drawCircle() { glBegin(GL_TRIANGLE_FAN); //扇形连续填充三角形串 glVertex3f(0.0f, 0.0f, 0.0f); int i = 0; for (i = 0; i |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |