计算机图形学基础笔记(7.1)

Category:Higher Mathematics & Computer Graphics Application

正文

7 查看(Viewing)

在上一章中,我们看到了如何使用矩阵转换作为在2D或3D空间中排列几何对象的工具。几何转换的第二个重要用途是在3D世界的3D位置之间移动对象,在3D世界的2D视图中。这个3D至2D映射称为查看转换,它在对象订购渲染中起着重要作用,在对象订购渲染中,我们需要迅速找到场景中每个对象的图像空间位置。

当我们在第4章中研究射线跟踪时,我们介绍了不同类型的透视图和拼字视图,以及如何根据任何给定的视图生成观看射线。本章是关于该过程的倒数的。在这里,我们解释了如何使用矩阵变换来表达任何平行或透视视图。本章中的转换项目3D点(世界空间)中的图像(图像空间)中的2D点,它们将在给定像素的查看射线上投射任何点,回到该像素在图像空间中的位置。

如果您最近没有看过它,建议在阅读本章之前,请回顾第4章中对观点和射线生成的讨论。

就其本身而言,从世界到图像的指向点的能力仅适用于生成线框渲染 - 渲染仅绘制对象的边缘,并且更紧密的表面不会闭塞更遥远的表面(图7.1)。就像射线示踪剂需要找到沿每个观看射线的最接近的表面交点一样,显示固体看起来对象的对象订购渲染器也必须弄清楚在屏幕上任何给定点绘制的(可能是许多)表面中的哪个是最接近的(可能是许多)表面仅显示那个。在本章中,我们假设我们正在绘制一个模型,该模型仅由3D线段组成,这些模型由其两个端点的(x,y,z)坐标指定。稍后的章节将讨论生产实心表面渲染所需的机械。 image.png

7.1查看转换

查看转换的任务是将 3D 位置(表示为规范坐标系中的 (x, y, z) 坐标)映射到图像中的坐标(以像素为单位表示)。它是一种复杂的野兽,取决于许多不同的东西,包括相机的位置和方向、投影的类型、视野和图像的分辨率。与所有复杂的转换一样,最好将其分解为几个更简单的转换的产物。大多数图形系统通过使用一系列三个转换来做到这一点:

• 相机变换或眼睛变换,这是一种刚体变换,可将相机放置在原点的方便方向。它仅取决于相机的位置和方向或姿势。

• 投影变换,它从相机空间投影点,使所有可见点在 x 和 y 中的范围为 -1 到 1。它仅取决于所需的投影类型。

• 视口变换或窗口变换,将这个单位图像矩形映射到像素坐标中所需的矩形。它仅取决于输出图像的大小和位置

一些 API 使用“查看转换”只是我们称为相机转换的查看转换部分。

为了便于描述过程的各个阶段(图 7.2),我们为坐标系命名,这些坐标系是这些变换的输入和输出。

image.png

相机转换将指标转换为规范坐标(或世界空间),以将相机坐标或将它们放置在相机空间中。投影转换将点从相机空间转移到规范视图卷。最后,视口转换将规范视图卷映射到屏幕空间。

这些转换中的每一个都非常简单。我们将详细讨论从视口转换开始的拼字法案,然后介绍支持透视预测所需的更改。

其他名称:相机空间也是“眼睛空间”,相机变换有时是“观看变换”;规范视图体积也是“剪辑空间”或“标准化设备坐标”;屏幕空间也是“像素坐标”。

7.1.1视口转换

我们从一个问题开始,该问题的解决方案将在任何查看条件下重复使用。 我们假设我们想要查看的几何图形位于规范视图体积中,并且我们希望使用朝 -z 方向看的正交相机来查看它。 规范视图体积是包含笛卡尔坐标在 -1 和 1 之间的所有 3D 点的立方体,即 (x, y, z) ∈ [-1, 1]3(图 7.3)。我们将 x = -1 投影到屏幕左侧,x = 1 投影到屏幕右侧,y = -1 投影到屏幕底部,y = 1 投影到屏幕顶部。

image.png

回忆第 3 章中像素坐标的约定:每个像素“拥有”一个以整数坐标为中心的单位正方形;图像边界与像素中心有半个单位的过冲;最小像素中心坐标为(0, 0)。如果我们正在绘制具有 nx x ny 像素的图像(或屏幕上的窗口),我们需要将正方形 [−1, 1]2 映射到矩形 [−0.5, nx − 0.5] × [−0.5, ny - 0.5]。

“规范”这个词再次出现——它意味着为了方便而任意选择的东西。
例如,单位圆可以称为“标准圆”。

现在,我们假设所有要绘制的线段都完全在规范视图体积内。稍后我们会在讨论剪裁时放宽这个假设。

将正方形映射到潜在的非正方形矩形不是问题; x 和 y 最终会得到从标准坐标到像素坐标的不同比例因子。

由于视口变换将一个轴对齐的矩形映射到另一个,这是公式(6.6)给出的窗口变换的一种情况:

image.png

请注意,此矩阵忽略了规范视图卷中点的z坐标,因为沿投影方向的点的距离不会影响图像中的点何处。但是,在我们正式将其称为视图端口矩阵之前,我们添加了一个行和列以沿Z坐标而不更改它。我们在本章中不需要它,但是最终我们将需要Z值,因为它们可以用来使更紧密的表面隐藏更遥远的表面(请参阅第8.2.3节)。

image.png

7.1.2拼字图投影转换

当然,我们通常希望在标准视图体积之外的空间区域中渲染几何图形。我们概括视图的第一步将保持视图方向和方向固定,沿 -z 方向看,y 向上,但允许查看任意矩形。我们不会替换视口矩阵,而是通过将其与右侧的另一个矩阵相乘来增加它。

在这些约束下,视图体积是一个轴对齐的盒子,我们将命名它的边坐标,使得视图体积为 [l, r] × [b, t] × [f,n]​​ 如图所示7.4.我们将此框称为正交视图体积,并按如下方式引用边界平面:

image.png

image.png

该词汇假设一个观众,他的头指向y方向。1这意味着n> f,这可能是不直觉的,但是如果您假设整个拼字图视图卷具有负z值。然后,仅当n> f时,z = n“近”平面就更靠近查看器;这里f的数量小于n,即绝对值的负数大于n。

这个概念如图 7.5 所示。从正交视图体积到规范视图体积的变换是另一种窗口变换,因此我们可以简单地将正交视图和规范视图体积的边界代入方程(6.7)以获得该变换的矩阵:

image.png

image.png

这个矩阵与 OpenGL 中传统使用的矩阵非常接近,除了 n、f 和 zcanonical 的符号相反。

为了在正交视图体积中绘制 3D 线段,我们将它们投影到屏幕 x 和 y 坐标并忽略 z 坐标。我们通过结合方程(7.2)和(7.3)来做到这一点。请注意,在程序中,我们将矩阵相乘以形成一个矩阵,然后按如下方式操作点:

image.png

z 坐标现在位于 [−1, 1] 中。我们现在不利用这个,但是当我们检查 z-buffer 算法时它会很有用。

以 ai 和 bi 为端点绘制许多 3D 线的代码因此变得既简单又高效:

image.png

这是矩阵变换机器如何使图形程序简洁高效的第一个示例。

7.1.3 相机变换

我们希望能够在 3D 中改变视点并朝任何方向看。

有许多用于指定查看器位置和方向的约定。我们将使用以下一个(见图 7.6):

image.png

image.png

眼睛位置是眼睛“看到”的位置。如果您将图形视为摄影过程,那么它就是镜头的中心。凝视方向是观察者正在观看的方向上的任何矢量。上视向量是平面中的任何向量,既将观察者的头部平分为左右两半,又为站在地面上的人指向“天空”。这些向量为我们提供了足够的信息来建立一个以原点 e 和 uvw 为基础的坐标系,使用第 2.4.7 节的构造:

image.png

image.png

如果我们希望转换的所有点都存储在原点 e 和基向量 u、v 和 w 的坐标中,我们的工作就完成了。但如图 7.7 所示,模型的坐标以标准(或世界)原点 o 和 x、y 和 z 轴的形式存储。要使用我们已经开发的机器,我们只需要将我们希望绘制的线段端点的坐标从 xyz 坐标转换为 uvw 坐标。这种变换在 6.5 节中讨论过,实现这种变换的矩阵是相机坐标系的规范到基础矩阵:

image.png

或者,我们可以将相同的转换视为首先将 e 移动到原点,然后将 u、v、w 与 x、y、z 对齐。

为了使我们之前的仅 z 轴查看算法适用于具有任何位置和方向的相机,我们只需将此相机变换添加到视口和投影变换的乘积中,以便它将来自世界的传入点转换为相机坐标在它们被预测之前:

image.png

同样,一旦矩阵基础设施到位,几乎不需要任何代码。