我正在尝试通过Jason L. McKesson的“学习现代3D图形编程”来学习3D图形编程。
我还没有真正看过其他指南,但本指南似乎强调了3D图形背后的理论和数学。现在,我被困在这个页面上:
http://www.arcsynthesis.org/gltut/Positioning/Tut04%20Perspective%20Projection.html
我不完全确定相机空间的含义,以及为什么有必要将3d世界投影到2d表面上。这个问题有点模糊,所以不是完整的解释,也可能会给我一个解释这些概念的不同方式的链接。
答案 0 :(得分:8)
嗯,由于您的屏幕是2D表面,因此有必要将3D世界投影到2D表面上。
3D图形在不同的“坐标空间”中工作,并在它们之间进行转换以获得最终场景。
想象一下,例如对城市进行建模。您可以将地图的左下角定义为(0,0),将右上角定义为(1000000,1000000)。您可能还会说,通常情况下,一个点将代表一小块真实空间。这个表示我们称之为世界空间。
要绘制您的城市,您需要导入一些建筑模型,并将它们放置在世界中。因此,您可以获得建筑物的模型,但是当您制作此模型时,您不必担心世界的大小或它的位置 - 您可能会说建筑物的左下角是at(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)。
答案 1 :(得分:5)
为什么有必要将3d世界投影到2d表面
所有图形都只是2D图像。因此,3D图形是一种为像素生成颜色的系统,可以让您确信您所看到的场景是3D世界而不是2D图像。将3D世界转换为该世界的2D图像的过程称为呈现。
投影,出于渲染的目的,是一种将世界从一个维度转换为另一个维度的方法。我们的目标图像是二维的,我们的初始世界是三维的。因此,我们需要一种方法将这个3D世界转换为2D世界。
我不确定他的相机空间是什么意思
在此之前,顶点位置直接在剪辑空间中表示。回想一下,W分频是剪辑空间顶点位置的一部分。透视投影是一种将位置转换为剪辑空间的方式,使得它们看起来像是3D世界的透视投影。
此转换过程具有明确定义的输出:剪辑空间位置。但它的输入值究竟是什么?
那是相机空间。
这不是OpenGL识别的空间(与GL明确定义的剪辑空间不同);它纯粹是一个任意的用户构造。但是,根据我们对透视投影的了解来定义特定的相机空间会很有用。这最大限度地减少了相机空间和剪辑空间的透视形式之间的差异,并且它可以简化我们的透视投影逻辑。
答案 2 :(得分:4)
相机空间是相对于相机的坐标系。因此,相机空间是几何形状在投影之前立即结束的地方。
通常,您从模型空间中的坐标开始。您知道模型与世界的关系,因此您可以从模型空间映射到世界空间。然后,您可以在世界上使用相机,并使用它的知识从世界空间映射到相机空间。如果没有相对于相机的空间变换,则相机无法移动。
投影是必要的,因为你的世界是3d,你的屏幕是2d。您从3d世界投影到计算机显示器的2d表面。甚至立体视觉也只是两个预测,而不是一个。
我没有立即知道任何链接比您已提供的链接更好。
答案 3 :(得分:4)
快速回答
为什么有必要将3d世界投影到2d表面
考虑使用2D介质(例如屏幕)表示3D世界(在程序中定义)。然而要做到这一点,需要相当多的复杂数学,所以这取决于你愿意去的兔洞深处......
引用维基百科(http://en.wikipedia.org/wiki/Graphics_pipeline):
物体从三维世界空间坐标转换为三维空间 基于虚拟的位置和方向的坐标系 相机。这导致从原始3D场景看到 相机的视角,定义在所谓的眼睛空间或相机中 空间。归一化变换是数学逆 查看转换,以及来自任意用户指定的映射 坐标系(u,v,w)到规范坐标系(x,y, Z)。