规范视图体积的目的是什么?


15

我目前正在学习OpenGL,但无法找到该问题的答案。

在将投影矩阵应用于视图空间之后,将视图空间“规格化”,以使所有点都位于[-1,1]范围内。通常将其称为“规范视图体积”或“标准化设备坐标”。

虽然我找到了很多资源,告诉我这是如何发生的,我还没有看到任何东西,为什么它发生。

此步骤的目的是什么?

Answers:


7

最重要的是,它将您的点(顶点)从3D世界空间转换为2D屏幕空间。

这意味着在顶点与该矩阵相乘之后,X和Y坐标在屏幕上的位置([-1,1]之间),Z是深度。Z用于深度缓冲,并标识顶点(或片段)与相机靠近平面的距离。

投影意味着,离近平面更近的顶点离屏幕中间的距离更远->距相机更近的三角形似乎比远处的顶点更大。这基于您的视野-您正在某些createProjectionMatrix函数或createFrustum中输入它。它的工作原理是将相机的视锥和顶点剪切并缩放为立方体。不会显示大于1且小于-1的值。

还保持像素长宽比,因此像素可以是正方形的。那很简单。它只是像这样剪切相机的视锥:屏幕更宽->垂直剪切更多,反之亦然。

简单的答案:
它定义了您的相机视锥,并且对:

  • 使靠近您的物体看起来比远离您的物体更大。
  • 保持像素长宽比-每个人都喜欢方形像素吗?:)

我没有看到任何地方问他投影矩阵的作用。他似乎只是想知道标准化设备的坐标是什么。
克里斯说,请

所述投影矩阵定义了相机平截头体。但这并不能解释将[-1,1]作为标准观看量的原因。为什么没有[-100,100]呢?
bobobobo

1
因为1是比100:D更通用的数字(0更为通用,但是多维数据集0x0x0并不是很有趣...)
Ivan

5

这个答案是事实之后很久了,但是由于我在Google上找到了这个答案,也许这仍然会有所帮助。我只想澄清一下JasonD和Notabene所说的话:进行裁剪计算要容易得多(弄清楚您应该看到什么以及不应该看到什么,因为您正在看的是哪种方式,距离有多远,等等。 )。只需检查所有对象的x,y,z与xMax,xMin,yMax等,而不是检查事物是否与视锥的边界上的平面相交。,因为您只是拥有一个多维数据集。如果只想显示一部分内容,则要复杂一些,但是使用单位立方体比使用平截头体的数学效果更好。

我发现其他答案有误导之处:

-您不是要从视锥中剪掉侧面,而是要使用齐次矩阵转换将其变形为立方体。

-我们不会通过此步骤转换为2D屏幕。无需执行此步骤。从理论上讲,我们可以完成所有工作而无需先将平截头体转换为多维数据集,这会更直观,但数学上会更困难-但是图形的意思是真正非常快速地进行计算,因为平均每个游戏每秒都有很多计算。

更详细的信息:它不一定是我们要转换成的单位立方体,它只需要是一个矩形框即可计算出我们的最大-最小计算。实际上,在课堂上,我们使用了一个框,其中摄像头面向z轴,z从0到1,x从-1到1,y从-1到1。通常在数学1、0中,和-1是使计算更容易的好数字,我认为这就是为什么我们不从-100到100或类似的数字。

TLDR:剪裁更容易。

编辑:bobobobo有其要旨。一切都是三角形,通常是:D。

资料来源:参加大学绘画班


尽管很有趣,但您的观点似乎部分正确。您没有使用齐次矩阵,只是在剪辑空间中定义了齐次空间中的点。2)是的,在剪辑空间中,小物件尚未投影到屏幕上。它发生在透视图划分之后,但是请注意,当您从剪辑空间返回到笛卡尔空间时,必定会发生这种情况。3)是和否。仍然需要将点坐标转换为NDC空间。剪辑空间是不必要的,它特定于GPU。...
user18490 2015年

...不需要剪辑空间阶段,而不是重新映射到单位多维数据集。您的最后一个假设也不正确。您重新映射为-1到1,因为从NDC空间转到栅格空间(视口变换)更容易。如果您将NDC空间设置在[0,1]范围内,则实际上甚至会更容易,某些实现就是这种情况。最后,所有内容都是数学,因此请确保可以使用其他约定。有关更多详细信息,请参见良好的scratchapixel网站。
user18490 2015年


1

我相信这是因为OpenGL无法假设图像的显示方式(纵横比或分辨率,硬件细节等)。它将图像和图像渲染为中间形式,操作系统或驱动程序或任何可缩放至正确分辨率/大小的中间形式。


当您浏览硬件详细信息时,您不正确。有非。另外,如果您在cpu上编写自己的rastarizator(为什么这样做?要了解这些内容是如何工作的:)),您将使用与gpu相同的矩阵。您很幸运,我仍然没有特权来投票:)
Notabene 2010年

它不需要知道长宽比吗?据我了解,它存储X和Y的缩放比例,以便以后图像具有正确的宽高比。
面包jeje

3
如果我错了,请指正我,但他是在您提出要点后谈论,因此我们正在谈论2D。如果是这种情况,则OpenGL不知道您将该图像放在屏幕上的什么位置,也不知道它将如何显示。它可以创建易于缩放和正确放置的图像,但对您而言却不那么容易。我确实同意,硬件详细信息对它来说是个坏名字,我只是说了上面的意思。另外,您可以指定具有长宽比的投影矩阵,但是该比例不必与显示器的长宽比相同。
Chewy Gumball 2010年

3
我不得不说我真的很喜欢这次谈话。您快要对了。让我们更深入。通过projMat乘法顶点后没有图像。结果只是带有深度的2D点集。比起星化开始,它创造了图像。(如果在cpu上,它将在三角形顶点之间绘制线条并将其填充(并对其进行阴影处理)。在gpu上,它恰好在像素/片段着色器之前执行)。宽高比会将应该“缩小”的点设置为大于1或小于-1的值,并且不会显示它们。
Notabene

2
啊!我在这里看到问题。他说:“这通常被称为“规范视图体积”或“标准化设备坐标”。我的回答好像是在询问标准化的设备坐标,但是实际上他根本没有在问这些。实际上,它们是两个完全不同的事物,这就是为什么我们在这里存在分歧。也许应该澄清一下,以便人们不会犯与我相同的错误。
耐嚼口香糖

1

我注意到一个答案已经被接受,但是对于将截头视图转换为单位立方体的剪辑通常很有用。


没错,我对此进行了一点编辑,以使其更加清晰。
Notabene 2010年

顺便说一句,单位立方体是面1的立方体。因此,该名称不合适。应该将其称为规范观看量。
user18490 2015年

1

我也一直在想这个。有几件事情要考虑。

首先,是的,世界上的所有事物都转换为以原点为中心的单位立方体[-1,1]。如果那个单位立方体中没有东西,那么它将不会被显示。

这样做的好处是,您现在可以很容易地剔除三角形。(如果一个三角形的所有3个顶点都具有x > 1x < -1则该三角形可以被剔除)。


0

我建议检查有关Scratchapixel的透视投影矩阵的课程

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

它清楚地说明了为什么将视锥台空间扭曲到一个单位立方体。为什么?本质上是因为在画布上投影3D点的过程涉及到将它们转换为NDC空间,NDC空间是在屏幕上的点在[-1,1]范围内重新映射的空间(假定屏幕是正方形的)。现在我们还将点Z坐标重新映射到[0,1](有时是[-1,1])范围,因此最终得到一个立方体。事实是,当点包含在多维数据集中时,处理它们要比在视锥表中定义它们(这是一个奇怪的空间,一个截顶的金字塔)要容易得多。另一个原因是,它将CG中可以想象的各种投影变换带到同一空间(单位立方体很复杂)。因此,无论您使用的是透视投影还是正交投影,

尽管也许您过多地关注了为什么。单位立方体实际上只是涉及或用于将顶点投影到屏幕上,然后将其坐标重新映射到栅格空间的数学过程的结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.