游戏中到底是Z轴朝上还是Y轴朝上?

游戏中到底是Z轴朝上还是Y轴朝上?

本文转自我的公众号——游戏开发那些事


在谈到游戏世界中的坐标轴时,我们经常会看到这样的争论。

“游戏中Y轴是向上的好么?这你都不知道?”
“不对,空间直角坐标系不就是Z轴向上的么?”
“拜托,请搞清楚坐标系再来讨论好么?”.....

对于长期接触Z轴向上的空间直角坐标系的我也存在着同样的困惑,左右手坐标系已经够让人头大了,为什么连哪个轴向上都不能统一一下?而后当我试图通过搜索引擎寻找答案时,发现这个问题确实有不少人在讨论,也终于搞清楚了其中的缘由。


故事可能要从著名的三维建模软件3DS Max说起。3DS Max是公司AutoDesk第一款建模软件,它于1990年发布,主要用于设计和建筑领域。

在建筑学中,通常要先从平面图开始设计,所以先在2D网格上绘制X轴和Y轴,随后在将其拉伸成3D模型。很自然的,他们将下一个轴设置向上,即在3DMAX里面向上的便是Z轴(Z-Up)。这种思路与我们在学校时第一次从平面几何踏入空间几何的想法完全契合。

而在1998年,另一款著名的建模软件——Maya诞生了。Maya一开始主要作为动画软件系统发行,广泛用于动画电影当中。

与建筑领域相似,当时的动画通常也是2D的,即正面看Y轴向上,X轴向右。不过早期的迪士尼和其他动画作品为了能在不改变2D画面效果的条件下增加维度(例如2D平台游戏),保留了X轴和Y轴的朝向,新增的Z轴便成为了深度。当然,这里也有一定程度的历史原因——由于Maya一开始为SGI的(硅谷图形公司Silicon Graphics, Inc.)硬件开发,SGI早期提供的渲染引擎就是Y轴向上的,所以Maya就跟随SGI的标准制定坐标系(Y-Up)。

其实,造成这种差异的根本原因在于你是在屏幕空间中思考还是在世界空间中进行思考。

在屏幕空间中,给定X和Y的屏幕坐标,将Z作为深度可以方便的处理遮挡问题(即Y-Up)。许多渲染技术(DX、OpenGL)都使用“ Z缓冲区”之类的名称的来处理屏幕空间渲染(三维空间的渲染最后还是会输出到屏幕空间)。很明显,在二维环境中,Y轴向上的坐标系更有意义一些。


然而在世界空间中,我们通常希望像现实一样构建三维的世界。正常的三维空间示意图都将第三个坐标视为垂直方向的(即Z-Up)。要在世界空间中定义一个矩形,则要给出其长、宽、高。如果将Y视为垂直方向,那么就会陷入了一种不符合常识的情况,与我们多年来接触的笛卡尔坐标系相悖。


当你仔细调查一下目前流行的软件时,你会发现不同的软件其坐标系默认都是不一样的。除了前面提到的两款三维建模软件,另外两款著名的游戏引擎Unity与Unreal也有着不同的坐标系。受到历史因素的影响,Unreal诞生时3DS Max是当时大多数开发人员选择的建模工具包(Maya还没有诞生),所以采用了Z轴向上的左手系坐标。而Unity3D在2000以后才正式发布,采用的则是Y轴朝上左手坐标系。


由于标准的不同,导致我们在使用不同游戏引擎以及不同建模软件交互时需要手动处理坐标系的转换。而对于那些只接触过部分软件的人往往会保留“Z轴向上”或者“Y轴的向上”的固有印象,从而造成了前面提到的争论现象。无论哪种坐标系,都有其一定的道理,我们理解其中的缘由并能灵活的运用即可。


最后,再帮大家复习一下左手坐标系和右手坐标系(挥动双手的同时不妨点个赞支持一下)。


发布于 2020-12-20 22:31