MickeyMiao

起点草甸

MickeyMiao

code is cheap, show me your prompt

51 篇文章 · 18 个分类 · 4 位朋友

向下滑动,出发 (或按 1-6 直达)

服务器小镇

家里小主机上的 Minecraft 生存服,白名单制。加入:QQ 群

状态
读取中…
在线
-
版本
-
已开服
-

每 10 分钟更新一次

关于雪松林

嗨,我是王思淼

图形渲染开发工程师 @ 小米。喜欢图形学、游戏和折腾服务器。

完整介绍 GitHub Bilibili Steam

回到森林 Esc 关闭

笔记GAMES101

GAMES101 第4讲 观察变换(视图变换与投影变换)

观察变换

观察变换(Viewing Transform)是将世界坐标系中的物体变换到裁剪坐标系中的过程

视图/相机变换

相机坐标系

视图/相机变换(View/Camera Transform)是将世界坐标系中的物体变换到相机坐标系中的过程

视图变换是在摆放照相机, 所以我们要定义相机的参数:

  • 坐标(Position):
  • 观察方向(Look At/Gaze):
  • 上方向(Up):

为了方便计算和理解, 我们认为相机坐标系是:

  1. 相机坐标永远位于原点
  2. 相机的上方向永远是 轴正方向
  3. 相机的观察方向永远是 轴负方向, 即 方向
  4. 所有物体随着相机的移动而移动

视图变换矩阵

假如相机本身的坐标是 , 观察方向是 , 上方向是 , 那么将其转换为相机坐标系的操作则有:

  1. 将 移动到原点
  2. 将 转换为 轴
  3. 将 转换为 轴
  4. 将 转换为 轴

将以上操作写成矩阵的形式:

其中 为旋转矩阵部分, 为平移矩阵部分

通过从 旋转到 轴来直接推导旋转矩阵较为困难

但是已知 轴的单位向量 , 求旋转到 的旋转矩阵 是比较容易的

同时又因为旋转矩阵是正交矩阵, 所以有

投影变换

投影变换(Projection Transform)是将相机坐标系中的物体变换到裁剪坐标系中的过程

投影变换分为正交投影(Orthographic Projection) 和 透视投影(Perspective Projection)

正交投影

较为简单的理解:

  1. 相机放在原点, 观察方向是 轴, 向上方向是 轴
  2. 将物体的 坐标直接扔掉, 保留 坐标
  3. 将 坐标映射到 的范围内(方便后续裁剪)

在图形学中的正交投影:

  1. 在空间中定义一个立方体, 并规定其左右, 下上, 远近的边界分别在 轴上的范围
  2. 将这个立方体映射到 的正则立方体(Canonical Cube)中
    • 将立方体的中心移动到原点
    • 将 轴分别拉伸到 的范围内
  3. 注意: 不会抛弃 轴的值, 值越小, 距离相机越远

矩阵的形式为(先平移再缩放):

左右手坐标系的不同会导致 轴的方向不同, 所以在计算时要注意

透视投影

透视投影使用的最广泛的投影方式, 也是人眼看到的世界的投影方式

回顾: 与 表示的是三维空间的同一个点 , 注意

因此, 与 表示的是三维空间的同一个点 , 注意

  1. 先将视锥体的远端平面"挤压"到和近端平面齐平的位置, 此时成为了一个立方体
  2. 将立方体映射到 的正则立方体(Canonical Cube)中, 操作类似于正交投影

挤压的过程中为了便于理解和计算, 我们规定:

近端平面的所有坐标都不变, 视锥体远端平面的 坐标也都不变, 远端平面中心点的所有坐标也不发生变化, 此时挤压操作只有唯一解

根据相似三角形, 所有点的

在齐次坐标中, 有:

我们想要知道挤压矩阵 的形式, 使得:

可以反推出:

又由于近端平面的所有坐标都不变, 我们假设有一个近平面上的点 , 则有:

我们可以推断出矩阵的第三行 满足:

由于远端平面的中心点的坐标不变, 我们假设有一个远平面上的中心点 , 则有:

我们可以推断出矩阵的第三行 满足:

综上有:

解方程得到:

所以挤压操作的矩阵形式为:

透视投影的矩阵形式为(先挤压再正交):

思考: 在挤压操作时, 远端平面与近端平面中间的 坐标是如何变化的? 变得更远(z更小)还是更近(z更大)?

#GAMES101#计算机图形学

评论