在前一篇文章中我们知道了顶点着色器和像素着色器的用途,在例子中也知道了如何在3D的坐标系中画一个2D的图像,即画一个三角形,这次我们需要知道如何在3D坐标系中呈现一个3D的图像,并且了解一下在3D空间中几个坐标系的认识。这些在游戏编程中都会使用到,因为每个3D物件都有自己的坐标系,至于如何转换这些坐标系我想可能我们需要在下一节中进行另一番讨论。学习是无止境的,贵在坚持,希望我也能够坚持我童年时的梦想,在不久的将来实现我的游戏梦。
3D空间认识:
在前面章节中,在屏幕上绘制的2D图像三角形是以屏幕对齐的,就像一个三角形直接贴在屏幕上面,但是那不是每一个都适用的。这样我们就需要一个3D空间坐标系来进行描述和进行显示,在真实的世界里,每一个物品都存在于3D空间中。这也就意味着,要想放置一个物品在一个特殊的位置,我们必须要使用一个坐标系并且定义3个描述特定位置的坐标。在计算机绘图中,三维坐标系一般使用的是笛卡儿坐标系,这个在数学中有见过吧。同时还分为左手坐标系或右手坐标系,左手坐标系就是Y轴指向上方,X轴指向右方,而Z轴指向前方;和左右坐标系相同的是右手坐标系Y和X轴指向相同,Z轴的方向正好相反,如下图所示。
下面我们来讨论一下在3D坐标系中,一个点在不同维数空间中不同的坐标。比如在一维中,如下图所示,P点在尺子5厘米的地方,当我们移动尺子时,P点的位置也就发生了变化,说不定在4厘米或3厘米的地方。虽然P点其实都没有移动过,但是它却有了新的坐标,也就是参照物不同罢了。
下面我们来看一下在三维下的情况,一个空间就需要定义一个原点和三条从原点出发的轴线:X,Y,Z。在计算机绘图中,他们包含了好几个空间下的定义:基元坐标系(Object Space)【模型几何坐标系】,世界坐标系(World Space),观察坐标系(View Space),投影坐标系(Projection Space),以及屏幕坐标系(Screen Space)。
基元坐标系:
这个坐标系也叫做几何模型坐标系,主要用于在使用3D建模时,所使用的坐标系。通常在创建模型时,建模人员都会将模型围绕原点进行建模,那样将有助于坐标变换,比如让模型旋转起来,在我们将坐标变换时将会进行描述。如下图,一个正方形正是定义在这样一个坐标系中,它的八个顶点将有如下坐标:(-1, 1, -1),(1,1,-1),(-1,-1,-1),(1,-1,-1),(-1,1,1),(1,1,1),(-1,-1,1),(1,-1,1) 。
因此模型几何坐标系是建模人员在设计和创建模型时定义的坐标系,在保持在磁盘里的模型当然也是存在于一个模型几何坐坐标系中。应用程序可以通过这样一个模型来建立一个顶点缓存对象,并且通过模型数据进行初始化这个缓存对象。因此一个顶点缓存对象通常都会在模型中建立,这也就说明顶点着色器将从几何坐标系中获得顶点数据信息。
世界坐标系:
世界坐标系是将每一个模型(基元物品)共享在一个场景中的坐标系,它通常用来描述我们期望呈现的各个模型之间的联系关系。为了虚拟一个世界空间坐标系,我们可以想象我们是站在西南的角落,并且面对着北方的一个房间里。我们把我们脚站在这个角落的地方定义为原点(0,0,0),X轴指向我们的右边,Y轴指向上方,Z轴指向前方【左手坐标系,这个也是Direct3D中使用的坐标系,听说OpenGL使用右手坐标系,不过我不懂的OpenGL】,面对的方向不变。这样确定下来后,房间里的所有东西物品都可以通过不同的坐标XYZ进行唯一定性。由此可见,之所以要使用世界坐标系,就是为了能够描述不同物品直接的联系。
观察坐标系:
观察坐标系,有时候我们也叫做摄影坐标系,这个有点像世界坐标系那样,只不过世界坐标系是用来描述整个场景,而观察坐标系的原点是在观察者的眼睛或摄像机。观察坐标系的Z轴就是眼睛看到的前方,Y轴就是相对于眼睛的上方,X轴位于右方,在下图就可以看到世界坐标系和观察坐标系。
在左边的场景中,在世界坐标系中有一个人,就像一个物件一样,并且有一个摄像机在观察他,红色原点和轴线表示世界坐标系。在右边的图片中,表示了观察坐标系和世界坐标系的关系,蓝色轴线表示观察坐标系。为了更清楚的理解他们,可以看出观察坐标系的方向和世界坐标系的方向是不同的,在世界坐标系中观察的方向是红色Z轴,而观察坐标系中方向是蓝色Z轴。
投影坐标系:
投影坐标系是通过观察坐标系转换而来,其实可以想象一下,就和我们拿着摄像机去拍照一样。在投影坐标系中,可见物件的X和Y坐标被描述在-1和1之间,而Z坐标被描述在0和1之间,在坐标转换时会详细讲解这里就不再多说了。
屏幕坐标系:
屏幕坐标系一般用来引用一个框架缓存(Frame Buffer)定位坐标列表,因为框架缓存通常是一个2D的纹理,因此屏幕坐标是一个2D坐标系。其实就是我们的显示器,左上角顶点定义为原点(0,0),X轴为横向,Y轴为纵向。在缓存中倍描述为w像素的宽度和h像素的高度,最小也就是最右下角的像素的坐标为(w-1, h-1)。
这样我们也就认识了Direct3D中几个重要的空间坐标系,也许我的描述不是特别的符合通常说法,不过我也只是在学习阶段,写博客也是为了能够更好的理解和学习Direct3D,有很多都是直接从例子文档中直接翻译过来的。如果有错误欢迎指正,这一节理论性比较重,其实大家有个大概的了解就可以了我想。