opengl学习——绘制图形

原创 2016年06月01日 15:38:38

概要

最近在学习QT的opengl, 在网上找了相关的学习资料,发现很少,通过查阅相关资料和对网上一些零碎的资料进行了总结,并用QT5 写出了一些简单的DEMO, 最近这段时间将进行持续地更新。

QT5 需要加的模块

opengl是一个模单独的模块,所以在使用时,应该在pro里面添加对应的模块。 
QT += opengl


实例运行效果图

这里写图片描述


实例代码

.h文件

#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H
#include <QtOpenGL>

class OpenglWidget : public QGLWidget
{
public:
    OpenglWidget(QWidget* parent = 0);

protected:
  void initializeGL();
  void initWidget();
  void paintGL();
  void resizeGL(int width, int height);
};

#endif // OPENGLWIDGET_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

.cpp文件代码

#include "openglwidget.h"

OpenglWidget::OpenglWidget(QWidget* parent)
    :QGLWidget(parent)
{
    initWidget();
    initializeGL();
}

void OpenglWidget::initializeGL()
{
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

void OpenglWidget::initWidget()
{
    setGeometry( 400, 200, 640, 480 );
    setWindowTitle(tr("opengl demo"));
}

void OpenglWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef( -1.5,  0.0, -6.0 );

    glBegin( GL_QUADS );
    glVertex3f(  -1.0,  1.0,  0.0 );
    glVertex3f(  1.0,  1.0,  0.0 );
    glVertex3f(  1.0, -1.0,  0.0 );
    glVertex3f( -1.0, -1.0,  0.0 );
    glEnd();

    glTranslatef(  3.0,  0.0,  0.0 );

    glBegin( GL_TRIANGLES );
    qDebug() << "this is a paintGL test!";
    glVertex3f(  0.0,  1.0,  0.0 );
    glVertex3f( -1.0, -1.0,  0.0 );
    glVertex3f(  1.0, -1.0,  0.0 );
    glEnd();
}

void OpenglWidget::resizeGL(int width, int height)
{
    if(0 == height) {
        height = 1;
    }

    glViewport(0, 0, (GLint)width, (GLint)height);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

  //  gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);

    GLdouble aspectRatio = (GLfloat)width/(GLfloat)height;
    GLdouble zNear = 0.1;
    GLdouble zFar = 100.0;

    GLdouble rFov = 45.0 * 3.14159265 / 180.0;
     glFrustum( -zNear * tan( rFov / 2.0 ) * aspectRatio,
               zNear * tan( rFov / 2.0 ) * aspectRatio,
               -zNear * tan( rFov / 2.0 ),
               zNear * tan( rFov / 2.0 ),
               zNear, zFar );

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

部分函数接口的解释

1.glLoadIdentity();

当您调用glLoadIdentity()之后,您实际上将当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。

2.glBegin(…)

这里是绘制什么图形的接口,比如说绘制三角形可以用glBegin(GL_TRIANGLES), 而多边形使用 
glBegin(GL_QUADS) 其它的点线等可以参考下面的。

#define GL_POINTS 0x0000
#define GL_LINES 0x0001
#define GL_LINE_LOOP 0x0002
#define GL_LINE_STRIP 0x0003
#define GL_TRIANGLES 0x0004
#define GL_TRIANGLE_STRIP 0x0005
#define GL_TRIANGLE_FAN 0x0006
#define GL_QUADS 0x0007
#define GL_QUAD_STRIP 0x0008
#define GL_POLYGON 0x0009
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里需要说明的是在绘制的时候,需要以glBegin(…) 以 glEnd() 结束。

3.glVertex3f( x, y, z );

x,y, z 表示在一个三维空间里面的坐标。

4.glViewport( 0, 0, (GLint)width, (GLint)height );

重置当前的视口(Viewport)

5.glMatrixMode( …);

选择矩阵模式, 主要用得多的是投影矩阵 和 模型观察矩阵

#define GL_MODELVIEW 0x1700
#define GL_PROJECTION 0x1701
#define GL_TEXTURE 0x1702
  • 1
  • 2
  • 3

6.glLoadIdentity();

重置矩阵,这里主要功能是把坐标移动到原点,好进行后续的操作。

7.gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);

设置投影矩阵

8.glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble zNear,GLdouble zFar);

设置投影矩阵, 需要讲一下的是, gluPerspective 和 glFrustum功能 是一样的, 准确的说, gluPerspective 是glFrustum的封装, 它们的关系我将在另一篇博客中进行讲解。而gluPerspective在一些平台或版本上找不到,这时就应该用glFrustum进行转换。

主要使用方法

void paintGL(); 
void resizeGL(int width, int height); 
这两个函数是父类的虚函数, 我们主要是通过重写这两个函数,来进行对应图片的绘制, 在绘制的过程中调用对应的接口,然后通过相应的坐标计算来实现最后的图片绘制

opengl 学习笔记(3) 2D 点、线、坐标、键盘

OpenGL中描述一个顶点的方法是指定其坐标和属性,命令是:  glVertex*(Coordination);  该命令以参数指定的坐标和当前颜色、纹理坐标、法向等属性定义一个顶点。  Ope...
  • postpatient
  • postpatient
  • 2015年09月09日 09:13
  • 117

iOS OpenGL ES 研究二:OpenGL ES绘制图形精华

前言: 本文将用最简单明了的语言介绍使用Xcode在iphone上绘制三角形的过程。 读完本文后大家可掌握以下内容: - 完全掌握基本绘制原理 - 掌握OpenGL ES 的详细...
  • Xoxo_x
  • Xoxo_x
  • 2017年05月21日 14:27
  • 568

通过屏幕鼠标绘制opengl三维场景图形

举个例子,要在三维场景中画三角形。想通过获取三个opengl坐标点在三维场景中画三角形。先看下面 glPushMatrix();      gluLookAt(4.0, 3.0, 3.0, 0.0...
  • abcdef8c
  • abcdef8c
  • 2011年08月27日 12:41
  • 3399

Android OpenGL ES2.0编程教程系列之绘制图形(三)

原文链接 定义好想要用OpenGL绘制的图形后,你大概想要画它们了。绘制形状可能需要比你想象的更多的代码,因为API提供了在图形渲染管线上的大量的控制。 本节内容讲解如何使用OpenGL ES 2.0...
  • u011520181
  • u011520181
  • 2016年05月28日 23:51
  • 1131

OpenGL学习之路

鱼眼校正---拼接融合-----全景漫游,前两步都过了一下,在泊松融合上停留了差不多一个月,拖了太久,从昨天开始决定踏入第三步全景漫游,首先学习OpenGL,昨天基本上找了一天资料,然后用VC++6....
  • wd1603926823
  • wd1603926823
  • 2015年12月14日 09:28
  • 3233

新手小白学习OpenGL的网站

趁着这次放寒假,在家好好地巩固一下C++的知识,顺便开始学习OpenGL的相关知识! 在网上搜索之后,发现一个OpenGL的入门网站,感觉挺好的,记录下来,开始学习啦!!!!! 英文原版网站:...
  • hbtj_1216
  • hbtj_1216
  • 2017年01月20日 20:29
  • 2617

学习OpenGL

openGL官网https://www.opengl.org/如何检测显卡类型和OpenGL版本? [OpenGL入门学习](http://www.cppblog.com/doing5552/arc...
  • caowei880123
  • caowei880123
  • 2016年06月26日 14:33
  • 660

OpenGL ES(3)——绘制图形

在你定义了被OpenGL绘制的形状之后,你可能想要真正地绘制出它们。OpenGL ES 2.0可能会比你想象的花费更多代码,因为API提供了对于图像渲染管道相当多的控制。这节课解释了怎样去使用Open...
  • j313469458
  • j313469458
  • 2015年11月09日 11:47
  • 236

第二个程序opengl绘制图形

opengl绘制圆,绘制五角星,绘制正弦函数代码如下: // myfistopengl2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include ...
  • ahuang1900
  • ahuang1900
  • 2013年11月06日 18:57
  • 2008

OpenGL学习脚印: 环境搭建

OpenGL学习脚印: 环境搭建写在前面 如果你正在阅读本文,那么你和我一样可能喜欢图形学或者游戏编程,想尝试编写自己的图形App :)。图形学的初学者往往非常着急,希望能立即编写出丰富生动、...
  • ziyuanxiazai123
  • ziyuanxiazai123
  • 2016年05月03日 23:10
  • 9254
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opengl学习——绘制图形
举报原因:
原因补充:

(最多只允许输入30个字)