GAMES101学习笔记(二)变换深入

课前知识:对于旋转变换:

R_{-\theta}=R_{\theta}^{T}=R_{\theta}^{-1}

一、三维旋转变换

        三维空间中物体的基本旋转有:

                绕x轴旋转:

R_{x}(\theta)=\begin{bmatrix} 1 & 0 &0 &0 \\ 0 & cos\theta& -sin\theta & 0\\ 0 & sin\theta &cos\theta &0 \\ 0& 0& 0 & 1 \end{bmatrix}

                绕y轴旋转:

R_{y}(\theta)=\begin{bmatrix} cos\theta &0 & sin\theta& 0\\ 0 & 1 & 0 &0 \\ -sin\theta& 0 & cos\theta&0 \\ 0& 0& 0 & 1 \end{bmatrix}

                绕z轴旋转:

R_{z}(\theta)=\begin{bmatrix} cos\theta & -sin\theta & 0 &0 \\ sin\theta&cos\theta & 0 &0 \\ 0& 0 & 1 & 0\\ 0 & 0 & 0& 1 \end{bmatrix}

        1.Rodrigues`Rotation Formula

                对于一个过原点的轴n,绕n正向旋转α角有公式:

 二、观测变换

        1.模型变换(model)

        2.视图变换(view)

                首先定义相机(camera),定义相机需要三个不同的变量。

                        一是相机位置

                        二是相机面向的方向

                        三是相机向上的方向

                注:默认相机位于原点,面向-z方向,y方向为向上方向

                对于任意相机,可以将其通过平移,旋转变换变为默认相机,但旋转变换不易求矩阵,采用逆矩阵方式求解可以得到:

M_{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})^{T}=\begin{bmatrix} x_{\vec{g} \times\vec{t} } & y_{\vec{g} \times\vec{t} } & z_{\vec{g} \times\vec{t} } & 0\\ x_{t}& y_{t} & z_{t}& 0\\ x_{-g } & y_{-g }& z_{-g }& 0\\ 0& 0 & 0 & 1 \end{bmatrix}

        3.投影变换(projection)

                3.1正交投影变换(Orthographic)

        例如将一个长方体做正交变换可以将其中心先平移到原点,再做缩放变换让其各个边长度限制在2。

        由此可以得到正交变换矩阵:

        其中的rltbnf为各个与xyz轴平行平面的坐标值

                3.2透视投影变换(Perspective)

                        

        因为相机的视野从一点出发按锥体的形状不断延申,截取锥体中的一部分,也就是一个台体,再从台体压缩到一个长方体来看透视投影,如何进行透视投影:

                                一是压缩

                                二是正交投影

        从zoy平面来看,因为任意一个在台体上但不是近端平面的平面z最终要压缩至与近端平面等大,所以通过相似三角形关系可以得到压缩前后的x,y的坐标值关系:

\left\{\begin{matrix} {x}'=\frac{nx}{z}\\ {y}'=\frac{ny}{z} \end{matrix}\right.

        那么原来的台体内某点坐标与压缩之后的关系就有:

\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}\rightarrow \begin{bmatrix} \frac{nx}{z}\\ \frac{ny}{z}\\ unknown\\ 1 \end{bmatrix}\Leftrightarrow \begin{bmatrix} nx\\ ny\\ unknown\\ z \end{bmatrix}

        注:此处的z轴坐标除了近端和远端平面的z轴坐标不变外,其他平面上的点不一定不变所以是unknown

        那么“压缩”矩阵就有:

\begin{bmatrix} nx\\ ny\\ unknown\\ z \end{bmatrix}=M_{persp\rightarrow ortho}\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}

        可以确定的是:

M_{persp\rightarrow ortho}=\begin{bmatrix} n& 0 &0 &0 \\ 0 & n & 0 &0 \\ ?&? &? &? \\ 0 & 0 & 1& 0 \end{bmatrix}

        为什么可以确定一二四行呢,因为变换后的x坐标值只与变换前的x坐标值有关,只能是 \left ( n,0,0,0 \right ) ,同理,y也是如此,第四行也可以确定了

        最后如何确定“?”里的元素呢,要用到两个特殊的面:

                一是近端平面上的任何一个点都是不压缩不偏移不变化的

                二是远端平面上任何一个点的z轴坐标值都是不变的

        那么根据第一点可以得到近端平面上的任意一点的压缩前后的坐标值有:

\begin{bmatrix} x\\ y\\ n\\ 1 \end{bmatrix}\rightarrow \begin{bmatrix} nx\\ ny\\ n^{2}\\ n \end{bmatrix}

        代入到之前的矩阵方程:

\left [ 0,0,A,B \right ]\begin{bmatrix} x\\ y\\ n\\ 1 \end{bmatrix}=n^{2}

        注:这里的左边的行向量是上述“压缩”矩阵的第三行,为什么前两个元素是0,是因为n^2与x,y无关,只可能由后面两项线性组合得到

        根据第二点可以得到远端上的中心点 \left ( 0,0,f,1 \right ) 压缩前后的坐标值有:

\begin{bmatrix} 0\\ 0\\ f\\ 1 \end{bmatrix}\rightarrow \begin{bmatrix} 0\\ 0\\ f^{2}\\ f \end{bmatrix}

        由上面两点得到的两个坐标变换可以得到:

\left\{\begin{matrix} An+B=n^{2}\\ Af+B=f^{2} \end{matrix}\right.

        求解得到:

\left\{\begin{matrix} A=n+f\\ B=-nf \end{matrix}\right.

        这样就得到了压缩矩阵的所有元素

        下一步需要再做一次正交投影得到最后的透视投影

M_{persp}=M_{ortho}M_{persp\rightarrow ortho}

        课后问题:台体内(不包含近远端平面)任何一点的z轴坐标压缩时会如何变化?

                不妨取台体内任意一点 \left ( x,y,z,1 \right ) 经过压缩变换之后得到变换之后的z坐标值:

{z}'=\begin{bmatrix} 0 &0 &n+f & -nf \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix}=(n+f)z-nf

                将上面的变换看作一次函数与y=x联立可以得到一个交点 \left (\frac{nf}{n+f-1},\frac{nf}{n+f-1} \right )

 

                可以知道:

\left\{\begin{matrix} {z}'>z,z>\frac{nf}{n+f-1}\\ {z}'=z,z=\frac{nf}{n+f-1}\\ {z}'<z ,z<\frac{nf}{n+f-1}\end{matrix}\right.

                

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值