Xyz三维坐标系如下:左手坐标系
但是摄像机观察空间则是采用右手系:
右手法则判断叉乘的结果的方向;
正交矩阵(单位互相垂直的基矢量构成正交矩阵)具有逆与转置一致性;
列矩阵运算CBAv和行矩阵的运算vATBTCT一致;
平移变换不是一个线性变换;
仿射变换合并了线性变换和平移变换,在齐次坐标空间中进行;
纯平移、纯旋转和纯放缩的变换称为基础变换,那么一个齐次坐标矩阵如下:
其中M表示缩放和旋转,t表示平移,0表示0,1表示1;
为什么呢?
从C空间变到P空间的矩阵:
其中Oc是选取的原点,xcyczc是C下的P的基矢量(不一定要是单位的);
对于矢量从C空间变到P空间中,则只需要:
如果是正交矩阵的话,可以轻易地得到反推的矩阵(读取行即可);
[正交矩阵] 利用试探法写MA->B,已知B空间的基矢量是xbybzb(用A来描述),那么xb(用A系来描述B的x基矢量)经过A到B的转换后,得到的应该是100;
模型变换:从模型空间到世界空间;
先缩放、后旋转、后平移;
摄像机的放置:缩放(不缩放)、旋转(镜头的旋转)、平移(镜头的平移),即摄像机有一个transform;由于观察空间是一个右手系,所以对z进行取反,即和[1000; 0100 ;00-10 ; 0001]相乘,得到观察变换矩阵,也就是以镜头位置为原点,以镜头指向为坐标轴(其中镜头后方为+z)的坐标系;
齐次裁剪空间,这个空间的变换矩阵称为裁剪矩阵或者投影矩阵;
利用三角形关系和FOV可以知道近裁平面和远裁平面的高度
Aspect是宽高比,那么从观察空间(摄像机做原点)到裁剪空间为:
经过裁剪变换后,所有不满足xyz限定在±w内的片元都被丢弃;
正交投影的裁剪变换如下:
所有不满足xyz在±1以内的,都被裁剪;
透视除法:就是用w分量去除以xyz分量(限定在了-1到1的立方体内)
正交投影的齐次除法就是除以1:
在Unity中屏幕空间左上角是原点,右下角是pixelW和pixelH,那么就有最后一个从齐次除法后到屏幕映射:
其中clipx是裁剪空间中的x,clipw是裁剪空间中的w;
为了将法向量从A空间变换到B空间,直接和Mab相乘是不对的。变换到B切线方向记为Tb,Nb记为变换到B的法线方向,那么满足点积为零的约束:(我们希望求得G表示法线从A到B的变换矩阵)
如果Mab是正交矩阵(即旋转),那么直接和Mab相乘是正确的,如果带有统一放缩k,那么;