图形的变换

作者: Orient_ZY | 来源:发表于2017-07-19 16:03 被阅读93次

在了解矩阵的变换之后,我们就可以开始对图形进行变换。这里使用的变换图形是之前绘制出来的笑脸箱子。欢迎光临我的个人网站Orient一起讨论学习。这里是我的GitHub,如果您喜欢,不妨点个 star。☺

数学库包

首先我们需要引入专门为OpenGL量身定做的数学库——GLM(OpenGL Mathematics)
我们可以从它的网站上下载。

GLM的网站可能需要通过VPN访问,如果你无法访问,你可以点击这里进行下载。如果你使用的是Visual Studio 2017 ,那么在你搭建完开发环境后,你可以直接引入GLM的相关头文件

我们需要引入以下3个头文件:

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

变换

uniform

在变换之前,我们需要修改顶点着色器,让其接收一个 mat4uniform 变量,然后在用矩阵 uniform 乘以位置向量:

#version 430 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(aPos, 1.0f);
    TexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y);
}

变换矩阵

首先我们把箱子逆时针旋转90度(沿着Z轴旋转),然后缩放0.5倍。我们需要创建变换矩阵:

glm::mat4 transfrom
transform = glm::rotate(transform, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
transform = glm::scal(transform, glm::vec3(0.5, 0.5, 0.5));

可以看到,变换顺序和程序编写顺序刚好相反。在程序中,我们先写出旋转变换,然后再写缩放变换

glm::rotate 函数是旋转函数。GLM希望旋转的角度是弧度制,所以使用了 glm::radians 对角度进行转换。同时我们的纹理是在 XY 平面上,所以我们把它绕着Z轴
(0.0, 0.0, 1.0) 进行旋转。
glm::scal 函数是缩放函数,我们需要将纹理图像对应的轴缩放 (0.5, 0.5, 0.5) 倍。

把变换矩阵传递给着色器

unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));

首先用 glGetUniformLocation 函数查询了 uniform 变量地址。

然后用 glUniformMatrix4fv 函数把矩阵数据发送给着色器。
第一个参数是 uniform 的位置值;
第二个参数告诉OpenGL发送的矩阵个数,这里是1;
第三个参数确定是否进行矩阵置换(交换行和列)。GLM中不需要,所以设置为 GL_FALSE;
第四个参数是矩阵数据,但GLM并不是把矩阵存储为OpenGL期望接受的格式,因此这里用 glm::value_ptr 函数变换数据。

以上完成了纹理图像的缩放旋转

接下来我们让纹理图像随着时间变换而不断旋转

我们只需要将变换矩阵更改成如下形式即可:

glm::mat4 transform;
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

glm::translate 函数是位移函数,将纹理图像位移了 (0.5, -0.5, 0.0) 个单位,将纹理图像位移到了屏幕的右下角。

我们把旋转函数的第二个参数改成了 glfwGetTime(),因此纹理图像旋转的弧度是随着运行时间的增加而不断增加的。

运行效果如下:


动图加载可能有点慢动图加载可能有点慢

本文的代码可在这里找到,如果对您有所帮助,不妨点个赞。☺

相关文章

  • 图形的变换

    在了解矩阵的变换之后,我们就可以开始对图形进行变换。这里使用的变换图形是之前绘制出来的笑脸箱子。欢迎光临我的个人网...

  • ios 二维图形变换原理探究

    讲一下我对二维图形变换的理解。 图形变换的代码(CGContextScaleCTM, CGContextRotat...

  • 图形变换

  • 图形变换

    控件,图形都支持变换 本质是对Transform类型的依赖属性操作UIElement,对RenderTransfo...

  • Canvas教程(13)——平移变换

    图形变换 从今天开始,我们就开始谈一谈图形变换。图形变换是指用数学方法调整所绘形状的物理属性,其实质是坐标变形。所...

  • 图形的运动、变换

    图形的运动、变换,可以帮助我们一题多解,并且可以把一个很难的题变成一个简单的题,把没有学过的图形变成学过的图形。 ...

  • OpenGLES入门(三)

    上一章中还是对平面图形的绘制和简单的图形变换,在本章中将会开始绘制简单的3D图形,并对图形进行组合变换。 开始学习...

  • 旋转是不是转圈?

    要求预习《图形的旋转》。 晚上在qq中发问题:你以前学过哪些图形变换?你是怎样研究这些图形变换的?你是怎样得出平移...

  • CGAffineTransform

    CGAffineTransform用于绘制2D图形的仿射变换矩阵。 仿射变换矩阵用于旋转,缩放,平移或倾斜在图形上...

  • 研修日志——20180110

    一、几何变换 图形与几何板块必须严格的通过几何变换学几何,在几何变换中,保持不变的性质。 图形与几何学习的第一阶段...

网友评论

    本文标题:图形的变换

    本文链接:https://www.haomeiwen.com/subject/ygulkxtx.html