向量运算
矩阵运算
比较基础就不记录了
MVP矩阵推导
1.讲为什么要有矩阵变换和不同的坐标空间
- 将3D物体转化到2D平面
- 为各个空间的运用做准备
2.介绍各个空间的概念和含义
MVP矩阵代表什么?
MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。
OS = 模型原点为坐标系原点的空间坐标系 = 模型空间
WS = 世界空间为坐标原点的空间坐标系 = 世界空间
VS = 摄像机为坐标系原点的空间坐标系 = 视觉空间
CS = 裁剪空间 确定像素是否位于可见范围内
SS = 屏幕空间 显示平面 根据平台不同 坐标原点不同 分别位于左下或者左上 OPENGL屏幕坐标系原点在左下角向上向右增加,D3D屏幕坐标系原点在左上角向下向右增加。
WS = OS * M矩阵
VS = WS * V矩阵
CS = VS * P矩阵
CS得到的坐标经过齐次除法(透视除法)和映射输出 得到SS的二维坐标 (一般unity自动在底层进行 所以我们只要得到裁剪空间内的坐标即可)
注:五个空间中 只有观察空间(VS)是右手坐标系 剩余 都是左手坐标系
M:模型空间->世界空间
模型空间:以自身为中心的空间坐标系
3dmax采用右手坐标系
世界空间:以世界为中心的空间坐标系
unity中左手坐标系
M矩阵的作用:让游戏对象的顶点坐标从模型空间转换到世界空间
从模型空间变换到世界空间步骤:
- 第一步进行了缩放
- 第二步进行了旋转
- 第三步进行了平移
顶点坐标的变换顺序(变换顺序不能改变)
世界坐标变换要先缩放、后旋转、再平移的原因
对应的依次进行矩阵变换得出变换矩阵
读矩阵需要从右往左读
V :世界空间->视觉空间
以摄像机为中心的空间坐标系(v空间的z是朝向相机后面的)
M矩阵的作用:从世界空间变换到摄像机空间
求V矩阵思路:
- 平移整个观察空间,摄像机原点和世界坐标原点重合,坐标轴重合
- 摄像机是在世界空间中是先旋转,再平移
- 为了让摄像机与世界坐标重合,逆变换
摄像机在世界空间中是先旋转,再平移的,所以我想,如果想要物体在世界空间下以视觉空间为坐标变换到原点,就要逆着先平移后旋转吧。
从世界空间变换到摄像机空间步骤:
- 第一步进行平移
- 第二步进行旋转
- 第三步Z分量取反(左手坐标系的原因)
左手坐标系的原因:在unity中,它的摄像机空间的正方形是负z的方向,如果按正常的来说,视觉空间下的坐标正方向应该是摄像机的正方形,但unity是左手坐标系,所以要取反)
对应的依次进行矩阵变换得出变换矩阵
P :视觉空间->裁剪空间
1.不是真正的投影,为投影做准备。
2.目的:判断顶点是否在可见范围内。
3.P矩阵:对x,y,z分量进行缩放,用w分量做范围值。如果x,y,z都在w范围内,那么该点在裁剪空间内。
透视投影
那么计算出near、far、w有什么用呢?
我想近平面时w=near,远平面时w=far,一个物体有顶点构成这些顶点在裁剪空间下具有(x,y,z)坐标,如果这个顶点想要出现在视锥体内,也就是被看见,该顶点在可见范围内,方便为之后的投影做准备,那么其xyz就要分别大于-w小于w,多余部分就被裁剪掉,不出现在屏幕上。这也是p矩阵起到的作用。
正交投影
3.推导MVP变换矩阵
Model Matrix
View Matrix
Projection Matrix
4.考虑找一些对应空间操作的例子
世界空间的应用
不规则平面的Tilling:以世界坐标当做uv进行采样
视觉空间的应用
根据摄像机距离显隐变换的云朵
模型空间,世界空间,观察空间的区别
模型空间
模型空间是和某个模型或者说是对象有关的。有时模型空间也被称为对象空间或局部空间。每个模型都有自己独立的坐标空间,当它移动或旋转的时候,模型空间也会跟着它移动和旋转。比如自己的游戏模型,我们移动的时候我们的模型空间也在跟着移动,我们转身时本身的前后左右方向也跟着改变。
世界空间
世界空间是一个特殊的坐标系,因为它建立了我们所关心的最大的空间。世界空间可以被用于描述绝对位置(这里指的是世界坐标系中的位置),通常我们把世界空间的原点放置在游戏空间的中心。
在 unity 中,除了观察空间(摄像机空间),所有的空间坐标系都是使用的左手坐标系。很多的效果都是要在世界空间中完成的。
观察空间(摄像机空间)
最大的区别在于在观察空间中我们使用的是右手坐标系,而这个是符合OpenGL的,在观察空间中我们需要把世界空间的顶点转换到观察空间,为此我们需要求的观察空间的变换矩阵,因为坐标系的不同,所以我们需要对z轴取反,并求得逆变换,在观察空间还有一项就是需要将观察空间的顶点转换到裁剪空间(也被称为齐次裁剪空间),这个用于变换的矩阵叫做裁剪矩阵,也被称为投影矩阵,在观察空间中并不是真正的投影,而是准备投影的数据,即那些顶点需要保留,那些需要剔除,这是由投影方式决定的。