由于你的屏幕是二维的,因此必须将三维世界投影到二维表面上。
3D图形在不同的“坐标空间”中工作,并且这些空间之间进行转换以得到最终场景。
例如,想象一下建模一个城市。您可以将地图的左下角定义为(0,0),将右上角定义为(1000000,1000000)。您可能还会说,规则是一个点代表真实空间的一英尺。我们将这种表示称为世界空间。
要绘制城市,您需要导入一些建筑模型并将其放置在世界中。因此,您获得了建筑物的模型,但在制作此模型时,您不希望担心世界的大小或位置-您可能会说,建筑物的左下角位于(0,0),其右上角位于(1,1)。我们将这种表示称为模型空间。但是,在世界中,建筑物可能被放置在(104,136)处,并且您可能希望它的大小为1000x1000像素,因此您需要将其从模型空间转换为世界空间,即将其平移至(104,136),并将其缩放1000倍。
最后,相机空间是您在世界中移动的方式。如果您考虑一下,可以将在世界中移动视为两种方式(至少):您在世界中移动,或者世界在您周围移动。因此,为了使移动变得容易,我们将说相机始终位于点(0,0),面向某个轴线。现在,如果您想向前移动10个像素,您只需将所有内容向后移动10个像素。如果要旋转,则旋转整个世界。因此,要呈现建筑物,首先我们要将其从模型空间转换为世界空间。现在,要实际绘制它,我们需要知道它相对于观察者的位置,因此我们将其从世界空间移动到相机空间。
另外,如果您想非常好地理解这一点,一个很好的练习是编写一个3D线框渲染器,与OpenGL分开。您唯一可用的绘图函数是DrawLine(x1,y1,x2,y2),它在屏幕上从(x1,y1)到(x2,y2)绘制一条线。