大家好,欢迎来到IT知识分享网。
MVP 矩阵
是 Model-View-Projection 的缩写,是一种常用的投影变换矩阵。MVP 矩阵用于将一个三维模型坐标系中的坐标转换到屏幕二维坐标系中。它是由三个独立的矩阵组合而成:
- Model 矩阵(模型矩阵):用于在模型坐标系中定义模型的位置、旋转和缩放。
- View 矩阵(观察矩阵):用于在世界坐标系中定义观察者的位置和方向。
- Projection 矩阵(投影矩阵):用于在投影坐标系中定义投影的类型和范围。
MVP 矩阵是这三个矩阵的乘积,即:
MVP = Projection * View * Model。
在投影变换中,
首先使用 Model 矩阵在模型坐标系中定义物体的位置、旋转和缩放,
然后使用 View 矩阵定义观察者的位置和方向,
最后使用 Projection 矩阵定义投影类型和范围,并将三维模型的坐标转换为二维投影坐标。
每个矩阵都有不同的公式,它们取决于需要实现的投影变换类型,例如透视投影或正交投影等。下面是一些常用的公式
Model 矩阵
是一个变换矩阵,其中的数字描述了把物体的初始位置(在基于世界坐标系的坐标系中)映射到其最终位置(在基于观察者坐标系的坐标系中)的关系。它可以描述物体的平移(Translation)、旋转(Rotation)和缩放(Scaling)变换。
一般的,Model 矩阵的变换公式可以写成如下:
M = T * R * S
其中 T、R、S 分别表示 Translation,Rotation 和 Scaling 的变换矩阵。
模型矩阵变换顺序是从右往左的,所以以上矩阵变换公式等价于如下:
M = S * R * T
这个顺序决定了最终物体的变换顺序:先进行缩放、再进行旋转、最后进行平移。
下面是一个创建模型矩阵的代码示例:
#include <glm/gtc/matrix_transform.hpp> #include <glm/mat4x4.hpp> ... glm::mat4 model = glm::mat4(1.0f); model = glm::translate(model, position); model = glm::rotate(model, angle, axis); model = glm::scale(model, scale);
上面的代码使用了 glm 库的函数来创建模型矩阵。首先创建了一个初始化为单位矩阵的模型矩阵,然后通过 glm::translate 函数对其进行平移变换,通过 glm::rotate 函数对其进行旋转变换,最后通过 glm::scale 函数对其进行缩放变换。
position 变量表示平移的坐标,angle 变量表示旋转的角度,axis 变量表示旋转的轴,scale 变量表示缩放的比例。
View 矩阵(观察矩阵)
是一个用于把世界坐标系的物体转换到观察者的坐标系中的变换矩阵。它把相机的位置(位于世界坐标系中)转换为原点,并使相机的方向朝向长度单位的 z 轴的负方向,所以在 View 矩阵的作用下,物体的绝对位置在观察者的坐标系中变成了相对位置。
View 矩阵的变换公式可以用以下矩阵表示:
V = [R_x, R_y, R_z, T]
其中:
- R_x、R_y、R_z 是 x、y、z 轴上的旋转矩阵,它们表示了物体的相对位置;
- T 是平移矩阵,它表示了相机在世界坐标系中的位置。
这个矩阵乘以一个齐次坐标的向量表示的点的位置,会得到该点在观察者的坐标系中的相对位置。
下面是View矩阵的代码实现:
lessCopy code#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> glm::mat4 View = glm::lookAt( glm::vec3(4, 3, 3), //相机位置 glm::vec3(0, 0, 0), //目标点 glm::vec3(0, 1, 0) //相机朝上方向 );
上面代码使用了glm库,glm::lookAt函数用于创建一个View矩阵。该函数的三个参数分别是相机位置,目标点和相机朝上的方向。这个矩阵可以将任意的3D坐标变换到相机的观察空间。
投影变换
是指从三维空间的物体映射到二维的平面上的过程。这是通过将每个三维坐标的位置从一个三维空间中的点变换为在二维平面上的点,以便可以使用屏幕上的点对物体进行绘制的过程。
投影变换有很多不同的类型,其中包括透视投影(perspective projection)和正交投影(orthographic projection)。透视投影通过计算每个物体到观察者的距离,将三维空间映射到二维平面上。这样,物体远离观察者时,会看起来比较小,物体靠近观察者时,会看起来比较大。正交投影则不考虑观察者到物体的距离,因此物体始终具有相同的大小。
在投影变换过程中,通常使用矩阵变换进行计算。变换矩阵用来编码所有投影变换的信息,并将三维空间的每个点转换为二维平面上的点。使用矩阵乘以向量的方式来进行变换,以便快速计算出每个点的新位置
投影变换的公式
透视投影: 透视投影使用一个虚拟的观察点来投影三维空间中的物体到二维平面。透视投影的矩阵公式如下:
matrix = [ 2 * near / (right - left), 0, 0, 0, 0, 2 * near / (top - bottom), 0, 0, (right + left) / (right - left), (top + bottom) / (top - bottom), -(far + near) / (far - near), -1, 0, 0, -2 * far * near / (far - near), 0 ]
其中,near,far,left,right,top 和 bottom 分别代表了视景体的近裁剪面距离、远裁剪面距离、左侧、右侧、顶部和底部位置。
正交投影: 正交投影是一种沿着特定方向平行投影三维空间中的物体到二维平面的方法。正交投影的矩阵公式如下:
matrix = [ 2 / (right - left), 0, 0, 0, 0, 2 / (top - bottom), 0, 0, 0, 0, -2 / (far - near), 0, -(right + left) / (right - left), -(top + bottom) / (top - bottom), -(far + near) / (far - near), 1 ]
其中,near,far,left,right,top 和 bottom 分别代表了视景体的近裁剪面距离、远裁剪面距离、左侧、右侧、顶部和底部位置。
透视投影矩阵可以使用 OpenGL Mathematics (glm) 的 perspective 函数创建,如下:
#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> ... glm::mat4 projection = glm::perspective(glm::radians(45.0f), aspect, 0.1f, 100.0f);
其中,glm::radians 函数把角度转换为弧度,第一个参数是观察角度,第二个参数是窗口宽高比,第三个参数是近平面距离,第四个参数是远平面距离。
正交投影可以使用下面的代码创建正交投影矩阵:
cCopy code#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> glm::mat4 projection = glm::ortho(left, right, bottom, top, near, far);
其中 left,right,bottom 和 top 分别表示投影平面左、右、下、上的限制。near 和 far 分别表示投影平面近处和远处的限制。
这个矩阵可以用于将 3D 的坐标变换为 2D 的屏幕坐标,从而在 2D 的屏幕上呈现 3D 场景。
~~~ 码字不易,还想学习更多请关注我吧~~~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/96808.html