QT+ OpenGL 变换

简介: 我们需要改变物体的位置现有解决办法(每一帧,改变顶点位置(所有顶点))每个顶点使用向量表示,使用矩阵表示对应顶点的操作。

QT+ OpenGL

本篇完整工程见gitee:QTOpenGL 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主。


变换

我们需要改变物体的位置

现有解决办法(每一帧,改变顶点位置(所有顶点))

每个顶点使用向量表示,使用矩阵表示对应顶点的操作。


向量的运算

向量是有方向和大小的量

屏幕截图 2023-08-03 143642.png

向量与标量运算

标量(Scalar)只是一个数字(或者说是仅有一个分量的向量)。当把一个向量加/减/乘/除一个标量,我们可以简单的把向量的每个分量分别进行该运算。对于加法来说会像这样:

屏幕截图 2023-08-03 143913.png

其中的+可以是+,-,·或÷,其中·是乘号。注意-和÷运算时不能颠倒(标量-/÷向量),因为颠倒的运算是没有定义的。

向量取反

屏幕截图 2023-08-03 144019.png

向量加减

屏幕截图 2023-08-03 144029.png

长度

屏幕截图 2023-08-03 144040.png

向量相乘

屏幕截图 2023-08-03 144358.png

矩阵

一个矩形的数字、符号或者表达式的数组。矩阵中的每一项叫做矩阵的元素

屏幕截图 2023-08-03 144501.png

矩阵的加减

矩阵与标量之间的加减定义如下

屏幕截图 2023-08-03 144511.png

矩阵与矩阵之间的加减就是两个矩阵对应元素的加减运算

屏幕截图 2023-08-03 144521.png

矩阵的数乘

和矩阵与标量的加减一样,矩阵与标量之间的乘法也是矩阵的每一个元素分别乘以该标量。

屏幕截图 2023-08-03 144529.png

矩阵相乘

矩阵之间的乘法不见得有多复杂,但的确很难让人适应。矩阵乘法基本上意味着遵照规定好的法则进行相乘。当然,相乘还有一些限制:


1.只有当左侧矩阵的列数与右侧矩阵的行数相等,两个矩阵才能相乘。

2.矩阵相乘不遵守交换律(Commutative),也就是说A ⋅ B ≠ B ⋅ A

公式如下:

屏幕截图 2023-08-03 144911.png

矩阵与向量相乘

向量就是一个N × 1 N \times 1N×1的矩阵


单位矩阵就是一个除了对角线以为都是0的 N × N N \times NN×N的矩阵

屏幕截图 2023-08-03 145118.png

缩放

OpenGL通常是在3D空间进行操作的,对于2D的情况我们可以把z轴缩放1倍,这样z轴的值就不变了。我们刚刚的缩放操作是不均匀(Non-uniform)缩放,因为每个轴的缩放因子(Scaling Factor)都不一样。如果每个轴的缩放因子都一样那么就叫均匀缩放(Uniform Scale)。

屏幕截图 2023-08-03 145128.png

位移

位移(Translation)是在原始向量的基础上加上另一个向量从而获得一个在不同位置的新向量的过程,从而在位移向量基础上移动了原始向量。我们已经讨论了向量加法,所以这应该不会太陌生。

屏幕截图 2023-08-03 145137.png

齐次坐标(Homogeneous Coordinates)

向量的w分量也叫齐次坐标。想要从齐次向量得到3D向量,我们可以把x、y和z坐标分别除以w坐标。我们通常不会注意这个问题,因为w分量通常是1.0。使用齐次坐标有几点好处:它允许我们在3D向量上进行位移(如果没有w分量我们是不能位移向量的),而且下一章我们会用w值创建3D视觉效果。


如果一个向量的齐次坐标是0,这个坐标就是方向向量(Direction Vector),因为w坐标是0,这个向量就不能位移(译注:这也就是我们说的不能位移一个方向)。


旋转

大多数旋转函数需要用弧度制的角:


●  弧度转角度:角度 = 弧度 × ( 180.0 / π )

●  角度转弧度:弧度 = 角度 × ( π / 180.0 )


沿着x轴旋转:

屏幕截图 2023-08-03 145510.png

沿着y轴旋转:

屏幕截图 2023-08-03 145518.png

沿着z轴旋转:

屏幕截图 2023-08-03 145526.png

矩阵的组合

使用矩阵进行变换的真正力量在于,根据矩阵之间的乘法,我们可以把多个变换组合到一个矩阵中。让我们看看我们是否能生成一个变换矩阵,让它组合多个变换。假设我们有一个顶点(x, y, z),我们希望将其缩放2倍,然后位移(1, 2, 3)个单位。我们需要一个位移和缩放矩阵来完成这些变换。结果的变换矩阵看起来像这样:

屏幕截图 2023-08-03 145722.png

用最终的变换矩阵左乘我们的向量会得到以下结果:

屏幕截图 2023-08-03 145730.png

代码实现

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 1) in vec2 aTexCord;
out vec3 ourColor; // 向片段着色器输出一个颜色
out vec2 texCord; // 向片段着色器输出一个颜色
uniform mat4 RotationMatrix;
void main()
{
  gl_Position = RotationMatrix * vec4(aPos, 1.0);
  ourColor = aColor; // 将ourColor设置为我们从顶点数据那里得到的输入颜色
  texCord = aTexCord;
}
QMatrix4x4 matrix;
unsigned int time = QTime::currentTime().msec();
matrix.translate(3,3);
matrix.rotate(time, 0.0f, 0.0f, 1.0f);
...
shader_program_.setUniformValue("RotationMatrix", matrix);


目录
相关文章
|
6月前
QT4.7版本的OPENGL的3D旋转模型例子
QT4.7版本的OPENGL的3D旋转模型例子
127 0
QT+OpenGL鼠标操作和模型控制
光线追踪法 从鼠标投射 3D 射线, 通过摄像机,进入场景,然后检查该光线是否与某个对象相交。
348 0
|
3月前
|
Linux
关于linux的qt发布(linuxdeployqt)中opengl版本过高的解决
关于linux的qt发布(linuxdeployqt)中opengl版本过高的解决
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
36 0
|
6月前
|
机器学习/深度学习 API vr&ar
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
950 4
|
异构计算
QT+OpenGL高级数据和高级GLSL
● OpenGL中的缓冲区 对象管理特定的GPU内存 ● 在将缓冲区绑定到特定的缓冲区目标时候赋予它意义 ● OpenGL在内部会保存每个目标(缓冲区)的引用,并且根据目标以不同的方式处理缓冲区。
152 0
QT+OpenGL高级数据和高级GLSL
|
6月前
|
Linux API iOS开发
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
200 0
|
存储 异构计算
QT+OpenGL深度测试
在前面的文章中,我们渲染了一个3D箱子,并且运用了深度缓冲来防止阻挡的面渲染到其他面的前面。 现在大部分的GPU都提供一个叫做提前深度测试(Early Depth Testing)的硬件特性。提前深度测试允许深度测试在片段着色器之前运行。只要我们清楚一个片段永远不会是可见的(它在其他物体之后),我们就能提前丢弃这个片段。
123 0
QT+OpenGL 摄像机
OpenGL本身没有摄像机的定义,但是我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉。
172 0
|
6月前
Qt+OpenGL 打砖块游戏
Qt+OpenGL 打砖块游戏
73 0

推荐镜像

更多