Qt + OpenGL 教程(二):点

如何绘制点、线、多边形?

一、几何图元

  • GL_POINTS:点
  • GL_LINES:线段,二个点确定线段
  • GL_LINE_STRIP:第一个点依次连接的线段
  • GL_LINE_LOOP:和GL_LINE_STRIP相同,但首尾连接,形成环状
  • GL_POLYGON:多边形
  • GL_QUADS:由四个点组成一个四边形
  • GL_QUADS_STRIP:四边形带
  • GL_TRIANGLES:三角形,三个点确定
  • GL_TRIANGLE_STRIP:共用一个条带上的顶点的一组三角形
  • GL_TRIANGLE_FAN:以一个原点为中心呈扇形排列,公共相邻顶点的一组三角形

二、点

step1:在“工程文件”中加入  

QT += opengl

代码参考网址:https://blog.csdn.net/myths_0/article/details/24431597

                           (有代码,内容解释很详细。但我不可能每次都需要详细的过一遍,这里算是自己的简化版本笔记)

我的代码如下:

widget.h

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGLWidget>
#include <GL/gl.h>
#include <GL/glu.h>


namespace Ui {
class Widget;
}

class Widget : public QGLWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

    bool fullscreen,light;
    GLfloat m_rtri;   //控制三角形的角度
    GLfloat m_rquad;  //控制四边形的角度
    int winWidth,winHeight;
    GLbyte* colorArr;
    float horizontal;
    float vertical;
    QPoint m_last;


protected:

    void initializeGL();
    void paintGL();
    void resizeGL(int width,int height);

    void keyPressEvent(QKeyEvent *event);
    void mouseMoveEvent(QMouseEvent *e);
    void mousePressEvent(QMouseEvent *e);

};

#endif // WIDGET_H

widget.cpp

//widget.cpp
#include "widget.h"
#include "ui_widget.h"

#include <QKeyEvent>
#include <QTimer>
#include <iostream>
using namespace std;

Widget::Widget(QWidget *parent) :
    QGLWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    fullscreen = false;
    horizontal = 0.0;
    vertical = 30.0;
    m_rtri = 0.0f;   

}
void Widget::initializeGL()
{
    glShadeModel(GL_SMOOTH);//启用阴影平滑,阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。
    glClearColor(0.0,0.0,0.0,0.0);//清除屏幕时所用的颜色
    glClearDepth(1.0);//设置深度缓存
    glEnable(GL_DEPTH_TEST);//启用深度测试
    glDepthFunc(GL_LEQUAL);//所作深度测试的类型.上面3行做的是关于深度缓存的,深度缓存的排序决定哪个物体先画
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );


}
void Widget::paintGL()//对OpenGL进行所有的设置。设置清除屏幕所用的颜色,打开深度缓存,启用smooth shading.等窗口创建之后才会被调用
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存
    glLoadIdentity();//重置当前的模型观察矩阵。在glLoadIdentity()调用之后,函数返回之前,添加代码来创建基本的形
    //目前所做的就是将屏幕清除成前面所决定的颜色,清除深度缓存并且重置场景,仍然没绘制任何东西。
    
    glTranslatef(-1.5,  0.0, -6.0 );//移动的时候不是相对于屏幕中心移动,而是相对于当前所在屏幕位置
    int M = 2;
    int N = 2;
    float **Zn = (float **)new float *[N];
    for(int i=0;i<N;i++)
    {
        Zn[i] = new float[M];
    }
    glBegin(GL_POINTS);
        glVertex3f(-1,-1,0);
        glVertex3f(1,1,0);
        glVertex3f(1,-1,0);
        glVertex3f(-1,1,0);
    glEnd();
     
}
void Widget::resizeGL(int width,int height)
{
    if(height==0)//防止height为0
    {
        height=1;
    }
    glViewport(0,0,(GLint)width,(GLint)height);//重置当前的视口
    glMatrixMode(GL_PROJECTION);//选择投影矩阵
    glLoadIdentity();//重置投影矩阵
    gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1,100.0);//建立透视投影矩阵
    glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵
    glLoadIdentity();//重置模型观察矩阵
}
void Widget::keyPressEvent(QKeyEvent *event)//加头文件#include <QKeyEvent>
{
    GLint viewPort[4] = {0};
    switch (event->key())
    {
    //F1为全屏和普通屏的切换键
    case Qt::Key_F2:
        fullscreen = !fullscreen;
        if (fullscreen)
        {
            showFullScreen();
        }
        else
        {
            showNormal();
        }
        updateGL();
        break;
    //ESC为退出键
    case Qt::Key_Escape:
        close();
    case Qt::Key_C:              
        m_rtri += 15.0f;
    case Qt::Key_L:
        light = !light;
        if(!light){
            glDisable(GL_LIGHTING);
        }else{
            glEnable(GL_LIGHTING);
        }
    }
}

void Widget::mousePressEvent(QMouseEvent *e)
{
 m_last = e->pos();
}
Widget::~Widget()
{
    delete ui;
}

 

运行结果如下:

 

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt 是一款跨平台应用程序开发框架,它提供了丰富的功能和工具来简化应用程序的开发。OpenGL 是一种图形渲染库,用于创建高性能的2D和3D图形效果。那么,QtOpenGL 的结合能够为开发者提供强大的图形处理能力和丰富的用户界面设计功能。 在学习使用 QtOpenGL 进行应用程序开发时,书籍是非常有帮助的资源。下面是一些关于 QtOpenGL 的书籍推荐: 1.《Qt5 权威指南》:这本书全面介绍了 Qt 的各个方面,包括 Qt 的基础知识、GUI 编程、网络编程、数据库编程等内容,对初学者来说非常友好。同时,书中还有一章专门介绍了如何在 Qt 中使用 OpenGL 进行图形绘制。 2.《Qt5 与 OpenGL 高级编程指南》:这本书着重介绍了 Qt5 和 OpenGL 的结合应用,涵盖了 OpenGL 基础知识、渲染管线、光照、纹理、阴影等高级图形技术。它适合有一定编程经验且对图形编程有兴趣的开发者。 3.《OpenGL编程指南(第九版)》:虽然这本书不是专门讲解 Qt,但是它是学习 OpenGL 必备的经典教材之一。它详细介绍了 OpenGL 的基础知识和相关概念,包括顶缓冲对象、渲染缓冲区、着色器编程等内容。通过学习这本书,开发者可以更加深入地理解 OpenGL 的工作原理。 以上是一些关于 QtOpenGL 的书籍推荐,选择适合自己水平和需求的书籍进行学习,可以帮助我们更好地掌握 QtOpenGL 的开发技巧,进而开发出功能丰富且高性能的应用程序。 ### 回答2: Qt是一种跨平台的应用程序开发框架,它提供了丰富的GUI界面设计工具和功能强大的库,可以帮助开发者轻松地开发出高质量的图形界面应用程序。而OpenGL是一种专门用于图形渲染的API,可以实现高性能、高质量的图形渲染效果。 在Qt中使用OpenGL可以帮助开发者更好地利用硬件加速来实现图形渲染,提高程序的性能和效果。因此,学习QtOpenGL的结合使用对于想要开发高质量图形应用程序的开发者来说是非常有价值的。 关于QtOpenGL的书籍,市面上有很多优秀的选择。其中,一本非常经典的书籍是《Qt5与OpenGL开发实战指南》。这本书适合有Qt基础并对OpenGL感兴趣的开发者。书中介绍了使用QtOpenGL进行图形编程的基本原理和技巧,并通过丰富的实例演示了如何使用QtOpenGL实现各种图形效果和交互特性。 除了这本书之外,还有一些其他的书籍也值得推荐。例如,《OpenGL编程指南》是一本经典的OpenGL入门书籍,可以帮助开发者深入理解OpenGL的基本原理和使用方法。《Qt5开发及实例精解》是一本全面介绍Qt开发的书籍,其中也包含了一些关于QtOpenGL结合使用的内容。 总之,选择适合自己的QtOpenGL书籍,可以帮助开发者更好地掌握QtOpenGL的基本知识和技术,从而开发出更加高效、高质量的图形应用程序。 ### 回答3: Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的图形界面和功能库,可以帮助开发者快速地构建高质量的应用程序。OpenGL则是一个用于图形渲染的开放标准,通过与Qt结合使用,可以实现更高级的图形效果和游戏开发。 对于想深入学习QtOpenGL的开发者来说,有一些经典的书籍可以提供帮助。首先推荐《Qt编程开发实战》一书,该书详细介绍了Qt的基本概念和常用功能,让读者能够快速入门。接下来,可以阅读《QtOpenGL开发指南》,该书介绍了如何使用QtOpenGL创建高级图形应用程序,并深入解析了底层原理和技术细节。此外,《OpenGL超级宝典》是一本非常经典的OpenGL入门书籍,其中包含了许多实用的代码示例和案例讲解,对于理解OpenGL的基本原理和使用方法非常有帮助。 除了这些书籍,互联网上也有许多免费的教程和博客可以供开发者参考,例如《Qt官方文档》和《OpenGL教程》等。此外,参加一些相关的培训课程或者在线教育平台提供的课程,也是学习QtOpenGL的有效途径。最重要的是,实践是学习的关键,通过动手实践一些小项目,可以帮助开发者更好地理解和应用所学知识。 总的来说,QtOpenGL是非常强大的开发工具,在学习过程中可以参考一些经典的书籍和在线资源,结合实践经验,迅速掌握它们的使用方法和技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值