QT+OpenGL三之矩阵简解

我们只针对可编译管线因为这样效率高。(这里是个人理解)

1.模型矩阵:modo_matrix

本质:

就是管理模型当前顶点的矩阵。可以理解成我们在现实世界中有一个星球叫火星,无论我们看不看它(通常看不见),它都在那里位移和旋转。这时模型矩阵就是火星自己的矩阵。它包含了自己的(位移、旋转、缩放)矩阵的集合。当然有就相乘没有就算了。

作用:

用于改变模型所有顶点的状态。(强调排除一切其他知识的影响,这就是物体自己的本质特性)

运算:

M=P(缩放)*R(旋转矩阵)*T(位移矩阵)*Point(每个顶点)
最后算顶点效率会非常高。

2.视图矩阵:view_matrix

本质:

用来影响我们的视点的矩阵,这个矩阵与摄像机状态关系非常密切。大家或许可以想象成我们的眼睛。这也是我们根据现实生活的理解,这样想是没有错的。但在算法中实际上是我们使用期望相机的位置和看向的方向来作用于3D空间中的每个点,屏幕中渲染的始终都是各种运算之后的结果。(这个结果是2D的结果,也就是3D数据最后运算成像素的结果)。从算法的理解来讲实际上摄像机没有动,而是世界中的物体被影响在动。这样想我们就知道这个摄像机是我们现象出的位置,我们把这个位置当作参数传入矩阵,就会达到我们期望的目的。这或许难以理解,我们可以想象成,我们想看的地方的物体,实际上随着我们的意念(这个意念就是算法)在动。
好比我们用手机拍摄水杯,手机不能动,但我想看水杯的右边,我可以把水杯往左边移动一点。这样也能达到和移动手机相同的效果。
说到这要说一下相机的位置,相机的初始位置在(0,0,0)的位置看向z轴负方向(0,0,-1)。这个位置也就固定了,随后都是用期望相机的位置参与矩阵运算,来影响物体。如果我们只看结论(从现实生活的角度思考),我们可以这样想,相机的期望位置是由我们给的参数决定。

作用:

很明确就是用来达到在不同位置看向某个点的目的。(实际上是改变物体的属性)

运算:

如果我们自己构建的话,v矩阵相机的位置可以包含相机的旋转角度和平移矩阵,
这时矩阵的位置参数就是相机的位置取反(期望相机位置)。方向没有旋转就不乘。
这样的话:V=R(相机旋转)*T(相机位置取反)。
但这样一来R就复杂了,旋转就会3个方向绕x,y,z轴。构建起来麻烦。好在OpenGL有个lookAt()矩阵能直接简单的达到这个目的。所以我们可以V=gluLookAt(...)但最数学库V=glm::lookAt()来构建。这样可以认为的来让V*M高效的构成MV模型视口矩阵再发送给统一变量。实际上lookat()矩阵的构建算法就是在构建相机的视线坐标系(现象出来的坐标系),是通过视点和位置和世界坐标系y轴来构建矩阵,最后作用于所有物体。他需要三个参数即eye(视线),center(视点),up(y轴)

3.透视投影矩阵:prespective_matrix

本质:

上面所说的摄像机其实是视点,就是看向哪个方向的哪一点,但是我们要看的是一个空间而不是点,这时我们就需要视野,这个矩阵就是在给我们提供视野。好比我们的眼睛,能把从一点扩散出一个圆锥体空间的物体投影在视网膜上。但是在电脑上一般屏幕是矩形的,所以我们最常用的就是以屏幕扩散出一个棱锥体的空间,将其投影在屏幕上。为啥是锥体,因为要体现一种近大远小的视觉效果(透视效果)。

作用:

通过获取屏幕纵横比和垂直角度等来构建要把物体投影出来的矩阵。

运算:

glm::perspective()

最终shader:

gl_position=p*mv*point
当然我主要讲的的理解没有推到,也没有图片因为网上到处都是,图片和推导步骤,但是我们写程序是很多都已经封装成函数如glm::,最难的是理解。我没理解的时候我看着函数或者矩阵等就感觉莫名奇妙,完全不懂。但是理清了矩阵的含义就容易看懂代码和推导了。

4.空间

实际上shader中存在空间这种概念

模型空间(又称局部空间):

模型空间就是指,物体本身处在的空间。当我们刚刚拿到或者用3DMAX这种工具绘制出一个模型,这个模型就拥有了一系列属性,如顶点坐标、索引。那么这时我们解析出来的数据在还没有与矩阵作用时。就处在物体空间。就算我们用OpenGL进行绘制,他也是处在一个模型属性一开始定义好的位置(初始位置)。

世界空间:

顾名思义,他是指在世界坐标系下的空间。也就是模型数据在与模型矩阵作用后,所处在的空间。通常我们会进行位移、缩放、旋转。

视觉空间(又称相机空间)

相机被OpenGL默认为在世界坐标系的(0,0,0)处看向Z轴负方向也就是视点(0,0,-1)。他是用来告诉窗口,我们所看到的空间中的所有点在什么位置。当与模型矩阵相结合后作用与每个点后,每个点就没被影响到相应的视线空间的位置。这时模型就处在相机空间中。注意相机空间,相机永远在世界坐标的原点。

剪切空间(也就是投影空间)

它是用来告诉屏幕我们需要看到的视野范围,在范围视野之外就应该被剪切(丢弃)。通常是棱锥装的投影体,当前面所说的模型、视图矩阵和投影矩阵相结合时,模型就会处在剪切空间中。最后屏幕上看到的是上面处理后的最终效果。

目录

VSC++2019+QT+OpenGL
QT+OpenGL一之绘制立方体(三角形图元)
QT+OpenGL二之纹理贴图
QT+OpenGL三之矩阵简解
QT+OpenGL四之相机的移动和旋转
QT+OpenGL五之绘制不同的模型(vao,vbo机制)
QT+OpenGL六之天空盒
QT+OpenGL七之使用EBO
QT+OPenGL八之模型准备
QT+OPenGL九之模型解码
QT+OPenGL十之光照模型
QT+OPenGL十一之漫反射和镜面反射贴图
QT+OPenGL十二之定向光
QT+OPenGL十三之真正的点光源和聚光灯
QT+OPenGL十四之多光源混合的问题
QT+OPenGL十五之深度缓冲区
QT+OPenGL十六之模板缓冲区
QT+OPenGL十七帧缓冲区(离屏渲染)
QT+OPenGL十八抗锯齿
QT+OPenGL十九镜面反射效率调整
QT+OPenGL二十Gamma校正

你可能感兴趣的:(QT+OpenGL三之矩阵简解)