main.cpp

#include <QApplication>
#include <iostream> #include "tetraheadron.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 ;
} Tetrahedron tetrahedron;
tetrahedron.setWindowTitle(QObject::tr("Tetrahedron"));
tetrahedron.resize(, );
tetrahedron.show(); return app.exec();
}

tetraheaderon.h

#ifndef TETRAHEDRON_H
#define TETRAHEDRON_H #include <QGLWidget> class Tetrahedron : public QGLWidget
{
Q_OBJECT public:
Tetrahedron(QWidget *parent = ); protected:
//在QGLWidget中实现
void initializeGL();
void resizeGL(int width, int height);
void paintGL(); //鼠标事件处理在QWidget中实现
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event); private:
void draw();
int faceAtPosition(const QPoint &pos); GLfloat rotationX;
GLfloat rotationY;
GLfloat rotationZ;
QColor faceColors[];
QPoint lastPos;
}; #endif

tetraheadron.cpp

#include <QtGui>
#include <QtOpenGL>
#include <GL/glu.h>
#include "tetraheadron.h" Tetrahedron::Tetrahedron(QWidget *parent)
: QGLWidget(parent)
{
//指定OpenGL的显示描述表
setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer)); //初始化私有变量
rotationX = -21.0;
rotationY = -57.0;
rotationZ = 0.0;
faceColors[] = Qt::red;
faceColors[] = Qt::green;
faceColors[] = Qt::blue;
faceColors[] = Qt::yellow;
} //在调用paintGL()之前被调用一次.这里设置
//OpenGL的绘图描述表,定义显示列表,以及执行其他的初始化
void Tetrahedron::initializeGL()
{
qglClearColor(Qt::black);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
} //调用initializeGL之后调用resizeGL()函数,窗口部件改变大小时也调用resizeGL()
//函数,设置OpenGL视口,投影,以及其他与窗口部件尺寸相关的设置
void Tetrahedron::resizeGL(int width, int height)
{
glViewport(, , width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat x = GLfloat(width) / height;
glFrustum(-x, +x, -1.0, +1.0, 4.0, 15.0);
glMatrixMode(GL_MODELVIEW);
} //需要重绘的时候调用
void Tetrahedron::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//实际的绘制由私有函数draw()实现
draw();
} //鼠标按下的事件
void Tetrahedron::mousePressEvent(QMouseEvent *event)
{
lastPos = event->pos();
} //鼠标移动的事件
void Tetrahedron::mouseMoveEvent(QMouseEvent *event)
{
GLfloat dx = GLfloat(event->x() - lastPos.x()) / width();
GLfloat dy = GLfloat(event->y() - lastPos.y()) / height(); //左键绕X,Y轴
if (event->buttons() & Qt::LeftButton) {
rotationX += * dy;
rotationY += * dx;
updateGL();
}
//右键绕X,Z轴
else if (event->buttons() & Qt::RightButton) {
rotationX += * dy;
rotationZ += * dx;
updateGL();
}
lastPos = event->pos();
} //双击事件
void Tetrahedron::mouseDoubleClickEvent(QMouseEvent *event)
{
int face = faceAtPosition(event->pos());
if (face != -) {
QColor color = QColorDialog::getColor(faceColors[face], this);
if (color.isValid()) {
faceColors[face] = color;
updateGL();
}
}
} //绘制
void Tetrahedron::draw()
{
static const GLfloat P1[] = { 0.0, -1.0, +2.0 };
static const GLfloat P2[] = { +1.73205081, -1.0, -1.0 };
static const GLfloat P3[] = { -1.73205081, -1.0, -1.0 };
static const GLfloat P4[] = { 0.0, +2.0, 0.0 }; //四个面
static const GLfloat * const coords[][] = {
{ P1, P2, P3 }, { P1, P3, P4 }, { P1, P4, P2 }, { P2, P4, P3 }
}; glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -10.0);
//设置旋转
glRotatef(rotationX, 1.0, 0.0, 0.0);
glRotatef(rotationY, 0.0, 1.0, 0.0);
glRotatef(rotationZ, 0.0, 0.0, 1.0); //设置颜色
for (int i = ; i < ; ++i) {
glLoadName(i);
glBegin(GL_TRIANGLES);
qglColor(faceColors[i]);
for (int j = ; j < ; ++j) {
glVertex3f(coords[i][j][], coords[i][j][],
coords[i][j][]);
}
glEnd();
}
} //返回窗口部件某位置所在的面的编号
int Tetrahedron::faceAtPosition(const QPoint &pos)
{
const int MaxSize = ;
GLuint buffer[MaxSize];
GLint viewport[]; makeCurrent(); glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(MaxSize, buffer);
glRenderMode(GL_SELECT); glInitNames();
glPushName(); glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(GLdouble(pos.x()),GLdouble(viewport[] - pos.y()),5.0,5.0,viewport);
GLfloat x = GLfloat(width()) / height();
glFrustum(-x, x, -1.0, 1.0, 4.0, 15.0);
draw();
glMatrixMode(GL_PROJECTION);
glPopMatrix(); if (!glRenderMode(GL_RENDER))
return -;
return buffer[];
}

45.Qt openGL实现三维绘图的更多相关文章

  1. QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等)

    本文使用QGLWidget来绘制各种三维基本图形,包括立方体.圆柱体.圆锥.球体.圆环等等,涉及包括基本绘制以及上色.纹理.旋转等操作. 使用的软件版本:QT5.12 + QT Creater4.8. ...

  2. Qt OpenGL三维绘图

     简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...

  3. 使用C语言实现二维,三维绘图算法(3)-简单的二维分形

    使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...

  4. 使用C语言实现二维,三维绘图算法(1)-透视投影

    使用C语言实现二维,三维绘图算法(1)-透视投影 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想 ...

  5. 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示

    使用C语言实现二维,三维绘图算法(2)-解析曲面的显示 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...

  6. matlab的三维绘图和四维绘图

    一.三维绘图1.曲线图plot3(X1,Y1,Z1,...):以默认线性属性绘制三维点集(X1,Y1,Z1)确定的曲线plot3(X1,Y1,Z1,LineSpec):以参数LineSpec确定的线性 ...

  7. QT OpenGL中文教程在QT4版本后的错误代码更改(一)

    由于教程中说的已经够可以了,这里就不对代码进行分析了,有兴趣可以自己去看看.这个教程来源于原来的NeHeOpenGL中文教程 (http://www.yakergong.net/nehe/) ,但其有 ...

  8. 基于OpenGL的三维曲面动态显示实现

    在使用Visual C++的MFC AppWizard建立应用程序框架后,生成了多个类,与OpenGL编程相关的类是视图类,主要的显示任务都在其中完成. 1.基于OpenGL绘图的基本设置 1.1 设 ...

  9. matlab学习笔记8 基本绘图命令-三维绘图

    一起来学matlab-matlab学习笔记8 基本绘图命令_6 三维绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...

随机推荐

  1. 解决:惠普HP LaserJet Pro M126a MFP 驱动 安装失败,及其它同类打印机失败问题

    注意:如果在 Windows XP 系统下安装出错,请先安装WindowsXP KB971276-v3补丁后再安装装驱动. 下载地址:http://www.dyjqd.com/soft/KB97127 ...

  2. AMQP及RabbitMQ

    AMQPAMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现.它主要包括以下组件: 1.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程. ...

  3. Canopy聚类算法分析

          原文链接:http://blog.csdn.net/yclzh0522/article/details/6839643 Canopy聚类算法是可以并行运行的算法,数据并行意味着可以多线程进 ...

  4. python迭代器,生成器,推导式

    可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: ...

  5. 原生js通过最外层id获取下面指定的子元素

    需求:在vue中使用v-for循环出来的元素,设置动态id,之后获取下面的所有textarea标签 template: <table cellpadding = 2 v-for="(i ...

  6. scrapy爬虫--10分钟入门

    # -*- coding: utf-8 -*- # @Time : 2019/4/18 9:10 # @Author : wujf # @Email : 1028540310@qq.com # @Fi ...

  7. Lua的热更新学习笔记_01

    热更新的的实现方式 1.使用lua脚本编写游戏的UI或者其他的逻辑 2.使用C#的反射技术 3.使用C#Light AssetBundle是什么? 1.unity提供一个资源更新技术,就是通过Asse ...

  8. /proc目录介绍

    1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...

  9. php第十一节课

    增删改查 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  10. 网络安全web部分

    Web安全 一.    SQL注入 1)    原理 通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序 ...