2025年视图(Viewing)

视图(Viewing)目录 1 视图变换 Viewing Transformati 1 1 视口变换 Viewport Transformati 1 2 正交投影变换 Orthographic Projection Transformati 1 3 相机变换 Camera

大家好,我是讯享网,很高兴认识大家。

目录

1、视图变换(Viewing Transformations)

1.1、视口变换(Viewport Transformation)

1.2、正交投影变换(Orthographic Projection Transformation)

1.3、相机变换(Camera Transformation)

2、投影变换(Projective Transformations)

3、透视投影(Perspective Projection)

4、透视变换的一些特性(Some Properties of the Perspective Transform)

5、视场(Field-of-View,FOV)


        几何变换除了能通过变换重新排列空间中的几何对象,还可以将几何对象从三维世界中的位置变换到它们在二维视图中的位置,这种从三维到二维的映射称为视图变换(Viewing Transformation)。

1、视图变换(Viewing Transformations)

        视图变换(viewing transformation)是将标准坐标系中表示为(x, y, z)的三维坐标点映射到以像素为单位的图像坐标中。要实现该操作,需要确定相机的位置、方向、投影类型、视场、图像分辨率等。在实际操作过程中,和其他复杂的变换一样,都是先将其分解为几个简单的变换的乘积。一般的图形系统通过三个变换来实现(如下图7.2):

        1)、相机变换(camera transformation)或眼睛变换(eye transfoormation):把规范(或世界)坐标中的点转换为相机坐标中的点。把相机放到指定位置,并指定相机的朝向和向上方向。

        2)、投影变换(projection transformation):把所有的可见的点从相机空间映射到规范化视图体中,一般是一个x和y轴都处于-1到1的范围内。这取决于投影的类型。

        3)、视口变换(viewport transformation)或窗口变换(windowing transformation):用于映射规范化视图体(即投影变换中得到的单位图像矩形)到像素坐标矩形中。这取决于输出图像的大小和位置。


讯享网

1.1、视口变换(Viewport Transformation)

        假设我们要看的物体在规范视图体中,而且我们是沿着坐标轴的-z方向去看。规范化视图体是笛卡尔坐标系在-1和+1之间的所有三维点组成的立方体(边长为2的立方体,中心位于坐标原点),即。如图7.3。x=-1是屏幕的左边,x=+1是屏幕的右边,y=-1是屏幕的底部,y=+1是屏幕的顶部。

        关于像素坐标我们约定:①、每个像素都是以整数坐标为中心的单位正方形;②、图像边界从像素中心超出半个单位;③、最小像素中心坐标为(0, 0)。

 如果我们将图形绘制到像素为的图像(或屏幕上的窗口),那么我们就需要将大小的正方形映射到的矩形内。将正方形映射到不同比例的矩形,x、y坐标只需要使用不同的比例因子即可。

        假设我们所有要绘制的线段都在规范化视图体内。

        视口变换将一个轴对齐的矩形映射到另一个轴对齐的矩形。 先将[-1, 1]扩大到,然后再平移到屏幕中心即可。它是由公式6.6给出的窗口变换的一种情况(公式7.1):

注意,上式中的矩阵忽略了规范视图体中点的z坐标,因为这些点沿投影方向的距离不会影响点在图像中的投影位置。使近表面隐藏远表面,需要用到z的值。包含z坐标的视口矩阵为:

1.2、正交投影变换(Orthographic Projection Transformation)

        如果我们想在规范视图体以外的空间中渲染几何体,第一步我们应该保持固定的视角和向上方向(+y为向上方向,沿着-z方向看)。我们不会替换视口矩阵,而是通过右乘另一个矩阵来扩展它。

        视图体我们定义为一个轴对齐的长方体(体积为:[l, r]x[b, t]x[f, n])。如图7.4所示:

我们称该长方体为正交视图体(the orthographic view volume),其边界为:

左平面:x = l ≡ left plane,
右平面:x = r ≡ right plane,
下平面:y = b ≡ bottom plane,
上平面:y = t ≡ top plane,
近平面:z = n ≡ near plane,
远平面:z = f ≡ far plane.

上面的各个面是我们假设一个人从+y方向,沿着-z方向看得到的结果。如图7.5这意味着n>f(z=n平面更接近观察者)。f比n小,由于n和f都是负值,所有f的绝对值大于n的绝对值。

        从正交视图体(orthographic view volume)到规范视图体(canonical view volume)的变换属于窗口变换( windowing transform),我们可以将正交视图体和规范视图体的边界带入公式(6.7),得到变换矩阵(公式7.3):

公式6.7: 映射立方体到立方体。

 

        为了在正交视图体中绘制三维线段,我们将他们投影到屏幕上的x和y坐标上,而忽略z坐标。通过矩阵7.2和矩阵7.3的复合变换实现:

z坐标范围在[-1,1]之间。这点在z缓冲算法中很有用。

        绘制具有端点和的三维线段的伪代码为:

1.3、相机变换(Camera Transformation)

        在三维中我们可以改变视角,并朝着任意方向看。如果想指定位置和方向,需要几个约定(如图7.6):

        1)、相机(或眼睛)的位置e。即从哪里看。

        2)、注视角度/方向。往哪个方向看。

        3)、向上的方向。相机对着某个方向后,本身还是可以三百六十度转动,所以需要定义一个向上方向来把相机固定住。

        这些向量为我们提供了足够的信息来设置一个坐标系(图7.7),其中原点时e,由uvw构成。

根据之前的公式:

 如果我们希望要转换的点都是以uvw作为基向量,并相对于e作为原点存储在坐标中,则至此我们的工作已经完成。但是,如图7.7所示,模型的坐标是以规范(或世界)坐标系,原点o和xyz轴表示的。所以我们需要将希望绘制的线段的端点从xyz坐标系转换为uvw坐标系。实现这种变换的矩阵是相机的标准基矩阵(可以看做是先将e移动到原点o,然后将uvw对齐到xyz):

注意:从xyz坐标系转换为uvw坐标系,实现起来很困难,但是反过来从uvw坐标系转换为xyz坐标系就很容易。所以我们可以先实现从uvw到xyz的转换,再利用旋转矩阵是正交矩阵的性质,可以很容易求得其逆矩阵,从而实现从xyz坐标系到uvw坐标系的转换。

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

2、投影变换(Projective Transformations)

        透视投影的一个关键特性是,从原点往-z方向看,屏幕上物体的大小是按1/z比例进行缩放的。如图7.8所示: 

        上图中,相机(观察者)位于e点,观察方向为(z轴负方向),视图平面到相机的距离是d,某个点投影到e的方向,它与视图平面相交的位置就是它的绘制位置。y是点沿y轴的距离,是该点投影到视图面上的位置。要变换的点与原始点(x, y, z)之间满足如下关系:

        如何把正交投影应用到透视投影中?我们只需通过投影矩阵和正交投影中的复合矩阵相乘。然而这种类型的变换,其输入向量的坐标之一出现在分母中,不能通过仿射变换来实现。

        我们把点(x, y, z)用齐次向量的形式表示为。同理,齐次向量代表点,在仿射变换中w固定为1,但现在我们允许w可以取不等于0的任意值。

        线性表换可以应用于类似下面的函数:

         仿射变换则可以应用于类似下面的函数:

         如果将w作为分母,可以应用于类似下面的函数(称为x、y、z的“线性有理函数”):

这里需要进行一个约束:变换点的所有坐标的分母都是相同的:

用矩阵形式表示为:

这种变换就称为投影变换 (projective transformation)或单应性变换(homography)。

         如图7.9所示,通过乘以矩阵可以实现二维投影变换,将单位正方形([0,1]x[0,1])变为图中所示的四边形。

例如,正方向右下角的点(1,0)由齐次向量表示为,通过乘以矩阵M进行变换后点的位置的齐次向量为:,表示点(3,0)。假如我们用矩阵代替上面的矩阵M,得到的结果是,它也表示(3,0)这个点。所以我们得出结论,任何非零标量c乘以矩阵M,结果都是等价的,因为分子和分母同时用c进行缩放,不改变最终的结果。

        上面我们针对最后的结果都对w进行了归一化处理。有没有更好的处理方法呢?其实三维的投影变换可以认为是四维的线性变换,另外我们规定向量的所有标量倍数都表示同一个点:

符号~读作“等价于”,意味着这两个齐次向量都描述了空间中的同一点。

        例如,如下图7.10中,x=1.5这个点可以由x=1.5h上的任何点表示,例如空心圆处的点。但是在将x解释为传统笛卡尔坐标之前,我们通过除以h,得到(x,h)=(1.5,1),如图中黑点所示。

        如图7.11,在二维齐次坐标中,我们可以用三元向量表示平面上的点。比如,齐次向量或直线上的点都可以用来表示点(-1,-0.5)。直线上的任何齐次向量都可以映射到直线与平面w=1的交点,从而获得其笛卡尔坐标。

        这样我们就可以在不考虑w坐标值的情况下,多次变换齐次向量。事实上,某些情况下w坐标也可以为0。只有在我们想要一个点的笛卡尔坐标时,才需要对w进行归一化为w=1(所有的坐标除以w)。归一化后,我们就可以从齐次向量的前三个分量中读取坐标x,y,z的值了。

3、透视投影(Perspective Projection)

        投影变换的机制使得通过除以z实现透视变得简单。在图7.8的二维示例中,我们可以通过变换矩阵实现透视投影。比如:

为二维齐次向量到一维齐次向量的变换。这个一维齐次向量表示点(dy/z)(根据公式7.5可知该点等价于一维齐次向量)。 

         对于三维透视投影矩阵,惯例是相机固定在原点,面向-z方向,所以此时点(x, y, z)的距离是-z。和正交投影一样,这里也采用近平面和远平面的概念来限制可见距离范围。近平面作为我们的投影平面,因此图像平面的距离是-n(注意n<0)。

         图7.8中,我们期望得到的结果是(其中的d换成n):

 该变换可通过透视矩阵来实现:

透视矩阵中,第一行、第二行、第四行可以实现上面期望的结果。第三行和正交矩阵、视口矩阵一样,主要和z坐标有关,以便后面我们可用用来进行隐藏表面消除。在透视投影中,由于非常量分母的存在,导致我们在操作x、y的时候,z也会跟着改变。但是我们会保证在近平面和远平面上z的值是不变的。

        所有的透视矩阵,都会对z坐标进行非线性的扭曲。这些矩阵都有图7.12和图7.13所示的特性。z=n这个平面上的点保持不变,z=f这个平面上的点的x和y坐标会被“挤压”。矩阵对点(x, y, z)的作用效果为:

其中,x、y是按比例缩放的(需要除以z)。因为n和z在视图体里都是负的,所以x、y是没有转向的。透视变换还会保持z=n和z=f这两个平面之间z值的相对顺序,这样我们在应用变换矩阵后可以进行深度排序。当我们进行隐藏表面消除时,这一点很重要。

     有时候我们需要对投影变换进行逆变换,所以需要得到P的逆矩阵:

由于齐次向量乘以一个标量不改变其含义,因此对作用于齐次向量的矩阵乘以一个标量也同样不改变其含义。因此我们可以对P的逆矩阵乘以nf,得到另一种形式:

严格来说,P的逆矩阵乘以nf得到的新矩阵不再是P的逆矩阵,但是针对逆变换来说,新矩阵和逆矩阵效果是一样的。

        在公式(7.3)中和正交投影矩阵相关的上下文中,透视矩阵会把透视视图体(形状类似于棱锥体)映射成正交视图体(一个轴对齐的长方体)。有了透视矩阵,我们就可以通过正交变换来得到规范化视图体。这对所有的正交操作都适用,我们只需增加一个矩阵,并且除以w即可。

        将P和串联起来得到透视投影矩阵:

         如何确定透视投影中的l、r、b、t?这几个值确定了我们观察的“窗口”。由于透视矩阵不会改变z=n平面上x、y的值,因此我们可以在该平面上指定(l, r, b, t)。

        为了将透视矩阵集成到正交系统中,我们只需用替换。在应用相机矩阵之后,在正交投影之前插入透视矩阵P。透视视图的完整矩阵操作是:

        该算法的伪代码为:

注意,这里除了多乘一个矩阵外,还需要除以齐次坐标w。

4、透视变换的一些特性(Some Properties of the Perspective Transform)

        透视变换的一个重要特性是它将线映射到线,将平面映射到平面。此外,它将视图体中的线段映射到规范体中的线段。比如线段:

当用4X4矩阵M变换时, 它是一个可能具有不同齐次坐标的点:

齐次化的3D线段为:

如果上式(7.6)可以改写成:

则所有齐次化的点都在一条3D线上。对公式(7.6)进行粗暴的操作,可得到这样的形式:

这表明,线段确实映射到了保留点顺序的线段上。它们不会被重新排序或“撕裂”。

        将线段映射成线段的变换的副产品是,它将三角形的边和顶点映射为另一个三角形的边和顶点。因此,映射后,三角形还是三角形,平面还是平面。

5、视场(Field-of-View,FOV)

        虽然我们可以使用(l, r, b, t)和n指定任意窗口,但有时我们希望有一个更简单的系统,我们可以通过窗口的中心进行查看。这意味着约束条件为:

 如果我们还添加像素为正方形的约束,即图像没有形状变形,则r与t的比率必须和水平像素数与垂直像素数的比率相同:

        如下图7.14,

一旦指定了和,就只剩下一个自由度。这通常用图中的θ代表的视场来设置。该视场被称为垂直视场,用来区分左右侧之间的角度或对角线角度。从图中我们可以看到:

如果指定了n和θ,则我们可以推导出t,并将代码用于更通用的视图系统。在有些系统中,n被硬编码为某个合理值,因此我们便少了一个自由度。

小讯
上一篇 2025-02-19 20:13
下一篇 2025-01-27 23:33

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/74904.html