变换

0 阅读5分钟

变换

以下四种变换都可以通过矩阵相乘得到最终变换结果,但是平移却不行,所以需要引入一种通用的方式表达所有变换,这就需要用到齐次坐标

  1. 旋转
    • 旋转矩阵的逆矩阵等于旋转矩阵的转置矩阵,所以旋转矩阵是正交矩阵 旋转矩阵.jpeg
    • 罗德里格旋转公式,通过旋转轴(默认通过原点)和旋转角度确定旋转矩阵,思路是将旋转角度分解到X,Y,Z

罗德里格旋转公式.jpeg 2. 缩放

  1. 线性变换(例如矩形变成平行四边形)
  2. 轴对称
  3. 平移
  4. 仿射变换(affine transformations)

齐次坐标如下图

让所有的变换都可以通过一个矩阵乘以一个向量的形式

齐次坐标.jpg

二维变换的齐次坐标矩阵特征
  1. 最底部的一行是[0,0,1]
  2. 最右侧的一列是[tx, ty, 1], tx是x轴方向的平移量,ty是y轴的平移量

观测变换

怎么将3D场景变成一张照片(mvp变换)

场景中的模型变换(model transformation)
视图变换(view transformation)
  1. 如何摆放相机,相机和物体的相对位置不变,拍照结果相同
    • 相机位置
    • 向上方向,往哪儿看
    • 相机向上方向
  2. 相机的标准位置,有很多好处,简化计算
    • 相机位置,永远放在原点上
    • 向上方向,往哪儿看,看向-Z方向
    • 相机向上方向,up为Y轴方向
  3. 视图变换就是将相机从任意位置、方向变换到标准位置
视图矩阵

视图矩阵是指描述观察者位置和姿态的矩阵,也叫做相机矩阵。它可以将世界坐标系中的物体坐标转换成相机坐标系中的坐标。具体地,视图矩阵可以通过以下步骤计算得到:

  1. 将相机的位置和方向描述为一个 4x4 的变换矩阵 CC

  2. 计算相机的右侧向量 RR、上方向量 UU 和视线方向向量 DD。其中 DD 是从相机位置指向目标位置的单位向量,而 RRUU 是与 DD 垂直且互相垂直的单位向量。这些向量通常被视为相机坐标系的基向量。

  3. 构造一个 4×44 \times 4 的矩阵 MM,将 RRUUDD 作为矩阵的前三列,将相机位置作为第四列。可表示为: [R.xU.xD.x0R.yU.yD.y0R.zU.zD.z0PRPUPD1]\begin{bmatrix} R.x&U.x &D.x & 0 \\ R.y & U.y & D.y & 0 \\ R.z&U.z&D.z&0 \\ -P•R & -P•U & -P•D & 1 \end{bmatrix}

其中 P=(Px,Py,Pz)P=(Px, Py, Pz) 表示相机位置在世界坐标系中的坐标,点乘符号 表示向量的点积。

  1. 最后,将 MM 与相应的物体变换矩阵 TT 相乘,即得到相机视图中的物体位置。可以表示为:

    V = M • T

其中 VV 是物体在相机坐标系中的位置,TT 是物体在世界坐标系中的变换矩阵。


投影变换(projecttion transformation)

3D到2D

正交投影

正交投影是一种投影方式,它将三维空间中的物体投影到二维平面上,并将其保持原始大小和比例。正交投影可以通过以下步骤来实现:

  1. 定义一个视景体(Viewing Frustum),视景体是一个六面体,其中包含有相机位置、相机的朝向以及近平面和远平面。

  2. 将物体的坐标从世界坐标系中转换到相机坐标系中,得到变换后的物体坐标。

  3. 将变换后的物体坐标映射到视景体内部,也就是将物体坐标映射到相应的平面上。

  4. 对于正交投影,投影矩阵为一个正交矩阵,它可以通过以下公式计算得到:P=[2rl00r+lrl02tb0t+btb002fnf+nfn0001]P = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{bmatrix}

其中,l,r,b,t,n,fl,r,b,t,n,f 分别是相机坐标系中近面、远面、左侧、右侧、下侧和上侧的值。

  1. 将物体坐标乘以投影矩阵得到投影后的物体坐标。

  2. 将投影后的物体坐标从四维坐标系中转换到三维坐标系中,并将其映射到屏幕上,即可完成正交投影。

正交投影相比透视投影来说,它可以保持物体在平面上的大小和比例,但是没有透视效果,因此在一些场景下使用透视投影会更加自然。

  1. 正交投影矩阵的推导过程: 视景体变换到一个长度为2,x,y,z坐标范围在[-1,1],中心在原点的标准的立方体的变换过程即是空间中的物体的世界坐标变换为视景体坐标系中(相机坐标系)

变化步骤

矩阵变换

透视投影

透视投影是一种将三维空间中的物体投影到二维平面上的投影方式,它可以模拟人眼观察物体时的透视效果。透视投影可以通过以下步骤来实现:

  1. 定义一个视景体(Viewing Frustum),视景体是一个六面体,其中包含有相机位置、相机的朝向以及近平面和远平面。

  2. 将物体的坐标从世界坐标系中转换到相机坐标系中,得到变换后的物体坐标。

  3. 对于透视投影,需要将物体坐标投影到相机坐标系中的近平面上。可以通过以下公式计算得到:zn=fzzfz_{n}=\frac{f \cdot z}{z-f},其中 zz 是物体坐标系中的 zz 坐标,ff 是相机到屏幕的距离,znz_n 是相机坐标系中的 zz 坐标。

  4. 将相机坐标系中的坐标进行透视除法,即将 x,y,zx,y,z 坐标分别除以 ww,其中 ww 指在投影坐标系中的 zz 坐标。

  5. 将透视除法后的坐标投影到二维平面上。可以通过以下公式计算得到:px=znxfp_x = \frac{z_n \cdot x}{f}py=znyfp_y = \frac{z_n \cdot y}{f}

  6. 将投影后的物体坐标从四维坐标系中转换到三维坐标系中,并将其映射到屏幕上,即可完成透视投影。

需要注意的是,在进行透视投影时,除法操作可能会导致 w=0w=0 的情况发生,因此需要特殊处理这些情况,以确保计算的正确性。同时,在实际应用中,还需要考虑到相机的位置和朝向、近平面和远平面等参数的设置,以便得到合适的透视效果。

透视投影旋转矩阵

直接求比较麻烦,分为两个步骤

  1. 将六面体的视景体变换成可以做可以做正交投影的视景体 [n0000n0000n+fnf0001]\begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 0 & 1 \end{bmatrix}

  2. 做一次正交投影变换 [2rl00r+lrl02tb0t+btb002fnf+nfn0001]\begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{-2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{bmatrix}

  3. 最终的透视投影矩阵为 [2nrl0r+lrl002ntbt+btb0002(f+n)fn2fnfn0010]\begin{bmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & -\frac{t+b}{t-b} & 0\\ 0 & 0 & -\frac{2(f+n)}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & 1 & 0 \end{bmatrix}