摘要
介绍了相机变换、正交投影和透视投影。
相机变换
背景要求:我们需要明白坐标是是如何转换的,可以参考:坐标变换
我们希望能够改变三维视角,朝任何方向看。所谓的相机变换,就是以相机作为坐标原点的一个参考系。所以,从世界空间变换到相机空间,就是把物体从世界坐标系,变换到相机为原点的相机坐标系。如下图所示(via):左半部分是小人在世界空间中的位置,右半部分是小人变换到相机空间后的位置。。
有许多约定用于指定相机的位置和方向。我们将使用下面的表示:
- 相机的位置e(the eye position e)。
- 相机看向的方向g(the gaze direction g)。
- 相机的向上方向t(the view-up vector t)。
因为向量t和向量g不一定垂直。我们使用e、g、t,构建一个以e为原点的右手坐标系uvw,即相机的坐标系。
其中, w = − g ∥ g ∥ w = -\dfrac{g}{\Vert g \Vert} w=−∥g∥g, u = t × w ∥ t × w ∥ u=\dfrac{t \times w}{\Vert t \times w \Vert} u=∥t×w∥t×w, v = w × u v = w \times u v=w×u 。
根据坐标变换,易得到,世界坐标系xyz中任意一点P,在相机坐标系uvw中坐标表示。
正交投影变换
正交投影:把一个长方体盒子,投影到以原点为中心,边长为2的正方体( [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3)中。
盒子的位置和体积信息如下:
x = l ≡ l e f t p l a n e x=l\equiv left \ plane x=l≡left plane
x = r ≡ r i g h t p l a n e x=r\equiv right \ plane x=r≡right plane
y = b ≡ b o t t o m p l a n e y=b\equiv bottom \ plane y=b≡bottom plane
y = t ≡ t o p p l a n e y=t\equiv top \ plane y=t≡top plane
z = n ≡ n e a r p l a n e z=n\equiv near \ plane z=n≡near plane
z = f ≡ f a r p l a n e z=f\equiv far \ plane z=f≡far plane
其中需要注意的是,由于规定是视线沿着 − z -z −z轴,所以 0 > n > f 0>n>f 0>n>f 。
正交投影的操作也很简单,先平移到原点,再缩放。如有不明白可参考:计算机图形学中的矩阵转换
透视投影
目标要求
透视投影:将一个台形投影到以原点为中心,边长为2的正方体( [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3)中。
这个操作分为两步:第一步将台形投影到长方体中;第二步将长方体使用上面的正交投影,投影到 [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3中。
这个长方体有下面的要求:
-
近平面上的点,投影前后位置不变。
-
远平面上的点,投影前后,z轴位置不变。
-
投影前后,台形中的点的(z)前后相对位置,在长方体中保持不变。
这里,我解释下为什么这个长方体有这些要求。
第一点解释:投影前后,宽(l,r)和高(d,t)的位置不变。即,透视投影第一步的变换矩阵,和,第二步正交投影的变换矩阵,操作的是相机坐标系下相同的值。只有这样,两个矩阵才能左乘叠加运算。因为,透视投影第一步和正交投影均是在相机坐标系下的矩阵变换操作。而要想将这两步联合起来,必须要求这两个变换矩阵中的参数,在透视投影第一步之后,仍然不变,即要求宽和高的位置不变。
第二点解释:理由同上,要求长(n,f)不变。
第三点解释:投影之后,仍然保留物体的相对深度信息。
变换矩阵推导
这个推导过程来自:perspective projection-53:28-GAMES101
透视投影的标准模型:设视点E位于原点,视平面P垂直于Z轴,且四边分别平行于x轴和y轴。如下图所示,我们将该模型称为透视投影的标准模型,其中视椎体的近截面离视点的距离为n,远截面离视点的距离为f,且一般取近截面为视平面。下面推导透视投影标准模型的变换方程。
设位于视椎体内的任意一点 X ( x , y , z ) X (x, y, z) X(x,y,z) 在视平面的透视投影为 X p ( x p , y p , z p ) Xp (x_p, y_p, z_p) Xp(xp,yp,zp),从点 X X X和 X p X_p Xp做 Z Z Z轴的垂线,并分别在 X − Z X-Z X−Z平面和 Y − Z Y-Z Y−Z平面投影,下图是在 X − Z X-Z X−Z平面上的投影结果。
根据三角形相似原理 , 可得 : x p = n x z x_p=\dfrac{nx}{z} xp=znx
同理,在 Y − Z Y-Z Y−Z平面投影,可得: y p = n y z y_p=\dfrac{ny}{z} yp=zny
因为投影之后,变成长方体。宽和高相等,但z轴方向上暂时不知道。所以, [ x y z 1 ] \begin{bmatrix}x\\y\\z\\1\end{bmatrix} ⎣⎢⎢⎡xyz1⎦⎥⎥⎤ 投影之后的的点为 [ x p y p ? 1 ] \begin{bmatrix}x_p\\y_p\\?\\1\end{bmatrix} ⎣⎢⎢⎡xpyp?1⎦⎥⎥⎤ = [ n x z n y z ? 1 ] \begin{bmatrix}\dfrac{nx}{z}\\\dfrac{ny}{z}\\?\\1\end{bmatrix} ⎣⎢⎢⎢⎢⎡znxzny?1⎦⎥⎥⎥⎥⎤
分母上出现z,无法使用线性变换。我们使用齐次坐标的性质,所有元素乘以z,仍然是相同的点。
所以, [ x y z 1 ] \begin{bmatrix}x\\y\\z\\1\end{bmatrix} ⎣⎢⎢⎡xyz1⎦⎥⎥⎤ 投影之后的的点为 [ x p y p ? 1 ] \begin{bmatrix}x_p\\y_p\\?\\1\end{bmatrix} ⎣⎢⎢⎡xpyp?1⎦⎥⎥⎤ = [ n x z n y z ? 1 ] \begin{bmatrix}\dfrac{nx}{z}\\\dfrac{ny}{z}\\?\\1\end{bmatrix} ⎣⎢⎢⎢⎢⎡znxzny?1⎦⎥⎥⎥⎥⎤ = [ n x n y ? z ] \begin{bmatrix}nx\\ny\\?\\z\end{bmatrix} ⎣⎢⎢⎡nxny?z⎦⎥⎥⎤
目前,我们可以根据上面变换,得到部分变换矩阵,即 [ n 0 0 0 0 n 0 0 A B C D 0 0 1 0 ] \begin{bmatrix} n&0&0&0\\0&n&0&0\\A&B&C&D\\0&0&1&0 \end{bmatrix} ⎣⎢⎢⎡n0A00nB000C100D0⎦⎥⎥⎤ 。其中A、B、C、D是四个未知的值。
根据上一节中的要求可知:近平面上任意一点 [ x y n 1 ] \begin{bmatrix}x\\y\\n\\1\end{bmatrix} ⎣⎢⎢⎡xyn1⎦⎥⎥⎤ 和远平面上一点 [ 0 0 f 1 ] \begin{bmatrix}0\\0\\f\\1\end{bmatrix} ⎣⎢⎢⎡00f1⎦⎥⎥⎤ ,经过上面的变换矩阵,仍然是原来的点不变。
所以:
计算下得到:
{
A
x
+
B
y
+
C
n
+
D
=
n
2
C
f
+
D
=
f
2
\left\{ \begin{array}{lr} Ax+By+Cn+D=n^2 \\ Cf+D=f^2 \end{array} \right.
{Ax+By+Cn+D=n2Cf+D=f2
得:
A
=
0
,
B
=
0
,
C
=
n
+
f
,
D
=
−
f
n
A=0,B=0,C=n+f,D=-fn
A=0,B=0,C=n+f,D=−fn
此时,我们得到透视投影第一步,将台形投影到要求长方形中的,变换矩阵: [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] \begin{bmatrix} n&0&0&0\\0&n&0&0\\0&0&n+f&-nf\\0&0&1&0 \end{bmatrix} ⎣⎢⎢⎡n0000n0000n+f100−nf0⎦⎥⎥⎤
再左乘第二步的正交投影矩阵,得到完整的透视投影矩阵如下:
2022/2/14修:上面结果的最后一行,之前计算错误,应当为[0 0 1 0]
。
附录
齐次坐标
齐次坐标在透视投影的含义是什么?上面,我仅仅使用了齐次坐标进行推导,但是我并不能够明白齐次坐标的含义。
可以参考:齐次坐标 – wiki | 什么是齐次坐标?
验证透视投影的相对深度信息是否保留
上面将透视投影分为两步进行操作:投影到指定要求的长方体中;再进行正交投影;
第二步是不会影响物体的相对深度信息的。我们看下,第一步如何影响物体的深度信息。
第一步的变换矩阵为: [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] \begin{bmatrix} n&0&0&0\\0&n&0&0\\0&0&n+f&-nf\\0&0&1&0 \end{bmatrix} ⎣⎢⎢⎡n0000n0000n+f100−nf0⎦⎥⎥⎤ 。则台形内的点 [ x y z 1 ] \begin{bmatrix}x\\y\\z\\1\end{bmatrix} ⎣⎢⎢⎡xyz1⎦⎥⎥⎤,进过变化矩阵为 [ n x n y ( n + f ) z − n f z ] \begin{bmatrix}nx\\ny\\(n+f)z-nf\\z\end{bmatrix} ⎣⎢⎢⎡nxny(n+f)z−nfz⎦⎥⎥⎤ = [ n x z n y z ( n + f ) − n f z 1 ] \begin{bmatrix}\dfrac{nx}{z}\\\dfrac{ny}{z}\\(n+f)-\dfrac{nf}{z}\\1\end{bmatrix} ⎣⎢⎢⎢⎢⎢⎡znxzny(n+f)−znf1⎦⎥⎥⎥⎥⎥⎤
所以,深度为 z z z的点,第一步变换投影之后深度为 ( n + f ) − n f z (n+f)-\dfrac{nf}{z} (n+f)−znf,其中 0 > n > f 0>n>f 0>n>f。这是一个z的增函数,所以第一步保留了相对深度信息。
可得,上面的透视投影变换矩阵,保留了相对深度信息。
参考
perspective projection-53:28-GAMES101
《Fundamentals of Computer Graphics》Chapter 7: Viewing