【图形学笔记】Lecture04-Transforms 变换

Lecture04-Transforms 变换

Transforms 变换

变换有什么用?1、建模。2、观察。

  • Scale Transform(non-uniform anisotropic)缩放变换(非规范,各向异性),如果是规范的就叫 相似变换(Similarity Transform)。
  • Reflection Transform 反射变换。
  • Shear Transform 剪切变换。
  • Rotate (CCW by default)旋转(默认逆时针)
  • Translation 平移:需要加一个维度(齐次坐标 Homogeneous Coordinates
    • 在齐次坐标上,\((x,y,w)\) 在2D里面对应点 \((x/w,y/w,1)(w\neq 0)\)
  • Affine Transformation 仿射变换

\[\begin{bmatrix} x'\\y'\\1 \end{bmatrix}= \begin{bmatrix} a&b&t_x\\c&d&t_y\\0&0&1 \end{bmatrix}\cdot \begin{bmatrix} x\\y\\1 \end{bmatrix} \]

对应着先做线性变换(这里其实还有个概念叫刚体变换 Rigid Transform),再做平移

  • Projective Transform 对应着任意一个矩阵

Composite Transform 分解变换

有点显然,跳了。

Q:如何沿着给定的点 \(c\) 旋转?

A:先把c平移到原点,旋转,再平移回去,\(M=T(c)\cdot R(\alpha) \cdot T(-c)\)

3D Transformations 三维的变换

\[\begin{bmatrix} x'\\y'\\z'\\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}\cdot \begin{bmatrix} x\\y\\z\\1 \end{bmatrix} \]

几乎一样的,先线性变换,再平移。

旋转

绕着 \(x,y,z\) 轴旋转,意味着这个轴的基不动,旋转另外两个基,假设原本是\(e^{xi}=\cos x+i\sin x=(X,Y)\),逆时针旋转 \(\alpha\) 之后,得到\(e^{(x+\alpha)i}=\cos(x+\alpha)+i\sin(x+\alpha)=X\cos\alpha-Y\sin \alpha+i(Y\cos \alpha +X\sin\alpha)\),也就是\(e^{(x+\alpha)i}=(X\cos\alpha-Y\sin\alpha,X\sin\alpha+Y\cos\alpha)\)

\[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_{xyz}(\alpha,\beta,\gamma)=R_x(\alpha)\cdot R_y(\beta)\cdot R_z(\gamma)\)欧拉角(注意这里是有顺序的,当然实际上关于欧拉角能说的也有很多细节,这里似乎都省略了)

Rodrigues 罗德里格旋转公式

沿着向量 \(\vec n\) 旋转 \(\alpha\),对应的转移矩阵:

\[R(\vec n,\alpha)=\cos \alpha\cdot \bf{I}+(1-\cos\alpha) \mathbf{n\cdot n}^{T}+\sin\alpha \begin{bmatrix} 0&-n_z&n_y\\ n_z&0&-n_x\\ -n_y&n_x&0 \end{bmatrix} \]

注记:

  • 1、注意这里的轴是默认过原点的,没过原点自然就要平移啦。
  • 2、右边的矩阵是个什么鬼东西?仔细想,这个向量对应着叉积运算:

\[\begin{bmatrix} 0&-n_z&n_y\\ n_z&0&-n_x\\ -n_y&n_x&0 \end{bmatrix}\cdot \begin{bmatrix} x\\y\\z \end{bmatrix} =\begin{bmatrix} -yn_z+zn_y\\ x n_z-z n_x\\ -x n_y+z n_x \end{bmatrix}=((n_x,n_y,n_z)\times (x,y,z))^T \]

Viewing Transformation 视图变换

  • 相机和物体一起移动,那么得到的照片是一样的。

  • 考虑把照相机移动到原点,并且朝着 \(-z\) 轴的方向看,然后把物体做对应的变换。相机有哪些关键的信息?

  • 需要固定观测的方向 \(\vec g\),以及向上的方向(相机的向上方向) \(\vec t\),同时通常会定一个向 \(\vec g\times \vec t\)

也就是说假设给相机做了变换 \(M_{view}\),意味着:

  • 1、移动到原点。
  • 2、旋转 \(g\) (gaze direction)到 \(-z\) 轴,旋转 \(t\)\(y\) 轴,旋转 \(g\times t\)\(x\) 轴。

第一步是

\[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}^{-1}=\begin{bmatrix} x_{g\times t}& x_t& x_{-g}&0\\ y_{g\times t}& y_t& y_{-g}&0\\ z_{g\times t}& z_t& z_{-g}&0\\ 0&0&0&1 \end{bmatrix} \]

然后注意到一个事实:对于任意 \(n\) 维空间上的旋转变换,对应着把原本的基变成一组新的基,假设\(R_{ij}=(\vec x_1,\dots,\vec x_n)\),则

\[(R\cdot R^{T})_{ij}=\sum_{k=1}^n x_{ik} x_{jk}=\vec{x_i}\cdot \vec{x_j} \]

\(\vec x_i(i=1,\dots,n)\) 都是单位向量,因此\((R\cdot R^T)_{ij}\) 当且仅当 \(i=j\) 时为1,其他时候是 \(0\),故 \(R\cdot R^T=E\),所以对于旋转变换,逆变换矩阵=变换矩阵的转置!

\[R_{view}=\begin{bmatrix} x_{g\times t}& y_{g\times t}&z_{g\times t}&0\\ x_t&y_t&z_t&0\\ x_{-g}&y_{-g}&z_{-g}&0\\ 0&0&0&1 \end{bmatrix} \]

最后

\[M_{view}=R_{view} T_{view} \]

Projection Transformation投影变换

orthographic/perspective projection 正交/透视投影

Orthographic Projection正交投影

通过平移把立方体 \([l,r]\times [b,t]\times [f,n]\) 中心移到原点,再通过伸缩变换把立方体变成标准(canonical)立方体\([-1,-1]^3\)

\[M_{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} \cdot \begin{bmatrix} 1&0&0&-(r+l)/2\\ 0&1&0&-(t+b)/2\\ 0&0&1&-(n+f)/2\\ 0&0&0&1 \end{bmatrix} \]

这时候 \(z\in [-1,1]\) ,在做 Z-buffer的时候比较方便。

注意: 现在的变换看来,会觉得沿着 \(-z\) 轴的远/近不是很直观(n应该代表near,f应该代表far,但这里是反过来的)

Perspective Project 透视投影

三维空间怎么做透视投影?

  • 1、先挤压(squish),把锥台体(frustum)变成一个立方体(cuboid)。
  • 2、再做正交投影

标准的透视投影(只看头尾)

如果只看前后平面,透视投影之后 \(z\) 应该是不变的

  • 中心在 \((0,0,0)\),想想投影平面在 $z=d $。
  • \((x,y,z)\to (x\cdot \frac{d}{z},y\cdot \frac{d}{z},d)\)
  • 如何用矩阵表示变换?齐次坐标! 所有形如\((kx,ky,kz,k)\) 的齐次坐标\((k\neq 0)\),都对应着3维空间里的点 \((x,y,z)\)
  • 所以就变成考虑:

\[\begin{bmatrix} x\cdot \frac{d}{z}\\ y\cdot \frac{d}{z}\\ d\\ 1 \end{bmatrix} \sim \begin{bmatrix} x\\y\\z\\\frac{z}{d} \end{bmatrix} = \begin{bmatrix} 1&0&0&0\\ 0&1&0&0\\ 0&0&1&0\\ 0&0&\frac{1}{d}&0 \end{bmatrix}\cdot \begin{bmatrix} x\\y\\z\\1 \end{bmatrix} \]

Perspective to Orthographic

我们现在希望透视到正交的这一步,能保持一些性质:

  • 1、近平面和远平面的 \(z\) 应该保持不变。

  • 2、近平面和远平面的中心(假设平面中心穿过 \(z\) 轴)的坐标应该保持不变。

  • 3、 \(x,y\) 变换和上面的一样,\((x,y)\to (x\frac{n}{z},y\frac{n}{z})\),其中 \(n\) 表示到近平面的距离。

于是:

\[\begin{bmatrix} x\\y\\z\\1 \end{bmatrix} \Rightarrow \begin{bmatrix} x(n/z)\\y(n/z)\\?\\1 \end{bmatrix} \xlongequal{mult.\ by\ z} \begin{bmatrix} nx\\ny\\z?\\z \end{bmatrix} \]

假设最左边到最右边乘了个我们要的矩阵 \(M_{persp\to ortho}\),那么应该有:

\[M_{persp\to ortho}=\begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ ?&?&?&?\\ 0&0&1&0 \end{bmatrix} \]

接着考察远近平面的中心不变这条性质,取近平面上任意一点 ,要有 \(M_{persp\to ortho}(x,y,n,1)^T=(nx,ny,n^2,1)^T\),因为 \(x,y\) 是任取的,所以可以直接假设矩阵的第三行形如 \((0,0,A,B)\) 的形式,那么有 \(An+B=n^2\)

再考虑远平面的中心\((0,0,f,1)\),变换后是\((0,0,f,1)\sim (0,0,f^2,f)\),因此有 \(Af+B=f^2\),解方程组得到

\[\left\{ \begin{aligned} &An+B=n^2\\ &Af+B=f^2\\ \end{aligned} \right. \ \Rightarrow\ \left\{ \begin{aligned} A&=n+f\\ B&=-nf \end{aligned} \right. \]

最终

\[M_{persp\to ortho}=\begin{bmatrix} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0&0&1&0 \end{bmatrix} \]

以及

\[M_{persp}=M_{ortho}\times M_{persp\to ortho} \]

Q:那么在近平面和远平面中间的点的变化是均匀的吗?

A:并不是,比如取 \((0,0,\frac{n+f}{2},1)\) 这一点,变换后 \(z\) 方向分量变为 \(\frac{n^2+f^2}{2}\),很明显不是均匀的。

Hierarchical Transforms 层次变换

每个形状都有自己的变换,如果单独编辑一个元素,可以引起很多变换。

引入“骨骼”(Skeleton)的概念,分组表示:

  • 每个组包含一些更小的组,或者形状
  • 每个组的变换和上一级的组的变换相关
  • 每个组的变换自然就是,从根节点下来的变换的复合。
posted @ 2023-10-26 17:22  yoshinow2001  阅读(137)  评论(0编辑  收藏  举报