相机变换AND正交投影AND透视投影

摘要

介绍了相机变换、正交投影和透视投影。


相机变换

背景要求:我们需要明白坐标是是如何转换的,可以参考:坐标变换

我们希望能够改变三维视角,朝任何方向看。所谓的相机变换,就是以相机作为坐标原点的一个参考系。所以,从世界空间变换到相机空间,就是把物体从世界坐标系,变换到相机为原点的相机坐标系。如下图所示(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=gg u = t × w ∥ t × w ∥ u=\dfrac{t \times w}{\Vert t \times w \Vert} u=t×wt×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=lleft plane

x = r ≡ r i g h t   p l a n e x=r\equiv right \ plane x=rright plane

y = b ≡ b o t t o m   p l a n e y=b\equiv bottom \ plane y=bbottom plane

y = t ≡ t o p   p l a n e y=t\equiv top \ plane y=ttop plane

z = n ≡ n e a r   p l a n e z=n\equiv near \ plane z=nnear plane

z = f ≡ f a r   p l a n e z=f\equiv far \ plane z=ffar 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中。

这个长方体有下面的要求

  1. 近平面上的点,投影前后位置不变。

  2. 远平面上的点,投影前后,z轴位置不变。

  3. 投影前后,台形中的点的(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 XZ平面和 Y − Z Y-Z YZ平面投影,下图是在 X − Z X-Z XZ平面上的投影结果。

在这里插入图片描述

根据三角形相似原理 , 可得 : x p = n x z x_p=\dfrac{nx}{z} xp=znx

同理,在 Y − Z Y-Z YZ平面投影,可得: 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} znxzny1

分母上出现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} znxzny1 = [ 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+f100nf0

再左乘第二步的正交投影矩阵,得到完整的透视投影矩阵如下

在这里插入图片描述
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+f100nf0 。则台形内的点 [ 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)znfz = [ 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

3D数学-透视投影

《Fundamentals of Computer Graphics》Chapter 7: Viewing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da1234cao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值