new*_*mer 5 opengl 3d graphics
我正在尝试通过Jason L. McKesson的"学习现代3D图形编程"来学习3D图形编程.
我还没有真正看过其他指南,但本指南似乎强调了3D图形背后的理论和数学.现在,我被困在这个页面上:
http://www.arcsynthesis.org/gltut/Positioning/Tut04%20Perspective%20Projection.html
我不确定他的相机空间意味着什么,以及为什么有必要将3D世界投射到2d表面上.这个问题有点模糊,所以不是一个完整的解释,也可能会给我提供一种解释这些概念的不同方式的链接.
嗯,由于您的屏幕是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)绘制一条线.
相机空间是相对于相机的坐标系。所以相机空间是几何体在投影之前结束的地方。
通常,您从模型空间中的坐标开始。您知道模型与世界的关系,因此可以从模型空间映射到世界空间。然后你在世界上就有了一个相机,你可以使用它的知识从世界空间映射到相机空间。如果没有相对于相机的空间变换,相机就无法移动。
投影是必要的,因为你的世界是 3d,而你的屏幕是 2d。您将 3D 世界投影到计算机显示器的 2D 表面上。即使是立体视觉也只是两个投影而不是一个。
我没有立即意识到任何链接比您已经提供的链接更好。
为什么有必要将3d世界投射到二维表面上
所有图形都只是2D图像.因此,3D图形是一种为像素生成颜色的系统,可以让您确信您所看到的场景是3D世界而不是2D图像.将3D世界转换为该世界的2D图像的过程称为渲染.
一个投影,用于渲染的目的,是从一个维度转换一个世界到另一个世界的方式.我们的目标图像是二维的,我们的初始世界是三维的.因此,我们需要一种将3D世界转换为2D世界的方法.
我不确定他的相机空间是什么意思
在此之前,顶点位置直接在剪辑空间中表示.回想一下,W分频是剪辑空间顶点位置的一部分.透视投影是一种将位置转换为剪辑空间的方式,使得它们看起来像是3D世界的透视投影.
此转换过程具有明确定义的输出:剪辑空间位置.但它的输入值究竟是什么?
那是相机空间.
这不是OpenGL识别的空间(与GL明确定义的剪辑空间不同); 它纯粹是一个任意的用户构造.但是,根据我们对透视投影的了解来定义特定的相机空间会很有用.这最小化了相机空间和剪辑空间的透视形式之间的差异,并且它可以简化我们的透视投影逻辑.
| 归档时间: |
|
| 查看次数: |
7141 次 |
| 最近记录: |