OS = 模型原点为坐标系原点的空间坐标系 = 模型空间
WS = 世界空间为坐标原点的空间坐标系 = 世界空间
VS = 摄像机为坐标系原点的空间坐标系 = 视觉空间
CS = 裁剪空间 确定像素是否位于可见范围内
SS = 屏幕空间 显示平面 根据平台不同 坐标原点不同 分别位于左下或者左上 OPENGL屏幕坐标系原点在左下角向上向右增加,D3D屏幕坐标系原点在左上角向下向右增加。
WS = OS * M矩阵
VS = WS * V矩阵
CS = VS * P矩阵
CS得到的坐标经过齐次除法(透视除法)和映射输出 得到SS的二维坐标 (一般unity自动在底层进行 所以我们只要得到裁剪空间内的坐标即可)
注:五个空间中 只有观察空间(VS)是右手坐标系 剩余 都是左手坐标系
MVP矩阵代表什么
M矩阵
模型空间是以自身中心为原点的空间坐标系
世界空间是以世界中心为原点的空间坐标系
如上图的小车在3Dmax里的坐标系为模型坐标系,在U3D里则是以世界坐标系为基准,从3Dmax里的(1,1,1)变成U3D的(-1,1,3),我们通过M矩阵进行变换。
依次进行了:缩放→旋转→平移(顺序不能改变)从右往左计算,得到世界空间下的顶点坐标。
V矩阵
视觉空间:以摄像机为原点的坐标系
平移整个观察空间,让摄像机的原点处于世界坐标的原点且令坐标轴和世界空间重合,再对z轴分量取反。
- 平移
- 旋转
- 对Z轴取反(因为世界空间坐标系是左手坐标系,而视觉空间的坐标系是右手坐标系,所以我们需要对Z分量进行取反)
P矩阵
P矩阵的目的
判断顶点是否在可见范围内,若在可见范围内即渲染出来,若不在范围内则将该顶点剔除掉,对于裁剪的图形,在裁剪的位置生成新的顶点来代替。
透视投影
透视投影(左图):符合我们人眼视觉的投影,即近大远小。(常用于3D游戏)
Near代表相机的最近距离(也就是近裁范围),Far代表相机能看到最远距离(也就是远裁范围)FOV为相机的可视距离nearClipPlaneHeight代表相机视野梯形中的上底边,farClipPlaneHeight则是对应下底边,Aspect是屏幕纵横比(16:9,5:4什么的),最后算的P矩阵(固定的公式)如左上。用视觉空间的点的坐标乘P矩阵得到裁剪空间下的点坐标,然后再比较xyz与w范围值的关系,判断该点是否在视锥体内可见
正交投影
MVP矩阵的应用
世界空间的应用
- 模型空间下。用M矩阵把模型空间的顶点转换到世界空间
- 世界空间的顶点坐标当作uv进行采样
视觉空间的应用
- 根据向着camera的z坐标的大小(云和camera的距离)来控制云朵的显隐
- 得到视觉空间的顶点坐标
- 在片元着色器中根据z坐标的值,用数学公式调整云的显隐
P矩阵的推导
按GAMES101的推导方法知乎 - 安全中心
https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV1X7411F744%3Fp%3D4
正交投影矩阵
用[l,r][b,t][f,n]描述空间中的立方体映射到一个标准正规的立方体
先把立方体中心移到原点,把XYZ分别拉成[-1,1]
缩放系数为2/(r-l),正交投影矩阵Mortho = Mscale*Mtranslate。OpenGL是右手系
透视投影矩阵
1.把视锥体远平面压缩成长方体
2.使用正交投影矩阵就可以变换到正方体中
我们规定三个原则
1.近平面的所有点坐标不变
2.远平面的所有点坐标z值不变 都是f
3.远平面的中心点坐标值不变 为(0,0,f)
根据相似三角形可得
作业推导P矩阵
字丑见谅呜呜
补一个101推导方法的链接 [图形学笔记]推导投影矩阵 - 知乎