不同空间的坐标转换部分的内容。p矩阵推导不知道对不对捏

链接:【技术美术百人计划】图形 1.2.3 MVP矩阵运算

笔记

为什么学矩阵变换

  1. 将3D物体转换到2D平面
  2. 掌握矩阵变换过程才能运用矩阵变换达到自己想要的目的

MVP矩阵是什么

MVP矩阵表示的是模型(Model)观察(View)投影(Projection)三个矩阵。
起始情况获得的物体坐标位于局部空间(Local Space)下,将它的坐标称为局部坐标(Local Coordinate)
之后需要依次转换到世界坐标(World Coordinate)观察坐标(View Coordinate)裁剪坐标(Clip Coordinate),最后转为屏幕坐标(Screen Coordinate)

M矩阵

将坐标从模型空间转换到世界空间
模型空间:以模型自身为中心的坐标空间
世界空间:世界为中心的坐标空间

操作矩阵

$M=\left[\begin{matrix} 1&0&0&tx\newline 0&1&0&ty\newline 0&0&1&tz\newline 0&0&0&1\newline \end{matrix}\right] \left[\begin{matrix} cos\theta &0&sin\theta&0\newline 0&1&0&0\newline -sin\theta&0&cos\theta&0\newline 0&0&0&1\newline \end{matrix}\right] \left[\begin{matrix} kx&0&0&0\newline 0&ky&0&0\newline 0&0&kz&0\newline 0&0&0&1\newline \end{matrix}\right] $
从右到左进行计算

  1. 进行缩放操作
  2. 进行旋转操作
  3. 进行平移操作

V矩阵

将坐标从世界空间转换到摄像机为中心的观察空间
相当于把摄像头从它自己的局部空间转换到世界空间操作的逆操作。因为摄像头没有大小,本身就是观察空间的原点,不需要缩放。

操作矩阵

$M=\left[\begin{matrix} 1&0&0&0\newline 0&cos\theta&-sin\theta&0\newline 0&sin\theta&cos\theta&0\newline 0&0&0&1\newline \end{matrix}\right] \left[\begin{matrix} 1&0&0&tx\newline 0&1&0&ty\newline 0&0&1&tz\newline 0&0&0&1\newline \end{matrix}\right] $
unity下使用的是左手坐标系,但是观察空间用的右手坐标系。所以z分量需要取反。所以在unity中应该这样 $M=\left[\begin{matrix} 1 & 0 & 0 & 0 \newline 0 & 1 & 0 & 0 \newline 0 & 0 & -1&0 \newline 0 & 0 & 0 & 1 \end{matrix}\right] \left[\begin{matrix} 1&0&0&0\newline 0&cos\theta&-sin\theta&0\newline 0&sin\theta&cos\theta&0\newline 0&0&0&1\newline \end{matrix}\right] \left[\begin{matrix} 1&0&0&tx\newline 0&1&0&ty\newline 0&0&1&tz\newline 0&0&0&1\newline \end{matrix}\right] $

P矩阵

这东西看视频没看懂。入门精要讲的要详细易懂些。https://candycat1992.github.io/unity_shaders_book/unity_shaders_book_chapter_4.pdf
将观察空间下的坐标转换到其次裁剪空间下。对x,y,z分量进行缩放。并没有真的做投影操作。
变换后的矩阵里w分量正好具有特殊意义,可以用来裁剪视锥体外的顶点。
只要满足$\begin{cases} -w \leq x \leq w \newline -w \leq y \leq w \newline -w \leq z \leq w\end{cases}$的顶点就能保留下来

透视投影

满足近大远小的透视规则。视锥体是个平截头四棱锥。

正交投影

没有透视关系。视锥体是个长方体。

操作矩阵

透视投影: $P=\left[\begin{matrix} \frac{cot\frac{FOV}{2}}{Aspect} & 0 & 0 & 0 \newline 0 & cot\frac{FOV}{2} & 0 & 0 \newline 0 & 0 & \frac{Far+Near}{Far-Near} & -\frac{2\cdot Near\cdot Far}{Far-Near} \newline 0 & 0 & -1 & 0 \end{matrix}\right]$
正交投影: $P=\left[\begin{matrix} \frac{1}{Aspect\cdot Size} & 0 & 0 & 0 \newline 0 & \frac{1}{Size} & 0 & 0 \newline 0 & 0 & -\frac{2}{Far-Near} & -\frac{Far+Near}{Far-Near} \newline 0 & 0 & 0 & 1 \end{matrix}\right]$

各个参数含义参考精要PDF84页

应用

  • 世界空间:顶点坐标乘以M矩阵转换为世界空间坐标,取zx作为uv进行采样可以获得不规则平面的Tilling。
  • 视觉空间:顶点坐标转换到视觉空间下,根据远近距离显隐变换。

光栅化补充

光栅化过程

作业

模型空间、世界空间、视野空间的区别

模型空间

每个模型独立的空间坐标系。以模型中心为原点。

世界空间

以世界中心为原点,整个世界独一无二的坐标系。

视野空间

以摄像机为原点,每个摄像机各自拥有各自的视野空间。

推导p矩阵

这部分参考的GAMES101

正交投影

正交投影
基本思想是。先把视锥体的中心点平移到坐标原点,然后缩放到每个分量[-1,1]范围内的一个规范视域体
按照入门精要这里的插图描述,视锥体中心点为$\left[0, 0, -\frac{Far-Near}{2}\right]^T$
平移矩阵$M_{Trans} = \left[\begin{matrix} 1 & 0 & 0 & 0 \newline 0 & 1 & 0 & 0 \newline 0 & 0 & 1 & -\frac{Far-Near}{2} \newline 0 & 0 & 0 & 1 \end{matrix}\right]$
z轴缩放比例$\frac{2}{Far-Near}$, y轴缩放比例$\frac{1}{Size}$ ,x轴缩放比例$\frac{1}{Aspect\cdot Size}$
缩放矩阵$M_{Scale}=\left[\begin{matrix} \frac{1}{Aspect\cdot Size} & 0 & 0 & 0 \newline 0 & \frac{1}{Size} & 0 & 0 \newline 0 & 0 & \frac{2}{Far-Near} & 0 \newline 0 & 0 & 0 & 1 \end{matrix}\right]$
正交投影矩阵$M_{Ortho}=M_{Scale}\times M_{Trans} = \left[\begin{matrix} \frac{1}{Aspect\cdot Size} & 0 & 0 & 0 \newline 0 & \frac{1}{Size} & 0 & 0 \newline 0 & 0 & \frac{2}{Far-Near} & \frac{Near-Far}{Far-Near} \newline 0 & 0 & 0 & 1 \end{matrix}\right]$

透视投影

透视投影
基本思想:把视锥体变换为正交投影的长方体形式,再以正交投影方式计算。
把任意平面变换到近平面同一尺寸。使视锥体成长方体。
任意一点(x,y,z)的坐标变换后将变成 $\left[\begin{matrix} \frac{Near}{z} \cdot x & \frac{Near}{z} \cdot y & Unknown& 1 \end{matrix}\right]^T$。这里z的值并不是不变的!$z'=Near+Far-Near\cdot \frac{Far}{z}$,在Near到Far范围内实际上映射后的z值会更偏向于远平面。这里不关心具体情况用Unknown代替
点乘上非0系数后仍然是同一个点。这里z值一定是大于0的,所以可以乘上一个z变成$\left[\begin{matrix} Near \cdot x & Near \cdot y & Unknown& z \end{matrix}\right]^T$。写成矩阵形式 $M_{Persp\rightarrow Ortho}=\left[\begin{matrix} Near & 0 & 0 & 0 \newline 0 & Near & 0 & 0 \newline ? & ? & ? & ? \newline 0 & 0 & 1 & 0 \end{matrix}\right]$
取点在近平面的情况,那么变换前后坐标不变。
$M_{Persp\rightarrow Ortho}\cdot \left[\begin{matrix}x\newline y\newline\ Near\newline 1 \end{matrix}\right]=\left[\begin{matrix}Near\cdot x\newline Near\cdot y\newline\ Near^2\newline Near \end{matrix}\right]$
只考虑第三行,结果已经跟x、y没关系了,所以前两个数为0。矩阵为 $M_{Persp\rightarrow Ortho}=\left[\begin{matrix} Near & 0 & 0 & 0 \newline 0 & Near & 0 & 0 \newline 0 & 0 & ? & ? \newline 0 & 0 & 1 & 0 \end{matrix}\right]$
同时。取点在远平面的情况。z值也是确定的,并且取远平面的中心点代入,x和y的值都取0。
$M_{Persp\rightarrow Ortho}\cdot \left[\begin{matrix}0\newline 0\newline\ Far\newline 1 \end{matrix}\right]=\left[\begin{matrix}0\newline 0\newline\ Far^2\newline Far \end{matrix}\right]$
设第三行未知的两个数分别为a和b.
计算$\begin{cases}a\cdot Near+b=Near^2\newline a\cdot Far+b=Far^2\end{cases}$得到$a=Near+Far,b=-Near\cdot Far$
最终透视投影到正交投影变换的矩阵$M_{Persp\rightarrow Ortho}=\left[\begin{matrix} Near & 0 & 0 & 0 \newline 0 & Near & 0 & 0 \newline 0 & 0 & Near+Far & -Near\cdot Far \newline 0 & 0 & 1 & 0 \end{matrix}\right]$
最后透视投影的矩阵$M_{Persp}=M_{Ortho}\cdot M_{Persp\rightarrow Ortho}= \left[\begin{matrix} \frac{1}{Aspect\cdot Size} & 0 & 0 & 0 \newline 0 & \frac{1}{Size} & 0 & 0 \newline 0 & 0 & \frac{2}{Far-Near} & \frac{Near-Far}{Far-Near} \newline 0 & 0 & 0 & 1 \end{matrix}\right] \left[\begin{matrix} Near & 0 & 0 & 0 \newline 0 & Near & 0 & 0 \newline 0 & 0 & Near+Far & -Near\cdot Far \newline 0 & 0 & 1 & 0 \end{matrix}\right]$
$=\left[\begin{matrix} \frac{Near}{Aspect\cdot Size} & 0 & 0 & 0\newline 0 & \frac{Near}{Size} & 0 & 0 \newline 0 & 0 & \frac{3Near+Far}{Far-Near} & -\frac{2Far\cdot Near}{Far-Near}\newline 0 & 0 & 1 & 0 \end{matrix}\right] $
这里Size为近平面的高$h=tan\frac{FOV}{2}\cdot Near$。代入获得。
$\left[\begin{matrix} \frac{cot\frac{FOV}{2}}{Aspect} & 0 & 0 & 0 \newline 0 & cot\frac{FOV}{2} & 0 & 0 \newline 0 & 0 & \frac{3Near+Far}{Far-Near} & -\frac{2Far\cdot Near}{Far-Near}\newline 0 & 0 & 1 & 0 \end{matrix}\right]$

为什么两个矩阵算出来的z跟精要里给出来的不一样捏?总觉得这插图跟实际的z方向是相反的。