【问题标题】:In 3d graphics, what is camera or eye space?在 3d 图形中,什么是相机或眼睛空间?
【发布时间】:2012-01-23 00:12:40
【问题描述】:

我正在尝试通过 Jason L. McKesson 的“Learning Modern 3D Graphics Programming”学习 3D 图形编程。

我没有真正看过其他指南,但本指南似乎强调了 3d 图形背后的理论和数学。现在,我被困在这个页面上:

http://www.arcsynthesis.org/gltut/Positioning/Tut04%20Perspective%20Projection.html

我不确定他所说的相机空间是什么意思,以及为什么有必要将 3d 世界投影到 2d 表面上。这个问题有点含糊,所以除了提供完整的解释外,还可以提供可能给我解释这些概念的不同方式的链接。

【问题讨论】:

  • 抱歉,我应该更清楚地说明这一点:我知道为什么有必要将 3d 世界投影到 2d 表面上。我只是不知道为什么相机空间对于这个目的是必要的或有用的。

标签: opengl graphics 3d


【解决方案1】:

嗯,有必要将 3D 世界投影到 2D 表面上,因为您的屏幕是 2D 表面。

3D 图形在不同的“坐标空间”中工作,并在它们之间进行转换以获得最终场景。

想象一下,例如对一座城市进行建模。您可以将地图的左下角定义为 (0, 0),将右上角定义为 (1000000, 1000000)。您也可以说,通常,一个点代表一英尺的真实空间。我们将这种表示称为世界空间。

要绘制您的城市,您需要导入一些建筑物模型,并将它们放置在世界中。所以你得到了你的建筑模型,但是当你制作这个模型时,你不想担心世界的大小或它会在哪里 - 你可能会说建筑物的左下角是在 (0, 0) 处,其右上角在 (1, 1) 处。我们将这种表示称为模型空间。然而,在世界上,建筑物可能位于 (104, 136) 并且您可能希望它为 1000x1000 像素,因此您需要将其转换为 (104, 136) 并将其放大 1000 倍。这是将其从模型空间转换为世界空间。

最后,Camera Space 是您在世界各地移动的方式。如果你想一想,在世界上四处走动可以被认为有两种方式(至少):你在世界上走来走去,或者世界在你周围走来走去。所以为了让移动更容易,我们会说相机总是在点 (0, 0) 面向下某个轴。现在,如果您想向前移动 10 个像素,则只需将所有内容向后移动 10 个像素。如果要旋转,请改为旋转世界。因此,要渲染建筑物,首先我们要将其从模型空间转换为世界空间。现在,要实际绘制它,我们想知道它相对于观察者的位置,因此我们将它从世界空间移动到相机空间。

。 . .

顺便说一句,如果您想很好地理解这一点,一个很好的练习是编写一个独立于 OpenGL 的 3D 线框渲染器。唯一可用的绘图函数是 DrawLine(x1, y1, x2, y2),它在屏幕上绘制一条从 (x1, y1) 到 (x2, y2) 的线。

【讨论】:

  • 那将是相当大的挑战。谢谢你的解释!
  • 这并不像你想象的那么难。我们使用变换的原因最终是为了在屏幕上进行最终投影并找出“这些点到底属于哪里”。基本上,编写线框渲染器仅意味着您自己进行所有矩阵乘法 - 平移、旋转和投影。 3D 图形真正困难的部分是着色和剪辑,但如果您正在编写线框渲染器,则不必担心这一点。它会让你真正欣赏和理解数学。
【解决方案2】:

为什么需要将 3d 世界投影到 2d 表面上

所有图形都只是 2D 图像。因此,3D 图形是一种为像素生成颜色的系统,它使您相信您正在观看的场景是 3D 世界而不是 2D 图像。将 3D 世界转换为该世界的 2D 图像的过程称为渲染。

投影,出于渲染的目的,是一种将世界从一个维度转换为另一个维度的方法。我们的目标图像是二维的,而我们的初始世界是三维的。因此,我们需要一种方法将这个 3D 世界转换为 2D 世界。

我不太清楚他所说的相机空间是什么意思

在此之前,顶点位置直接在剪辑空间中表示。回想一下,除以 W 是剪辑空间顶点位置的一部分。透视投影是一种将位置转换为剪辑空间的方法,使它们看起来像是 3D 世界的透视投影。

此转换过程具有明确定义的输出:剪辑空间位置。但它的输入值究竟是什么?

那是相机空间。

这不是 OpenGL 识别的空间(不像 GL 明确定义的剪辑空间);它纯粹是一个任意的用户构造。但是,根据我们对透视投影的了解来定义特定的相机空间会很有用。这样可以最大限度地减少相机空间和剪辑空间的透视形式之间的差异,并且可以简化我们的透视投影逻辑。

【讨论】:

  • 好的,谢谢。这个问题的所有回答都很好,但是这个回答确实解释了为什么我们需要定义一个相机空间。我不确定我是否完全正确地理解了这一点,但我想我很难理解他为什么使用相机空间,因为他还没有做任何事情来移动相机,所以我想知道他为什么还要打扰首先是这个。
【解决方案3】:

相机空间是相对于相机的坐标系。所以相机空间是几何在投影之前结束的地方。

通常从模型空间中的坐标开始。您知道模型与世界的关系,因此您可以从模型空间映射到世界空间。然后你在世界上有一个相机,你使用它的知识从世界空间映射到相机空间。如果没有相对于相机的空间变换,相机就无法移动。

投影是必要的,因为您的世界是 3d 的,而您的屏幕是 2d 的。您从 3d 世界投影到计算机显示器的 2d 表面。甚至立体视觉也只是两个投影而不是一个。

我没有立即发现比您已经提供的链接更好的链接。

【讨论】:

  • 您的解释很有帮助,谢谢。本指南直到几章后才介绍模型空间或移动相机,但您所说的似乎很直观。
  • 另外,如果我的理解正确,相机空间在任何二维平面投影之前?
  • 是的——相机空间是标准多边形渲染器流中投影前最后一次变换的结果。
【解决方案4】:

快速回答

为什么需要将 3d 世界投影到 2d 表面上

考虑使用 2D 介质(例如屏幕)来表示 3D 世界(您在程序中定义)。但是要做到这一点,需要相当多的复杂数学,所以这取决于你愿意去兔子洞的深处......

引用维基百科 (http://en.wikipedia.org/wiki/Graphics_pipeline):

对象从 3-D 世界空间坐标转换为 3-D 基于虚拟的位置和方向的坐标系 相机。这会产生原始的 3D 场景,如从 相机的视点,定义在所谓的眼睛空间或相机中 空间。归一化变换是 查看转换,以及来自任意用户指定的地图 坐标系 (u, v, w) 到规范坐标系 (x, y, z)。

【讨论】:

  • 我只是像本指南一样深入,而且似乎我要深入!
猜你喜欢
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2011-06-22
  • 2011-12-27
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多