图形学03 – 挑战视图、投影变换大魔王

前言

本篇主要总结了视图转换的原理、投影变换的正交和透视的矩阵推导过程。推导过程真是难的头皮发麻,还好是坚持学完了,很有收获。完结撒花✿✿ヽ(°▽°)ノ✿。同时,感谢令琪大佬的醍醐灌顶的授课。

图形学系列文章:

视图变换

模型(model)、视图(view)、投影(projection)三步走。

如何进行视图变换?

  • 首先要定义相机

    • 设定位置(原点)
    • 定义相机看的方向(观测的方向)
    • 定义向上方向
      image.png
  • 重点观察

    如果相机和所有对象一起移动,“照片”将是相同的。

    image.png

    那么我们认为,永远让相机放在一个固定的位置,所有的东西都是其他物体在移动,相机永远不动,并且相机永远放在原点,永远向 -z 方向看。并且相机永远以 y轴 为向上方向。

    通过转换相机:

    我们总是将相机变换为 原点,在 Y 处,看 -Z。

    转换过程如图:

    image.png

    变成

    image.png

    步骤:

    • 将 e 转换为原点
    • 将 g 旋转到 -Z
    • 将 t 旋转到 Y
    • 旋转 (g x t) 到 X

视图/相机转换

步骤:

  • 公式如下,先平移后旋转。

    image.png

    image.png

  • 将 e 转换为原点

  • 旋转 g 到 -Z,t 到 Y, (g x t)到 X。(任意的一个轴,旋转到到规定的轴,不好写,这里考虑逆变换,求逆变换,再转置回来)

  • 考虑它的逆旋转:X 到 (g x t),Y 到 t,Z 到 -g
    image.png

投影变换

计算机图形学中的投影

  • 3D 到 2D
  • 正交投影
  • 透视投影

image.png

透视投影 vs 正交投影:

image.png

正交投影

不管远处还是近处,一股脑全挤到一个平面上。

如何理解正交投影

简单的理解:

  • 相机位于原点,看着 -Z, y轴为向上方向。
  • 去除z
  • 将生成的矩形平移并缩放到 [-1, 1]2

image.png

通常上:

  • 我们想将一个长方体 [l, r] x [b, t] x [f, n]映射到规范(正则、规范、标准)”立方体 [-1, 1]3

    image.png

顺序会有所不同(到简单方式):

  • 通过平移居中长方体
  • 缩放到“规范”立方体

image.png

矩阵表示

首先,把中心移到原点,然后缩放(长宽高 都除以 2)

image.png

image.png

警告:

  • 我们所讲的,都是看向 -Z的,所以近大于远。
  • 这也是为什么 OpenGL 用左手系的原因。

透视投影

透视投影, 最常见于计算机图形学、艺术、视觉系统,支持近大远小满足这个性质,平行线不平行;收敛到单点。

这里复习下齐次坐标的性质下面的章节会用到。

  • (x, y, z, 1), ( kx, ky, kz, k != 0), (xz, yz, z2, z != 0) 都表示 3D 中的同一个点 (x, y, z)

  • 例如 (1, 0, 0, 1)和 (2, 0, 0, 2) 都代表 (1, 0, 0)

如何理解透视投影

远平面的点挤到近平面,边做长方体,再做一次正交投影。(从透视 到 正交)

image.png

矩阵推导

  • 找到一个变换

    • 回忆一下关键思想:找到变换点 (x’, y’, z’) 和原点 (x, y, z)

    image.png

  • 基于相似三角形原则,得到 y’ 与 y 的对应关系

    所以得到变换点 (x’, y’, z’) 和原始点 (x, y, z) 之间的关系

    image.png

  • 在齐次坐标中:

    image.png

    所以“挤压”(透视到正射)投影就是这样做的

    image.png

  • 已经足以找出 Mpersp->ortho 的一部分

    image.png

  • 观察:第三行 z’

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

    利用近平面上的任何一点都不会改变,这个条件推导:

    image.png

    • 所以第三行必须是 (0 0 A B)

    image.png

    • 现在我们已知的条件是

    image.png

    • 同理,利用远平面上任何一点的z都不会改变,这个条件推导:

    image.png

    • 两个式子求A、B

    image.png

    • 最后,Mpersp->ortho 中的每个条目都是已知的
    • 最后的步骤是做正交投影(Mortho)来结束

    image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享