变换
变换是计算机图形学中非常重要的一部分。变换包含模型变换(Modeling transform、视图变换(View transform)以及投影变换(Projection transformation)。模型变换指的是变换模型(被拍摄物体)的位置,大小和角度;视图变换指的是变换照相机的位置和角度。从相对运动的角度来看,模型变换和投影变换是可以相互转化的。投影变换(Projection transformation)是把 3 维模型投影到 2 维平面的变换。
模型变换
二维变换(2D Transformations)
伸缩变换(Scale Transform)
伸缩变换中,如果一个图片以原点 \(\left(0, 0 \right)\) 为中心缩放 \(s\) 倍。那么点 \(\left(x, y \right)\) 变换后数学形式可以表示为:
\[ \begin{align*} x^{\prime} & =s x \\ y^{\prime} & =s y \end{align*} \]
写成矩阵形式为:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \end{bmatrix} = \begin{bmatrix} s & 0 \\ 0 & s \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \]
当然,我们也可以给 \(x\) 轴和 \(y\) 轴不同的缩放倍数 \(s_x\) 和 \(s_y\)。在非均匀情况下,缩放变换的矩阵形式为:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \end{bmatrix} = \begin{bmatrix} s_x & 0 \\ 0 & s_y \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \]
反射变换(Reflection Transform)
反射变换(Reflection)指的是图片对着 \(x\) 轴或者 \(y\) 轴做对称变换。对于图片上的点 \(\left(x, y \right)\) 在经过 \(x\) 轴的对称反射变换后,数学形式可以表示为: \[ \begin{align*} & x^{\prime}=-x \\ & y^{\prime}=y \end{align*} \]
表示成矩阵形式为:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \end{bmatrix} = \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \]
同理可以得到 \(y\) 轴对称反射变换后的变换矩阵为:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \]
沿原点反射变换的变换矩阵为:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \end{bmatrix} = \begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \]
错切变换(Shear Transform)

水平方向的错切:
- 对于 \(y = 0\) 上的点来说,其水平移位(Horizontal shift)为 0.
- 对于 \(y = 1\) 上的点来说,其水平移位(Horizontal shift)为 a.
- 垂直移位(Vertical shift )始终为 0.
变换矩阵为:
\[ \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} 1 & a \\ 0 & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] \]
垂直方向的错切变换,其变换矩阵为:
\[ \left[\begin{array}{l} x^{\prime} \\ y^{\prime} \end{array}\right]=\left[\begin{array}{ll} 1 & 0 \\ b & 1 \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] \]
旋转变换(Rotate Transform)
默认情况下,都是考虑绕点 \(\left(0, 0\right)\) ,逆时针(CCW)旋转。旋转矩阵的推导如下:

我们在直角坐标系中绘制一个边长为 \(1\) 的正方形,点 \(A\) 坐标为 \(\left(1, 0\right)\),点 \(B\) 坐标为 \(\left(0, 1\right)\)。正方形沿着原点 \(\left(0, 0\right)\) 旋转的角度为 \(\theta\) 角。我们设:
\[ \begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} A & B \\ C & D \end{bmatrix} = \begin{bmatrix} x \\ y \end{bmatrix} \]
代入点 \(A\) 的的值 \(\left(1, 0\right)\) 可以得到:
\[ \begin{bmatrix} \sin \theta \\ \cos \theta \end{bmatrix} = \begin{bmatrix} A & B \\ C & D \end{bmatrix} = \begin{bmatrix} 1 \\ 0 \end{bmatrix} \]
解方程得到:
\[ \begin{align*} A &= \cos \theta \\ C &= \sin \theta \end{align*} \]
代入点 \(B\) 的的值 \(\left(0, 1\right)\) 可以得到:
\[ \begin{bmatrix} -\sin \theta \\ \cos \theta \end{bmatrix} = \begin{bmatrix} A & B \\ C & D \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \end{bmatrix} \]
解方程得到:
\[ \begin{align*} B &= -\sin \theta \\ D &= \cos \theta \end{align*} \]
即旋转变换的变换矩阵为:
\[ \mathbf{R}_\theta = \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} \]
线性变换(Linear Transformations)
对于任何一种变换如果可以写作:
\[ \begin{align*} x^{\prime} & =a x+b y \\ y^{\prime} & =c x+d y \end{align*} \]
矩阵形式可以表示为:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \]
那么我们认为这种变换是线性变换。
显然,伸缩变换,反射变换,错切变换和旋转变换都是线性变换。
设 \(f\) 为一个线性变换变换,则 \(f\) 满足有以下性质: \[ f\left(x + y\right) = f\left(x\right) + f\left( y\right) \\ f\left(kx\right) = kf\left(x\right) \]
齐次坐标(Homogeneous Coordinates)
平移变换(Translation Transform)
平移变换(Translation)相比于以上的线性变换有特殊的地方。平移变换的数学形式为:
\[ \begin{align*} x^{\prime} & =x+t_x \\ y^{\prime} & =y+t_y \end{align*} \]
这种数学表示不能写作线性变换的矩阵形式,只能记作:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \end{bmatrix}=\begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}+ \begin{bmatrix} t_x \\ t_y \end{bmatrix} \]
说明平移操作不是线性变换。但是我们不希望把平移操作看作特殊变换,因此需要把这些变换统一起来,就引入了齐次坐标。
齐次坐标(Homogenous Coordinates)
为了统一变换操作,我们引入一个新的维度。对于二维的点 \(\left(0, 0\right)\) 我们可以增加一个维度,对于 \(2\) 维的点可以表示为 \(\left(x, y, 1\right)^{\mathrm{T}}\),2 维向量的 \(\left(x, y, 0\right)^{\mathrm{T}}\)。因此,一个点的平移可以用矩阵表示为:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \\ w^{\prime} \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}=\begin{bmatrix} x+t_x \\ y+t_y \\ 1 \end{bmatrix} \]
齐次坐标就是在原来的坐标上加上一个维度(w-coordinate):
- 2D point = \(\begin{bmatrix}x & y & 1 \\ \end{bmatrix}\).
- 2D vector = \(\begin{bmatrix}x & y & 0 \\ \end{bmatrix}\).
用其次坐标表示平移变换: \[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \\ w^{\prime} \end{bmatrix}=\begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}=\begin{bmatrix} x+t_x \\ y+t_y \\ 1 \end{bmatrix} \]
当求出来的 w-coordinate 为 1 或者 0 时才是一个有效的操作:
- vector + vector = vector
- point – point = vector
- point - vector = point
- point - point = midpoint
在齐次坐标中,\(\begin{bmatrix}x \\y \\w \end{bmatrix}\) 表示二维空间中的点: \(\begin{bmatrix} \frac{x}{w} \\ \frac{y}{w} \\1 \end{bmatrix}\), \(w \neq 0\).
仿射变换(Affine Transformations)
仿射变换 = 线性变换 + 平移变换。
对于平移变换:
\[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \end{bmatrix}=\begin{bmatrix} a & b \\ c & d \end{bmatrix}\begin{bmatrix} x \\ y \end{bmatrix}+\begin{bmatrix} t_x \\ t_y \end{bmatrix} \] 使用齐次坐标表示如下: \[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \\ 1 \end{bmatrix}=\begin{bmatrix} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \]
二维空间仿射变换的齐次坐标表示:
错切变换:
\[ S\left(s_x, s_y\right)=\begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix} \]
旋转变换:
\[ R(\alpha)=\begin{bmatrix} \cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 1 \end{bmatrix} \]
平移变换:
\[ T\left(t_x, t_y\right)=\begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \]
逆变换(Inverse Transform)
设 \(M\) 为一个变换矩阵,对于 \(M\) 来说,\({M}^{-1}\) 为其在代数和几何上的逆变换。
变换的复合和分解(Composing Transforms And Decomposing Complex Transforms)
变换的复合
可以用矩阵的乘法进行变换的组合。变换的先后顺序不同,变换的结果不同。矩阵和向量的乘法是从右到左依次相乘,从右到左依次应用变化。有一个仿射变换序列:\(A_{1}, A_{2}, A_{3}, \dots\) ,依次应用到向量上,如下所示:
\[ A_n\left(\ldots A_2\left(A_1(x)\right)\right)=A_n \cdots A_2 \cdot A_1 \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \]
根据矩阵运算的结合律, 我们可以先把变换矩阵乘在一起,接下来把这个矩阵的乘积和向量相乘。可以用一个矩阵表示一个复杂的变换。
变换的分解
所有的复杂变换都可以分解成多个普通的变换。
例如,如何绕着容易一个点旋转?
- 将旋转中心平移到原点(origin);
- 旋转;
- 平移回去。

变换矩阵为: \[ T(c) \cdot R(\alpha) \cdot T(-c) \]
三维变换(3D Transformations)
用其次坐标表示点和向量:
- 3D point = \(\begin{bmatrix}x & y & z & 1 \\ \end{bmatrix}^{T}\)
- 3D vector = \(\begin{bmatrix}x & y & z & 0 \\ \end{bmatrix}^{T}\)
一般来说,\(\left[\begin{array}{l}x & y & z & 1 \\ \end{array}\right]^{T}(w \neq 0)\) 表示三维空间的点:\(\left[\begin{array}{l} \frac{x}{w} & \frac{y}{w} & \frac{z}{w} & 1 \end{array}\right]^{T}\).
用 \(4 \times 4\) 的矩阵表示仿射变换: \[ \begin{bmatrix} x^{\prime} \\ y^{\prime} \\ z^{\prime} \\ 1 \end{bmatrix}=\begin{bmatrix} a & b & c & t_x \\ d & e & f & t_y \\ g & h & i & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} \]
左上角是一个 \(3 \times 3\) 的线性变换矩阵。在仿射变换中的变换矩阵表示先做线性变换再做平移变换。
伸缩变换
\[ S\left(s_x, s_y, s_z\right)=\begin{bmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
平移
\[ T \left(t_x, t_y, t_z\right)=\begin{bmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
旋转
考虑绕着 \(x, y, z\) CCW 旋转。
\[ \begin{align*} & {R}_x(\alpha)=\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha & 0 \\ 0 & \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \\ & R_y(\alpha)=\begin{bmatrix} \cos \alpha & 0 & \sin \alpha & 0 \\ 0 & 1 & 0 & 0 \\ -\sin \alpha & 0 & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \\ & R_z(\alpha)=\begin{bmatrix} \cos \alpha & -\sin \alpha & 0 & 0 \\ \sin \alpha & \cos \alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \end{align*} \]
对于一般性的旋转问题,可以用简单的旋转描述复杂的旋转。用 \(x\) 轴。\(y\) 轴和 \(z\) 轴上的旋转来定义旋转: \[ R_{x y z}(\alpha, \beta, \gamma)=R_x(\alpha) R_y(\beta) R_z(\gamma) \] 称 \(\alpha, \beta, \gamma\) 为欧拉角(Euler angles)。
罗德里格斯旋转公式(Rodrigues’ Rotation Formula)
绕着旋转轴 \(\vec{n}\) 旋转角度 \(\alpha\)。默认旋转轴是过原点的,对于不过原点的条件可以将图形平移到过原点的旋转轴上,旋转后再平移回去。罗德里格斯旋转公式是: \[ R(\boldsymbol{n}, \alpha)=\cos \alpha \cdot I+ (1-\cos \alpha) \boldsymbol{n} \boldsymbol{n}^T+\sin \alpha \cdot\left[\begin{array}{ccc} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \end{array}\right] \]
视图变换
在 3 维物体变到二维平面的过程中,我们需要规定好相机的位置。对于相机所做的变换就是视图变换(Viewing / Camera transformation)。
我们需要对相机位置进行定义,对于一个相机我们要规定下面三个属性:
- 相机位置(Position): \(\vec{e}\).
- 相机拍摄方向(Look-at / Gaze direction):\(\hat{g}\).
- 相机向上方向(Up direction):\(\hat{t}\).
根据相对运动我们可以知道,只要相机和被拍摄物体相对位置不变,那么拍摄出来的照片应当是一样的。我们可以通过对被拍摄物体做相同的变换来把相机变换到标准位置。相机的标准位置为:
- 相机位置在原点:\(\left(0, 0\right)\).
- 相机拍摄方向是 \(-z\) 轴方向.
- 相机的向上方向是 \(y\) 轴方向.
将任意位置的相机移动到标准位置需要以下操作:
- 将中心点 \(\vec{e}\) 移动到原点;
- 把 \(\hat{g}\) 旋转到 \(-z\) 轴方向;
- 把 \(\hat{t}\) 旋转到 \(y\) 轴方向;
- 把 \(\hat{g} \times \hat{t}\) 旋转到 \(x\) 轴方向。
操作 2~4 只要满足任意两个,另外一个条件就会满足。也就是说我们需要先做一次平移变换,再做一次旋转变换。
通过 \(M_{view}\) 来变换相机。令 \(M_{view} = R_{view}T_{view}\). \(T_{view}\) 表示平移变换,\(R_{view}\) 表示旋转变换。\(T_{view}\) 的表示如下:
\[ T_{ view }=\begin{bmatrix} 1 & 0 & 0 & -x_e \\ 0 & 1 & 0 & -y_e \\ 0 & 0 & 1 & -z_e \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
直接求 \(R_{view}\) 比较难,可以考虑其逆变换: \[ R_{view }^{-1}=\begin{bmatrix} x_{\hat{g} \times \hat{t}} & x_t & x_{-g} & 0 \\ y_{\hat{g} \times \hat{t}} & y_t & y_{-g} & 0 \\ z_{\hat{g} \times \hat{t}} & z_t & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\Leftrightarrow R_{view }=\begin{bmatrix} x_{\hat{g} \times \hat{t}} & y_{\hat{g} \times \hat{t}} & z_{\hat{g} \times \hat{t}} & 0 \\ x_t & y_t & z_t & 0 \\ x_{-g} & y_{-g} & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
旋转变换矩阵是正交矩阵。
投影变换(Projection Transformation)
投影变换是把 3 维模型投影到 2 维平面的变换。投影变换分为正交投影(Orthographic projection)以及透视投影(Perspective projection)。正交投影中,投影后原本平行的线保持平行关系。但是透视投影中平行的线在投影后不一定能保持平行关系,会相交到某一点上(这也就是近大远小现象)。

正交投影
正交投影将相机放在原点上,拍摄方向是 \(-z\) 轴方向,向上方向是 \(y\) 轴方向。只需要去掉 \(z\) 轴后,\(xy\) 平面上的图像就是投影结果。为了能够正交投影,我们会把所有模型变换到 \(\left[-1,1\right]^3\) 的区间范围内。
在空间中描述一个立方体(立方体中包含了所有需要绘制的模型),将立方体变换到 \(\left[-1,1\right]^3\) 的区间范围内。

定义空间中的立方体的左右在 \(x\) 轴的坐标,上下在 \(y\) 轴的坐标,远近在 \(z\) 轴的坐标。这个立方体就可以被描述 \(\left[l, r\right] \times \left[b, t \right] \times \left[f, n\right]\)。对于 \(z\) 轴来说,越远 \(z\) 值更小,越近 \(z\) 值更大。远是小于近的,保证了右手坐标系下从 \(-z\) 方向看过去 \(z\) 值的规律。
将这样的立方体映射到正则 / 标准 / 规范(canonical)立方体 \(\left[-1, 1\right]\) 中。
变换方法是先将中心平移到原点,之后对每个边进行缩放到大小为 2。
变换矩阵为:
\[ M_{\text {ortho }}=\begin{bmatrix} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1 \end{bmatrix} \] ### 透视投影
透视投影是最为广泛的投影方式。透视投影满足近大远小的性质。接下来我们定义视锥。视锥就是一个透视相机渲染时能看到区域的形状,相机放在平面的中心,一个视锥包含 4 个元素:

- 近平面:渲染的区域里相机最近的平面;
- 远平面:渲染的区域里相机最远的平面;
- 视野(Field of view, FOV):平面顶部和底部中心到相机连线的夹角;
- 宽高比:平面宽度和高度之比。
从一个点射出的四棱锥定义了远和近两个平面。我们可以把远平面缩小成和近平面一样大的长方形,这样视锥就会变成一个立方体。再做一次正交投影就可以得到最终的投影结果了。

我们需要对处于四棱锥中的点进行变换,变换满足三个条件:
- 任何一个在近平面上的点不会发生变化;
- 远平面处的点 \(z\) 值不发生变化;
先将四棱锥变换成长方体,然后再做正交投影变换即可,记将四棱锥变换成长方体的矩阵为:\(M_{persp \rightarrow ortho}\).

从 \(YZ\) 平面看过去,对于远平面上的点 \(\left[x, y, z\right]\) 在投影变换后,根据相似三角形的性质,点的位置变为 \(\left[\frac{n}{z}x, \frac{n}{z}y, z\right]\). 对于任意一个点点 \(\left[x, y, z\right]\) 来说,变化过程为: \[ \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} \Rightarrow\begin{bmatrix} n x / z \\ n y / z \\ \text { unknown } \\ 1 \end{bmatrix} \stackrel{\times z}{=}\begin{bmatrix} n x \\ n y \\ \text { still unknown } \\ z \end{bmatrix} \] 中间点的 \(z\) 值变化目前是不确定的。但是对于以上的变化结果我们可以得到变换矩阵的部分结果: \[ M_{persp \rightarrow ortho} = \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ ? & ? & ? & ? \\ 0 & 0 & 1 & 0 \end{bmatrix} \] 接下来求出未知量。对于近平面的上的点,应当满足变换: \[ \begin{bmatrix} x \\ y \\ n \\ 1 \end{bmatrix} \Rightarrow \begin{bmatrix} x \\ y \\ n \\ 1 \end{bmatrix}=\begin{bmatrix} n x \\ n y \\ n^2 \\ n \end{bmatrix} \] 因此可以得到方程: \[ \begin{bmatrix} 0 & 0 & A & B \end{bmatrix} \begin{bmatrix} x \\ y \\ n \\ 1 \end{bmatrix}=n^2 \] \(n^2\) 显然和 \(x\),\(y\) 的值没有什么关系,因此 \(x\),\(y\) 的系数为 \(0\)。但是方程不能解出,还需要一个方程。
对于远平面,我们选择中心点,变换应当满足: \[ \begin{bmatrix} 0 \\ 0 \\ f \\ 1 \end{bmatrix} \Rightarrow \begin{bmatrix} 0 \\ 0 \\ f \\ 1 \end{bmatrix} == \begin{bmatrix} 0 \\ 0 \\ f^2 \\ f \end{bmatrix} \] 可以得到方程: \[ \begin{bmatrix} 0 & 0 & A & B \end{bmatrix} \begin{bmatrix} 0 \\ 0 \\ f \\ 1 \end{bmatrix}=f^2 \] 方程展开后可以得到: \[ \begin{align*} & A n+B=n^2 \\ & A f+B=f^2 \end{align*} \] 解得: \[ \begin{aligned} & A=n+f \\ & B=-n f \end{aligned} \] 因此我们就解出了变换矩阵: \[ M_{persp \rightarrow ortho} = \begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n + f & -nf \\ 0 & 0 & 1 & 0 \end{bmatrix} \]
所以: \[ \begin{align*} M_{persp} &= M_{ortho}M_{persp \rightarrow ortho}\\ \end{align*} \]
透视投影的变换后的正交投影变换矩阵
对于定义好的视锥,我们定义视野角度为 \(\alpha\),宽高比为 \(radio\),近平面 \(z\) 值为 \(n\),那么投影变换后的长方体的中 \(t = n \tan{\frac{\alpha}{2}}\),\(b=-n\tan{\frac{\alpha}{2}}\),\(r = radio * n \tan{\frac{\alpha}{2}}\),\(l=-radio * n \tan{\frac{\alpha }{2}}\) 代入正交投影变化公式中即可。