《Qt-OpenGL系列编程》课程学习记录(8):绘制一个长方体
要绘制一个长方体,每一面都是图片。
为了简便,就不使用EBO了。
前面的内容是绘制一个面的,但是长方体有六个面。其实方法也是一样的,根据这个图设置坐标:
float vertices[] =
{//位置坐标 纹理坐标-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f
};
//顶点着色器
#version 450 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec2 aTexCord;
out vec2 TexCord;
void main(){gl_Position = vec4(aPos, 1.0f);TexCord=aTexCord;
}
//片段着色器
#version 450 core
out vec4 FragColor;
in vec2 TexCord;
uniform sampler2D textureWall;
void main()
{FragColor = texture(textureWall,TexCord);
}
#include "widget.h"
#include <QOpenGLShaderProgram>
#include <QTimer>
#include <QTime>
#include <QOpenGLTexture>unsigned int VBO, VAO;Widget::Widget(QWidget *parent) : QOpenGLWidget(parent)
{
}Widget::~Widget()
{makeCurrent();glDeleteBuffers(1,&VBO);glDeleteVertexArrays(1,&VAO);doneCurrent();
}void Widget::initializeGL()
{initializeOpenGLFunctions();glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), nullptr);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);glBindBuffer(GL_ARRAY_BUFFER, 0);shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shapes.vert");shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shapes.frag");if(!shaderProgram.link())qDebug()<<"着色器程序编译错误信息:"<<shaderProgram.log();textureWall = new QOpenGLTexture(QImage(":/image/wall.jpg").mirrored());shaderProgram.bind();shaderProgram.setUniformValue("textureWall",0);//纹理单元0glBindVertexArray(0);
}void Widget::paintGL()
{glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);shaderProgram.bind();glBindVertexArray(VAO);textureWall->bind(0);glDrawArrays(GL_TRIANGLES,0,36);
}
结果是这样的:
因为我们是从一个面的中央观察一个立方体,只能看到它的一个面。
要使它看起来有立方体的感觉要进行一些操作。
一些概念
模型矩阵(model)
定义缩放,旋转,平移的操作。
视图矩阵(view)
模拟一个摄像机的镜头,以便可以在3D空间中的某个位置去观察另一个位置。
投影矩阵(projection)
负责使看到的画面符合近大远小的透视规律,并且保证无论窗口的宽高比是多少,看到的画面都不会再变形。
顶点位置乘以这三个矩阵即可得到立体的效果。
//顶点着色器
#version 450 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec2 aTexCord;
out vec2 TexCord;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main()
{gl_Position = projection*view*model*vec4(aPos, 1.0f);TexCord = aTexCord;
}
#include "widget.h"
#include <QOpenGLShaderProgram>
#include <QTimer>
#include <QTime>
#include <QOpenGLTexture>unsigned int VBO, VAO;float vertices[] =
{//位置坐标 纹理坐标-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f
};QVector<QVector3D> cubePositions =
{QVector3D( 0.0f, 0.0f, 0.0f),//QVector3D( 2.0f, 5.0f, -15.0f),//QVector3D(-1.5f, -2.2f, -2.5f),//QVector3D(-3.8f, -2.0f, -12.3f),//QVector3D( 2.4f, -0.4f, -3.5f),//QVector3D(-1.7f, 3.0f, -7.5f),//QVector3D( 1.3f, -2.0f, -2.5f),//QVector3D( 1.5f, 2.0f, -2.5f),//QVector3D( 1.5f, 0.2f, -1.5f),//QVector3D(-1.3f, 1.0f, -1.5f)
};Widget::Widget(QWidget *parent) : QOpenGLWidget(parent)
{
}Widget::~Widget()
{makeCurrent();glDeleteBuffers(1,&VBO);glDeleteVertexArrays(1,&VAO);doneCurrent();
}void Widget::initializeGL()
{initializeOpenGLFunctions();glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), nullptr);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);glBindBuffer(GL_ARRAY_BUFFER, 0);shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shapes.vert");shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shapes.frag");if(!shaderProgram.link())qDebug()<<"着色器程序编译错误信息:"<<shaderProgram.log();textureWall = new QOpenGLTexture(QImage(":/image/wall.jpg").mirrored());shaderProgram.bind();shaderProgram.setUniformValue("textureWall",0);//纹理单元0glBindVertexArray(0);//投影矩阵QMatrix4x4 projection;projection.perspective(60, //画面视野的角度 人眼在头部不动的情况下,视野大概为60°(float)width()/height(), //窗口比例0.1,100);//参数三和四表示距离摄像机多近个多远范围内的物体要被显示。超出这个范围的物体将无法被显示。shaderProgram.setUniformValue("projection", projection);
}void Widget::paintGL()
{uint time = QTime::currentTime().msec();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);shaderProgram.bind();//视图矩阵QMatrix4x4 view;view.setToIdentity();//对矩阵进行单位化,保证所有矩阵运算都会在一个单位矩阵上进行view.lookAt(QVector3D(2, 2, 2), //眼睛的位置QVector3D(0, 0, 0), //眼睛看的位置QVector3D(0, 1, 0)); //此参数表示方向,相对于眼睛向上的方向。shaderProgram.setUniformValue("view", view);glBindVertexArray(VAO);textureWall->bind(0);for (const QVector3D & item : cubePositions){//模型矩阵QMatrix4x4 model;model.setToIdentity();model.translate(item);//平移model.rotate(time, 1.0f, 1.0f, 0.5f);//旋转 该矩阵将坐标绕矢量 (x, y, z) 旋转angle度model.scale(1.0f);//缩放shaderProgram.setUniformValue("model", model);glDrawArrays(GL_TRIANGLES,0,36);}
}
加上一个定时器:
auto timer = new QTimer(this);connect(timer,&QTimer::timeout,this,[this]{update();});timer->start(100);
绘制多个:
QVector<QVector3D> cubePositions =
{QVector3D( 0.0f, 0.0f, 0.0f),QVector3D( 2.0f, 5.0f, -15.0f),QVector3D(-1.5f, -2.2f, -2.5f),QVector3D(-3.8f, -2.0f, -12.3f),QVector3D( 2.4f, -0.4f, -3.5f),QVector3D(-1.7f, 3.0f, -7.5f),QVector3D( 1.3f, -2.0f, -2.5f),QVector3D( 1.5f, 2.0f, -2.5f),QVector3D( 1.5f, 0.2f, -1.5f),QVector3D(-1.3f, 1.0f, -1.5f)
};
《Qt-OpenGL系列编程》课程学习记录(8):绘制一个长方体相关推荐
- 编程课程学习_如果您想学习数据科学,请从以下编程课程之一开始
编程课程学习 by David Venturi 大卫·文图里(David Venturi) 如果您想学习数据科学,请从以下编程课程之一开始 (If you want to learn Data Sci ...
- python是什么语言开发的-少儿编程有什么好处?儿童编程课程学习Python的4大原因...
儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...
- python 人工智能课程对孩子的好处_少儿编程有什么好处?儿童编程课程学习Python的4大原因...
儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...
- 1 Robotics: Aerial Robotics 第3+4周 课程学习记录及课后习题解答
Robotics: Aerial Robotics 第3+4周 WEEK - 3 Quiz Programming Assignment: 2-D Quadrotor Control WEEK - 4 ...
- Windows编程课程学习笔记
一. Windows程序内部运行机制--Windows编程课程学习笔记 二. MFC框架程序分析--Windows编程课程学习笔记 三. 简单绘图--Windows编程课程学习笔记 四. 文本编程-- ...
- [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …...
[Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Python学习] ...
- python做实时温度曲线图_Python学习记录 - matplotlib绘制温度变化折线图
Python学习记录 - matplotlib绘制温度变化折线图 Python学习记录 - matplotlib绘制温度变化折线图 题目:列表a表示10点到12点每一分钟的气温,累计为2个小时,绘制折 ...
- 《Qt-OpenGL系列编程》课程学习记录(1):相关概念、VAO、VBO、绘制三角形、使用OpenGL原生方式编译链接着色器程序
大家可以去B站看课程的视频支持一下作者哈: OpenGL,Qt实现:1入门篇(已更完)_哔哩哔哩_bilibili课程相关源码.PPT.安装包,完整课程合集(1:入门篇:2:基础光照:3:模型加载:4 ...
- Qt VTK软件开发问题学习记录
1. 0x00000000000000处有未经处理的异样 程序运行时出现下面问题肯定是内存错误,但到底是数组越界(数组边界溢出),指针错误,链接库问题......就需要进一步调试(debug). 链接 ...
- Unity3D学习笔记1——绘制一个三角形
文章目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无 ...
最新文章
- Android 高清加载巨图方案 拒绝压缩图片
- 百度地图经常崩溃的问题
- 提升淘宝排名的27个因素
- 装修行业难互联网化?利润不合理并非本质,体制才是
- write up: web 前女友(SKCTF)
- javaweb如何定位
- 这6种性格的人不适合做数据分析
- linux服务器开发板,linuxnfs服务器的建立,虚拟机、开发板间的通信
- JAVA中文件指针复位到文件开头
- 设计每个网站时所追求的5个目标
- 详解MAC硬盘中各个文件夹
- BMP文件格式详解(BMP file format) (转)
- graphpad做单因素方差分析_如何使用Graphpad做单因素方差分析
- Logstash mutate 插件
- 中国10大PCBA加工厂商排名
- 小米手机4c获取Root权限的流程
- Activiti7 工作流引擎入门
- sql注入漏洞检测攻略
- true在python是什么意思_Python3中真真假假True、False、None等含义是什么
- 【国产虚拟仪器】基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(二)硬件设计
热门文章
- 三星 i8268 android6,三星I8268怎么样?
- python量化交易策略实例_用 Python 实现你的量化交易策略
- Inskeep – 一个优秀的Instagram图片保存工具
- Bystack世界观(一):资产的三个维度
- 深度学习的性能评价指标---图像分类的评价指标
- appearance: none;的使用
- PhpStorm添加PHP代码规范检查CodeSniffer(phpcs)和PHP代码静态分析工具Mess Detector(phpmd)
- 基于Java的新闻发布系统
- excel vba 把内容放到剪贴板,以及把剪贴板的内容粘贴到表格中
- Agv、Rgv 车辆控制调度系统开发第四篇