计算机图形学 观测变换

观测变换

一.模型变换

将模型移动到你需要的位置,自由移动(ง •_•)ง

二.视图变换

目的是得到模型相对于摄像机的位置坐标,即如果以摄像机的xyz为世界的xyz,以摄像机为原点模型的坐标,那么我们的关键便是将摄像机的xyz变为世界的xyz。

那么就要把摄像机转为世界原点并摆正,并且模型要和做相同的变换以保持相对位置不变。
我们要求出将摄像机转换到标准世界位置过程的变换矩阵,不如求出世界原点转换到摄影机位置过程的矩阵,再进行求逆,得到的就是我们要的了。

1.获得摄像机的位置

要将原点位置转换到摄影机位置,首先,我们就要知道摄影机的位置信息。
摄像机 ( e y e ) 坐标 E = ( x e , y e , z e ) T , 三轴正方向: u , v , w 摄像机(eye)坐标E = (x_e,y_e,z_e)^T,\\ 三轴正方向:u,v,w 摄像机(eye)坐标E=(xe,ye,ze)T,三轴正方向:u,v,w

2.平移变换

上面我们得到了摄影机的坐标,则此处的平移矩阵便是摄影机坐标形成:

平移矩阵: E = ( x e , y e , z e ) T 平移矩阵:E = (x_e,y_e,z_e)^T 平移矩阵:E=(xe,ye,ze)T

3.旋转变换

摄像机被平移到原点,模型也被平移到对应位置,接下来就是旋转了;那就是当前世界三轴方向转为摄像机的三轴正方向。

首先,世界三轴的正方向我们很容易知道,分别为:

x 轴正方向 = ( 1 , 0 , 0 ) T , y 轴正方向 = ( 0 , 1 , 0 ) T , z 轴正方向 = ( 0 , 0 , 1 ) T x轴正方向=(1,0,0)^T,y轴正方向=(0,1,0)^T,z轴正方向=(0,0,1)^T x轴正方向=(1,0,0)T,y轴正方向=(0,1,0)T,z轴正方向=(0,0,1)T

然后,我们先设现在摄像机三轴正方向分别为u,v,w(对应xyz);因为三轴正方向是绑定到一块的,他们要做相同的变换,所以我们不妨写为矩阵:

世界三轴矩阵 : R 0 = [ 1 0 0 0 1 0 0 0 1 ] 当前摄像机三轴矩阵: R e = ( u v w ) 世界三轴矩阵:R_0=\begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1\\ \end{bmatrix}\\ 当前摄像机三轴矩阵:R_e= \begin{pmatrix} u&v&w \end{pmatrix} 世界三轴矩阵:R0= 100010001 当前摄像机三轴矩阵:Re=(uvw)

而当前摄像机三轴矩阵可以看作是世界三轴矩阵经过旋转得到的,那么显然这个旋转矩阵就是

R e = R 1 T ∗ R 0 ; 得 R 1 = R e T = ( u , v , w ) T R_e = R_1^T * R_0;\\ 得R_1= R_e^T =(u,v,w)^T Re=R1TR0;R1=ReT=(u,v,w)T

设P为模型坐标,则(其中旋转矩阵为正交矩阵,即它的转置矩阵等于它的逆矩阵)

模型转换后坐标为 P ′ = R e T ( P − e ) 模型转换后坐标为P'=R_e^T(P-e) 模型转换后坐标为P=ReT(Pe)

至此,你成功的拿到了模型相对于摄像机的坐标!d=====( ̄▽ ̄*)b

三.投影变换

我们得到模型相对于摄影机的坐标,接下来便是要把可视部分进行投影。投影,即将三维模型投影到二维平面上,是一个降维的过程。在此投影分两种,正交投影和透视投影。

1.正交投影

正交投影是简单的一种,它就相当于正视图,没有近大远小的关系,他的可视部分是一个长方体,而我们要做的就是将其转换到一个[-1,1]^3 的正方体中(其中z的保留是确保遮挡关系)。

我们要先规定一下可视范围的长方体,先规定一下可视范围(x轴方向)宽和(y轴方向)高,之后在z轴上确定一下最近点和最远点,由此形成一个长方体。

正交.png 中心点坐标为 M 0 ( 远到近 z 轴方向 ) 长: l ( 左到右 x 轴方向 ) 宽: w ( 上到下 y 轴方向 ) 高: h 中心点坐标为M_0\\ (远到近z轴方向)长:l \\(左到右x轴方向)宽:w\\(上到下y轴方向)高:h 中心点坐标为M0(远到近z轴方向)长:l(左到右x轴方向)宽:w(上到下y轴方向)高:h

我们要将此长方体中心先平移到原点再进行缩放,其中长方体内每个模型点都要做此变换,因此设任意模型点P:

P ′ = [ 2 / w 0 0 0 2 / h 0 0 0 2 / l ] ∗ ( P − M 0 ) 表示为齐次坐标为 : P ′ = [ 2 / w 0 0 − x M 0 2 / h 0 − y M 0 0 2 / l − z M 0 0 0 1 ] ∗ P P' = \begin{bmatrix} 2/w&0&0\\ 0&2/h&0\\ 0&0&2/l\\ \end{bmatrix}*(P-M_0)\\ 表示为齐次坐标为:\\ P'=\begin{bmatrix} 2/w&0&0&-x_M\\ 0&2/h&0&-y_M\\ 0&0&2/l&-z_M\\ 0&0&0&1\\ \end{bmatrix} *P P= 2/w0002/h0002/l (PM0)表示为齐次坐标为:P= 2/w00002/h00002/l0xMyMzM1 P

其中2为缩放后的长度。将所有模型点做变换后,正交投影便完成了。o( ̄︶ ̄)o

2.透视投影

透视投影便多了一些复杂性,上面正交投影的可视范围是一个长方体,垂截面永远不变,而透视投影的可视范围是一个台体。
在透视投影中会有一个视锥体,锥体中有一个近截面和一个远截面,只有在其中的物体会被渲染,而视锥体被截形成的便是此台体。

侧视图:
视锥体.png

近平面用蓝色表示,远平面用绿色表示。
同样,我们要将此台体转换为[-1,1]^3的正方体。上面我们做了正交投影,将长方体转换为正方体,那现在不如先将台体转换为长方体,接着再重复正交投影的操作。
那么接下来,就是如何把台体转换为长方体。
示意图:
变换.png
像一个向内挤压的过程,x,y值都变小了,那我们先看x,y的变换
先定义台体内任意一点P(x,y,z,1),根据相似三角形此变换矩阵为:

[ n / z 0 0 0 0 n / z 0 0 ? ? ? ? ? ? ? ? 0 0 0 1 ] \begin{bmatrix} n/z&0&0&0\\ 0&n/z&0&0\\ ??&??&??&??\\ 0&0&0&1 \end{bmatrix} n/z0??00n/z??000??000??1
然而,z的值要从点P上获得,我们接下来便要使用齐次坐标:
( x y z 1 ) 要变换为 ( n x / z n y / z ? ? 1 ) 而 ( n x / z n y / z ? ? 1 ) 又等于 ( n x n y ? ? ∗ z z ) \begin{pmatrix} x\\ y\\ z\\ 1\\ \end{pmatrix} 要变换为\begin{pmatrix} nx/z\\ ny/z\\ ??\\ 1\\ \end{pmatrix}\\ 而\begin{pmatrix} nx/z\\ ny/z\\ ??\\ 1\\ \end{pmatrix} 又等于 \begin{pmatrix} nx\\ ny\\ ??*z\\ z\\ \end{pmatrix} xyz1 要变换为 nx/zny/z??1 nx/zny/z??1 又等于 nxny??zz
做了此变换便可以把上面的变换矩阵换一种方式:
[ n 0 0 0 0 n 0 0 ? ? ? ? ? ? ? ? 0 0 1 0 ] \begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ ??&??&??&??\\ 0&0&1&0 \end{bmatrix} n0??00n??000??100??0
此时可以看到最后一行的1被移到了第三列,这便保证了P点最后一行为z。

接下来便是要解开第三行的谜团了,这里就要用到透视投影的一个性质:

近平面上的任何一点都不会改变,远平面上任何一点的z都不会改变

计算开始(要使用齐次坐标):

近平面: [ n 0 0 0 0 n 0 0 A B C D 0 0 1 0 ] ∗ ( x n y n n 1 ) = ( n x n n y n n 2 n ) 远平面: [ n 0 0 0 0 n 0 0 A B C D 0 0 1 0 ] ∗ ( x f y f f 1 ) = ( f x f f y f f 2 f ) 得: A ∗ x n + B ∗ y n + C ∗ n + D = n 2 A ∗ x f + B ∗ y f + C ∗ z f + D = f 2 近平面: \begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ A&B&C&D\\ 0&0&1&0\\ \end{bmatrix}* \begin{pmatrix} x_n\\ y_n\\ n\\ 1\\ \end{pmatrix}=\begin{pmatrix} nx_n\\ ny_n\\ n^2\\ n\\ \\ \end{pmatrix} \\ 远平面: \begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ A&B&C&D\\ 0&0&1&0\\ \end{bmatrix} * \begin{pmatrix} x_f\\ y_f\\f\\ 1\\ \end{pmatrix}= \begin{pmatrix} fx_f\\ fy_f\\ f^2\\ f\\ \\ \end{pmatrix}\\ 得:\\ A*x_n+B*y_n+C*n+D=n^2\\ A*x_f+B*y_f+C*z_f+D=f^2 近平面: n0A00nB000C100D0 xnynn1 = nxnnynn2n 远平面: n0A00nB000C100D0 xfyff1 = fxffyff2f 得:Axn+Byn+Cn+D=n2Axf+Byf+Czf+D=f2

x,y都是未知数,而得数是已知数,则可以推出A=B=0。则

C ∗ n + D = n 2 C ∗ f + D = f 2 两式相减得 : C ( n − f ) = n 2 − f 2 得 : C = n + f D = − n f C*n+D=n^2\\ C*f+D=f^2\\两式相减得: C(n-f)=n^2-f^2\\得:C=n+f\\D=-nf Cn+D=n2Cf+D=f2两式相减得:C(nf)=n2f2:C=n+fD=nf

算出来了,o( ̄▽ ̄)o
得出结论:

透视到正交变换矩阵: M p = [ n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ] 透视到正交变换矩阵:Mp= \begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0&0&1&0\\ \end{bmatrix}\\ 透视到正交变换矩阵:Mp= n0000n0000n+f100nf0

接下来便是重复正交投影的部分,此处不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值