虚拟的3D世界,是我们在计算机上构建的,其中对这个世界的处理和运算,需要用到CPU和GPU,两者通常是通力合作的。不过由于GPU是并行的,CPU是串行的,所以尽量是放在GPU端比较快了。微软也在vista中对驱动的架构进行了变革,以期CPU与GPU之间的交流尽可能的少而快。
真实世界用经纬度来定位,同样在这个虚拟的三维世界中,我们采用了立体几何中的三维坐标系(x,y,z)来描述物体的位置,大小。
一个问题凸显出来了,“现实世界中的长度单位,比如米,厘米等是怎么在三维虚拟世界中对应的呢?”答案是:没有对应,全部取决与物体之间的比例关系。
其实道理很简单,单位是为了在现实生活中度量用的,你知道1米等于100厘米,这表明在你心目中有了一个1:100的比例关系了。在很多时候,你并不知道1厘米的精确长度。而只要整个世界是出于一个合理的比例中,你就不会觉得自己一觉醒来,到了火星。
在计算机的虚拟的三维世界中,我们的坐标值,是没有单位的。如果你想绘制一个长的扁担和一个宽的板凳,那么你只需要保证在坐标系下,板凳宽,扁担长就可以了。
假如我们要绘制一个三维的太阳系。太阳系中行星绕着太阳转,所以我们在绘制时,可以考虑以太阳为中心建立坐标系。而月亮又围绕着地球转,我们又可以考虑以地球为中心,建立一个地月坐标系。
在三维虚拟世界中,通常我们把太阳坐标系叫做世界坐标,把地月坐标系叫做局部坐标。
在绘制时,只要通过简单的坐标转换就可以把地月坐标中的物体的坐标值转换到太阳坐标系中。
那为什么要有此一个转换呢?因为地月构成了一个独立的小系统,小世界。以地球为坐标原点那么月球的位置运算起来就简单很多,也就是CPU或GPU的运算速度快很多。如果太阳系中有n多个地月系统呢?那性能的提升可就是很可观的啦。
在 D3D 中,世界坐标系是左手定则的(见 SDK 文档), Z 轴指向屏幕内,正和 OpenGL 相反。当然你也可以通过 API 把 D3D 改成和 OpenGL 一样的坐标定义。