US2S1L16——正交投影变换
正交投影变换
明确正交投影变换目标
我们这节课的目标就是要得到 将摄像机视锥体的 正交投影 空间 转换到 齐次坐标裁剪空间 时的 变换矩阵
我们可以将其分成两步来完成:
- 将视锥体中心位移到观察空间原点中心
- 将长方体视锥体的**x,y,z坐标范围映射到(−1,1)长宽高为2的正方体中**
Unity中正交投影重要参数
Camera详细参数可见:U1L10-1——Camera可编辑参数相关,正交投影相关具体参数:Projection,Clipping Planes
-
Projection - 摄像机投影模式
-
Clipping Planes - 裁剪平面距离
- Near:近裁剪面离摄像机的距离
- Far:远裁剪面离摄像机的距离
利用已知参数,获取到远近裁剪面的高度
现在我们已经可以得到:近裁剪面高 = 远裁剪面高 = 2 * Size
我们还可以知道远近裁剪面的宽,可以通过摄像机参数Camera.aspect得到Game窗口的宽高比
1
| print(Camera.main.aspect);
|
Aspect = 宽 : 高 = 宽 / 高
因此可以得到:近裁剪面高 = 远裁剪面高 = Aspect * 2 * Size
于是,现在我们就可以得到在观察空间下,视锥体各个点的坐标:
正交投影变换矩阵
我们已经知道,我们需要通过以下两步来进行矩阵变换:
-
将视锥体中心位移到观察空间原点中心
-
我们只需要对视锥体进行 Z 方向的平移,X、Y 方向是不需要变换的。
因此第一步的变换矩阵的结构一定是一个平移矩阵:
10000100001000Z1
我们只需要求出该平移变换矩阵中 Z 应该平移多少即可
-
已知远近裁剪面离摄像机的距离为 Near 和 Far ,而观察空间中 Z 方向是摄像机后方,
因此可知 视锥体中心点的 Z 坐标为:
Z=2(−Near)+(−Far)
知道了视锥体中心点的 Z 坐标,那么我们只需要将视锥体平移 −2(−Near)+(−Far) 个单位即可
所以,平移矩阵为:
10000100001000Z1=10000100001000−2(−Near)+(−Far)1=100001000010002Near+Far1
-
将长方体视锥体的x,y,z坐标范围映射到(−1,1)长宽高为2的正方体中
我们可以得到观察空间中的xyz和齐次坐标系中x,y,z的关系如下图:
根据这个关系图,可以得到一些转换公式:
⎩⎨⎧X齐=2×Aspect×Size2X观Y齐=2×Size2Y观Z未取反=−Near−(−Far)2Z观=Far−Near2Z观
由于要将右手坐标系(观察空间)转换为左手坐标系(裁剪空间),因此要对z轴取反,最终得到公式:
⎩⎨⎧X齐=2×Aspect×Size2X观=Aspect×Size1X观Y齐=2×Size2Y观=Size1Y观Z齐=−Far−Near2Z观
不难发现,这其实就是一个缩放变换,因此根据上面的公式,得到一个缩放矩阵:
Aspect×Size10000Size10000−Far−Near200001
我们现在得到了两步的对应平移平移矩阵和缩放矩阵,我们将其进行乘法计算后,
便可以得到将摄像机视锥体的 正交投影空间 转换到 齐次坐标裁剪空间 时的变换矩阵
Aspect×Size10000Size10000−Far−Near200001100001000010002Near+Far1=Aspect×Size10000Size10000−Far−Near2000−Far−NearNear+Far1