我们把顶点坐标信息转化为裁剪空间。有可能使用到正交相机信息 或 透视相机。我们在这篇文章中,推导一下正交相机视图空间下的坐标转化到裁剪空间的矩阵。
l ≤ x ≤ r l \leq x \leq r l≤x≤r
l − l ≤ x − l ≤ r − l l - l \leq x - l \leq r - l l−l≤x−l≤r−l
0 ≤ x − l ≤ r − l 0 \leq x - l \leq r - l 0≤x−l≤r−l
0 ≤ x − l 2 r − l ≤ r − l 2 r − l 0 \leq x - l \frac{2}{r - l} \leq r - l \frac{2}{r - l} 0≤x−lr−l2≤r−lr−l2
0 ≤ 2 x − 2 l r − l ≤ 2 0 \leq \frac{2x - 2l }{r - l} \leq 2 0≤r−l2x−2l≤2
− 1 ≤ 2 x − 2 l r − l − 1 ≤ 1 -1 \leq \frac{2x - 2l }{r - l} - 1\leq 1 −1≤r−l2x−2l−1≤1
− 1 ≤ 2 x − 2 l r − l − r − l r − l ≤ 1 -1 \leq \frac{2x - 2l }{r - l} - \frac{r - l}{r - l}\leq 1 −1≤r−l2x−2l−r−lr−l≤1
− 1 ≤ 2 x − l − r r − l ≤ 1 -1 \leq \frac{2x - l -r }{r - l} \leq 1 −1≤r−l2x−l−r≤1
− 1 ≤ 2 x − ( − r ) − r r − ( − r ) ≤ 1 -1 \leq \frac{2x - (-r) -r }{r - (-r)} \leq 1 −1≤r−(−r)2x−(−r)−r≤1
− 1 ≤ 2 x 2 r ≤ 1 -1 \leq \frac{2x}{2r} \leq 1 −1≤2r2x≤1
(w为我们正交相机方盒子的宽,我们这里先假设为w。可以通过屏幕像素相除得到屏幕高宽比。然后,乘以h即可得到宽)
我们已知的是:
正交相机方盒子的高 Size(等于Unity单位值的2倍)
正交相机的近远裁剪面(Z值)
− 1 ≤ 2 x w ≤ 1 -1 \leq \frac{2x}{w} \leq 1 −1≤w2x≤1
b ≤ y ≤ t b \leq y \leq t b≤y≤t
b − b ≤ y − b ≤ t − b b - b\leq y - b \leq t - b b−b≤y−b≤t−b
0 ≤ y − b ≤ t − b 0\leq y - b \leq t - b 0≤y−b≤t−b
0 ≤ y − b 2 t − b ≤ t − b 2 t − b 0\leq y - b\frac{2}{t - b} \leq t - b\frac{2}{t - b} 0≤y−bt−b2≤t−bt−b2
0 ≤ 2 y − 2 b t − b ≤ 2 0\leq \frac{2y - 2b}{t - b} \leq 2 0≤t−b2y−2b≤2
− 1 ≤ 2 y − 2 b t − b − 1 ≤ 1 -1\leq \frac{2y - 2b}{t - b} - 1\leq 1 −1≤t−b2y−2b−1≤1
− 1 ≤ 2 y − 2 b t − b − t − b t − b ≤ 1 -1\leq \frac{2y - 2b}{t - b} - \frac{t - b}{t - b}\leq 1 −1≤t−b2y−2b−t−bt−b≤1
− 1 ≤ 2 y − b − t t − b ≤ 1 -1\leq \frac{2y - b - t}{t - b}\leq 1 −1≤t−b2y−b−t≤1
− 1 ≤ 2 y − ( − t ) − t t − ( − t ) ≤ 1 -1\leq \frac{2y - (-t) - t}{t - (-t)}\leq 1 −1≤t−(−t)2y−(−t)−t≤1
− 1 ≤ 2 y + t − t t + t ≤ 1 -1\leq \frac{2y + t - t}{t + t}\leq 1 −1≤t+t2y+t−t≤1
− 1 ≤ 2 y 2 t ≤ 1 -1\leq \frac{2y}{2t}\leq 1 −1≤2t2y≤1
(h为我们正交相机方盒子的高,这里先假设h代替)
− 1 ≤ 2 y h ≤ 1 -1\leq \frac{2y}{h}\leq 1 −1≤h2y≤1
因为我们观察空间是右手坐标系。但是,我们裁剪空间是左手坐标系。所以,这里需要化简的式子需要变化一下。(左手坐标系Z轴正方向与上图相反)
− n ≤ z ≤ − f -n\leq z \leq -f −n≤z≤−f
0 ≤ z + n ≤ n − f 0\leq z + n \leq n-f 0≤z+n≤n−f
0 ≤ z + n 2 n − f ≤ n − f 2 n − f 0\leq z + n \frac{2}{n - f} \leq n - f \frac{2}{n - f} 0≤z+nn−f2≤n−fn−f2
0 ≤ 2 z + 2 n n − f ≤ 2 0\leq \frac{2z + 2n}{n - f} \leq 2 0≤n−f2z+2n≤2
− 1 ≤ 2 z + 2 n n − f − n − f n − f ≤ 1 -1\leq \frac{2z + 2n}{n - f} - \frac{n-f}{n-f}\leq 1 −1≤n−f2z+2n−n−fn−f≤1
− 1 ≤ 2 z + n + f n − f ≤ 1 -1\leq \frac{2z + n + f}{n - f} \leq 1 −1≤n−f2z+n+f≤1
− 1 ≤ 2 z + n + f n − f ≤ 1 -1\leq \frac{2z + n + f}{n - f} \leq 1 −1≤n−f2z+n+f≤1
− 1 ≤ 2 z n − f + n + f n − f ≤ 1 -1\leq \frac{2z}{n - f} + \frac{n+f}{n-f} \leq 1 −1≤n−f2z+n−fn+f≤1
因为我们观察空间是右手坐标系。但是,我们裁剪空间是左手坐标系。所以,这里需要化简的式子需要变化一下。(左手坐标系Z轴正方向与上图相反)
− n ≤ z ≤ − f -n \leq z \leq -f −n≤z≤−f
0 ≤ z + n ≤ n − f 0 \leq z + n\leq n -f 0≤z+n≤n−f
0 ≤ z + n 1 n − f ≤ 1 0 \leq z+n \frac{1}{n-f} \leq 1 0≤z+nn−f1≤1
0 ≤ z + n n − f ≤ 1 0 \leq \frac{z+n }{n-f} \leq 1 0≤n−fz+n≤1
0 ≤ z n − f + n n − f ≤ 1 0 \leq \frac{z}{n-f} + \frac{n}{n-f}\leq 1 0≤n−fz+n−fn≤1
X
− 1 ≤ 2 x w ≤ 1 -1 \leq \frac{2x}{w} \leq 1 −1≤w2x≤1
Y
− 1 ≤ 2 y h ≤ 1 -1\leq \frac{2y}{h}\leq 1 −1≤h2y≤1
Z(OpenGL)
− 1 ≤ 2 z n − f + n + f n − f ≤ 1 -1\leq \frac{2z}{n - f} + \frac{n+f}{n-f} \leq 1 −1≤n−f2z+n−fn+f≤1
Z(DirectX)
0 ≤ z n − f + n n − f ≤ 1 0 \leq \frac{z}{n-f} + \frac{n}{n-f}\leq 1 0≤n−fz+n−fn≤1
[ 2 w 0 0 0 0 2 h 0 0 0 0 2 n − f n + f n − f 0 0 0 1 ] \begin{bmatrix} \frac{2}{w} & 0 & 0 & 0 \\ 0 & \frac{2}{h} & 0 &0\\ 0 & 0 & \frac{2}{n -f} &\frac{n + f}{n - f}\\ 0 & 0 & 0 & 1\\ \end{bmatrix} w20000h20000n−f2000n−fn+f1
[ 2 w 0 0 0 0 2 h 0 0 0 0 1 n − f n n − f 0 0 0 1 ] \begin{bmatrix} \frac{2}{w} & 0 & 0 & 0 \\ 0 & \frac{2}{h} & 0 &0\\ 0 & 0 & \frac{1}{n -f} &\frac{n}{n - f}\\ 0 & 0 & 0 & 1\\ \end{bmatrix} w20000h20000n−f1000n−fn1