作者按:本文探讨了 Isometric Game 相关的背景知识。为了避免读者感觉枯燥(除了游戏之外的有些概念确实枯燥),作者尽量采取“用图说话”的方式,文字尽量简短,图解尽量简明。而且,文字风格也尽量避免单纯地说理分析,讲求一些故事性。目的只有一个,吸引你把这篇不长不短的文章读完。最后,本文还探讨了 Isometric Game 的译法,并给出了一些等轴测投影的应用示例。

1.神秘的 Isometric Game

Making Isometric Social Real-Time Games with HTML5, CSS3, and Javascript [注1]是专门讨论 Isometric Game 开发的一本小册子。很多人,特别是非专业人士看到 Isometric 这个词,一般都会有点丈二和尚摸不着头脑。实际上,尽管很多人曾经或正在沉迷于这种游戏,但你要问他什么是 Isometric Game?保证他脑袋摇得跟波浪鼓似的。

如果你告诉他,下面这些都是 Isometric Game,你猜他会有什么反应?

enter image description here

哈哈~我知道,他的反应跟你的反应一样……唉,看来我们得从“机械制图”谈起啦(因为我是在学《机械制图》这门课时才第一次接触 isometric 这个词儿;而这事儿我也是最近才知道的——毕竟,当时的课本只谈到“等轴测投影法”)。

2.机械制图

学过机械制图的同学,对等轴测投影(isometric projection)这个概念应该多少还有点印象。实际上,Isometric Game 中的 isometric,指的正是机械制图中,以等轴测投影法在投影平面上绘制三维物体平面图的一种测绘方法。

什么?你从来都没有听说过机械制图?……好吧,你听说过“天宫一号”吧,在电视直播里见过“神舟八号”与“天宫一号”对接的场景吗(参考下图)——别告诉我没见过,那可是上个月的事儿!

enter image description here

万一你看转播的时候没注意听呢,现在“重播”一个细节——中国载人航天工程女发言人武平表示:

对接装置中的几百个传感器、几千个齿轮和几万个组件,都是……由中国自主开发和制造的。

好的,我的问题是:如果让你负责设计其中一个齿轮,你怎么把自己的想法告诉负责制造的工程师?

没错,你得画出个模型图来。我不知道你会怎么画这个齿轮,但我们受过专业训练的人,当初都过一门《机械制图》课,画过很多设备和零件图。下面这段话能帮你理解学这门课有什么用,它摘自某《机械制图》课程的课本:

机械制图是用图样确切表示机械的结构形状、尺寸大小、工作原理和技术要求的学科。在现代工业中,无论是机器、仪器、化工设备,还是工程建筑物的设计、制造、研究和施工都离不开图样。设计者通过图样表达设计对象,制造者通过图样来了解设计要求和制造设计对象。

没错,机械制图其实是工程师们沟通设计思路必须掌握的一门最直观的“语言”。而“天宫一号”的设计师们无疑个个精通这门语言。

当然,本文无意讲解机械制图,只想告诉你一个基本的概念(唉,谁让我当初学《机械制图》时得了优呢!)。下面就是“天宫一号”对接装置中一个关键零件的图样(开个玩笑,实际上这是从“机械制图网”上摘来的):

enter image description here

图中上面有3幅图,分别是这个零件的俯视图、侧视图和正视图(视零件的复杂程度,有时候还要画仰视图和后视图——怎么样,专业吧?)。你一定在想:下面那两个零件示意图看起来更形象啊!没错,下面这段话(摘自“互动百科”)可以解释清楚这张图:

工程上一般采用正投影法绘制物体的投影图,即多面正投影图,它能完整、准确地反映物体的形状和大小,且质量性好,作图简单,但立体感不强,只有具备一定读图能力的人才看得懂。有时工程上还需采用一种立体感较强的图来表达物体,即轴测图。轴测图是用轴测投影的方法画出来的富有立体感的图形,他接近人们的视觉习惯,但不能确切地反映物体真实的形状和大小,并且作图较正投影复杂,因而在生产中它作为辅助图样,用来帮助人们读懂正投影视图。

真有意思呀,还想接着了解?没了。关于机械制图只能讲这么多了,篇幅有限,我们得加快进度。上面引用的这段话提到了一个“辅助图样”(英文是 pictorial),也就是你觉得“更形象”而实际上是更有“立体感”的那两幅图,它们与我们今天要讨论的 Isometric Game 可是有莫大的关系——都是(或基于)轴测图。

3.投影基础

如前所述,轴测图就是用轴测投影的方法画出来的有立体感的图。那什么是轴测投影呢?这个概念要从投影说起。噢,不行,得从光源说起——咳,不管是投影,还是光源,其实都是一码事儿,只是角度不同。就从投影说起吧。

为了把三维世界的物体呈现在二维平面上,有两种基本的投影方法:

  • 透视投影(perspective projection)
  • 平行投影(parallel projection) enter image description here

(此图摘自Projections and Viewing Transformations,推荐至少浏览一下其中的图。)

简单地说,前者假设光来自一个点,而后者假设光线是平行的。这就不用多说了,大家都知道。我们只关注平行投影。平行投影又可以简单地分成两种情况:

  • 正投影(orthographic projection)
  • 轴测投影(axonometric projection)

enter image description here

正投影,顾名思义,就是光线与物体表面以及投影平面垂直,而且物体的其中两个轴和某一个平面与投影平面平行。上一节中那个零件的俯视图、侧视图和正视图,就是用正投影法画出来的。

轴测投影稍微复杂一点,即投影时,物体要围绕它在3D空间中的一个或多个坐标轴,相对于投影平面旋转一定的角度。所谓“轴测”,意思就是“沿着轴来测量”,凡是与坐标轴平行的线段,都可以沿轴向进行作图和测量。

轴测投影下形成的物体影像,就好像从某个斜角观察物体一样,能让人在一个画面(投影平面)中看到物体的不止一个侧面。在轴测投影中,绘制出来的物体的轴或平面与投影平面并不是平行关系。刚才说了,上一节中那个零件图中的“辅助图样”就是按照轴测投影画出来的。

4.轴测投影

轴测投影可以分为以下三种基本的情况:

  • 等轴测投影(isometric projection);
  • 正二测投影(两等角投影,dimetirc projection);
  • 正三测投影(trimetric projection)。

等轴测投影,即按照透视法缩短的三个坐标轴的缩放系数是相等的,而且任意两个坐标轴之间的角度都是120度。

enter image description here

正二测投影(两等角投影),即物体坐标轴中有两个坐标轴与投影平面的角度相等(或坐标轴构成的三个角中有两个角相等)。

enter image description here

正三测投影,即物体坐标轴与投影平面的角度各不相同(或坐标轴构成的三个角的角度各不相等)。

enter image description here

好了,从机械制图到投影基础再到轴测投影,图文并茂、绘声绘色地介绍了这么半天,你明白了吗?——反正我明白了。(如果真没有看明白,也没有关系——因为这些背景知识都不是最重要的——最重要的是不能错过最后一个概念“Isometric Game”。)

5.Isometric Game

前面,我们简单介绍了把3D图像转换成2D图像必备的一些知识。无论你是否真正理解,现在我们真正要讨论的主角上场了——Isometric Game。

怎么样,心有灵犀了吧——不然前面给出那么多背景知识就白瞎了。没错,你猜着了。

Isometric Game,就是基于等轴测投影原理,把所有游戏界面元素沿坐标轴旋转一定角度制作并绘制到平面(屏幕)上,让玩家能够看到物体的多个侧面,从而产成3D效果的一种游戏。业内人士常常也把这种游戏称为“斜45度视角(或3/4视角)”、“2.5D”或“伪3D”游戏。

有读者可能会问:既然如此,为什么不干脆把 Isometric Game 翻译“等轴视图游戏”?这里还有点小纠结,请恕我在下一节再解释。我们暂时还只说 Isometric Game。

不管你是否真正玩过 Isometric Game,只要看一看本文第一幅插图,就很容易会发现这些游戏的画面都是由众多“菱形”的等轴测视图构成的:《城市农场》中的街区、《微城市》中的菜地、《QQ餐厅》中的地砖……当然,要说谷歌地图你肯定知道,因为基于Ajax的几乎所有网页地图都是由无数个地图切片(tile)这么无缝地拼接而成的。而在 Isometric Game 中,只不过游戏画面的切片都变成了菱形,而不是正方形。

没看出菱形来?……嗯,好吧,上图:

enter image description here

这幅图来自 Making Isometric Social Real-Time Games with HTML5, CSS3, and Javascript 中讨论的一个类似“经营城市”的游戏示例。上半部分是生成游戏界面所需的精灵图(sprite sheet),下半部分是游戏的界面(注意飘浮的白云)。

世界上第一款 Isometric Game

世嘉在1982年发布的《Zaxxon》是一款驾驶飞船攻击敌人的游戏。《Zaxxon》最大的特色就是第一次利用了轴测投影(axonometric projection)——就是后来所说的等轴测投影(isometric projection)。事实上,这款游戏的名字就借用了轴测投影的名字(AXONometric projection 中的 AXXON)。除了是世界上第一款使用等轴测视图的游戏,它也是世界上第一款显示阴影的游戏,还是第一次通过电视打广告的电子游戏。

enter image description here

怎么样,是菱形吧。提到菱形,你一定会想到英文里怎么称呼它呢——diamond?这个主意倒不错,可惜的是它在英文里有另一个奇怪的名字:Tile。我听见了,你在心里不由自主地问:介是为啥泥?

6.贴瓷砖

回答这个问题并不难。你在装修房子的时候见过贴瓷砖吗?事实上,tile这个词就是“瓷砖”的意思。

关于 Tile 的翻译 虽然 tile 这个词是“瓷砖”的意思,而且我也听到游戏业内的人这么叫它(比如@大城小胖),但根据国家科技名词委的解释,tile在地理信息系统中译为“块”。在游戏开发中,这个词我们一般翻译成“切片”、“图块”。

enter image description here

对,看样子瓷砖这个词还是挺贴切的。因为 Isometric Game 的界面,主要就是用这些“瓷砖”一块一块拼起来的———当然啦,拼的时候不用人工加胶水,只要通过代码循环(至少是一个嵌套循环)调用一个叫做draw()的方法(或者其他类似不管什么名字的方法),瞬间就能把所有景物、角色绘制到位。绘制的时候,每一块“瓷砖”都要精确到像素,贴到界面中不可见的一张大网格中。

说起来简单,实际上这个“贴瓷砖”的任务,可是任何 Isometric Game 游戏的核心所在。

想象一下,如果你在游戏中开着一辆保时捷,正准备利用前面的弯道,突然加速从内圈切过去,一举超过位居第一的选手。而正在你猛地加油时,游戏突然“卡”了1秒钟——界面突然停了一小下。就在这短短的1秒钟之后,你发现自己驾驶的赛车已经冲出弯道,在赛道外侧的草皮上打转儿呢……好好好,我理解,非常理解你此时此刻的心情,因为前面9圈的完美表现就在这1秒钟全都化为了泡影。我明白,可现实就是么残酷。不管事后你是摔手柄,还是砸键盘,或者扔鼠标——估计你舍不得扔掉新买的30英寸IPS面板的液晶显示器,但有一点可以肯定,游戏的性能在此时决定了你的“用户体验”。

假设游戏刷新频率每秒30帧,那就是大约每33毫秒就要重新贴一遍“瓷砖”,专业的叫法是“重绘”。每一次重绘,都要更新移动了的角色位置、旋转了的场景角度,更新玩家的生命值和金币数量。因为即使1秒钟内界面上没有任何变化,也要重绘30次,这就会带来性能上的损失(也是计算机资源的浪费)。为了提高游戏性能,开发人员已经想了很多办法,比如通过改进算法做到只重绘当前用户可见区域(屏幕大小),而不是重绘整个世界地图。对于一些屏幕上随时可能会有物体移动的动态性更强的视频游戏而言,这种做法无可厚非。但在一些实时策略游戏中,屏幕上的大多数物体一般都是静态的,因此这样做同样不够理想。

20世纪90年代,约翰•卡马克(John Carmack)在id Software公司开发过一款游戏叫《指挥官基恩》(Commander Keen),这是面向PC平台发布的第一款滚动卷轴游戏。当时,他也遇到了与上述类似的问题。为了解决这个问题,他发明了一种叫ATR(Adaptive Tile Refresh,切片适配更新)的技术,只重新绘制发生变化的区域。于是,游戏性能就得以大幅提升。ATR至今仍然是开发 Isometric Game 的关键技术。

好了,不瞎白话了,来点实战的。下面这张图是盛大研究院研究员李正林老师 @flashlizi 友情提供的 Tile 精灵图(鸣谢,而且这一节也是他提醒我补写上的):

enter image description here

这一组“热气腾腾”的 Tile 摆在眼前,你有什么感想?我都忍不住了,想偷偷地暗示你:你用尺子量一量前两块 Tile,会发现它的宽高比是2:1——哎呀,我怎么把这个秘密给公开啦!

7.秘密

既然都说了,干脆告诉你吧:Isometric Game 其实并不是真正的等轴测投影(isometric projection),而是正二测投影(dimetirc projection)。先看以下两段文字(摘自本文所讨论的书的第2章):

为什么大多数游戏开发人员都选择以2:1的比例来显示切片呢?这是由于光栅图形的一个独有的问题决定的,如果你懂得计算机显示器的工作原理,就可以理解这个问题。显示器,无论它是CRT、TFT/LCD、LED还是OLED的,都以类似我们游戏中的网格显示像素,能够非常完美地显示垂直和水平的线条。然而,如果想要显示一条角度介于0°和90°之间的线,麻烦就来了。下图展示了这个问题。

enter image description here

(图注:绘制某个角度(如30°)的直线会产生缺口)

虽然90°、45°和0°的直线都能呈现正规的图样,而且两条平行线能够“严丝合缝”,但30°的直线就不行——两条线中间有缺口。但是,如果我们使用2:1的宽高比,换算成角度就是1/2的反正切(arctan)等于26.5650°,能得到如下图所示的结果。

enter image description here

(图注:绘制角度为26.5650°的直线能得到整洁的结果)

简单地说,如果是等轴测投影——三个轴两两之间的夹角都为120°——的话,那么就要按照30°角来绘制菱形,可这样会导致像素线条出现缺口。而绘制角度为26.5650°的直线恰好没有瑕疵,但此时三个轴之间的角度分别为:116.565°、116.565°、126.87°。根据前面“轴测投影”一节中的介绍,两个角相等那就是正二测投影(两等角投影)了。

或许大家先入为主地认为正二测投影可以看成等轴投影的一个变体,或许是因为等轴测投影的应用最为广泛(本文最后还会给出另外一些等轴测投影的应用示例),游戏业内仍然把在2:1的菱形切片基础上构建的游戏称为 Isomentric Game。从下面这幅电视机的像素艺术图可以看出近似等轴视图与真正等轴视图的差别:

enter image description here

(前两段中的数据及图片来自维基百科。)

等轴投影与等轴绘图

实际上,把近似等轴投影说成等轴投影的情况还不止于此。等轴投影(isometric projection)与等轴绘图(isometric drawing)也是两个容易混淆的概念。对于真正的等轴投影,物体图样在每个轴上的长度是其实际长度的 0.816 倍。而等轴绘图则是根据等轴投影原理,按物体每个轴实际长度1:1比例绘制的图样。因此,对于同一个三维物体,等轴绘图结果是等轴投影结果的1.224倍。(参见这里。)

8.关于术语的讨论

知道了 Isometric Game 背后这么多的故事,接下来该聊一聊 Isometric 怎么翻译了(事实上,这才我写这篇文章的最终目的——悲剧呀)。

昨天晚上睡觉前,在厕所“释放一天的压力”,同时用 iPad 看最后几眼微博。发现游戏开发专家 @大城小胖 转发云帆软件创始人、六安论坛CTO @云帆Yvan 的平安夜问候“平安夜你们在干吗?”,小胖答曰:

晚上在想办法改良和优化很久以前写的isometric地图模块……

前面好像说过吧, Making Isometric Social Real-Time Games with HTML5, CSS3, and Javascript 是专门讨论 Isometric Game 开发的一本小册子,是我翻译的(那你怎么翻译 Isometric 的?别急,稍后我一定说)。看小胖正在优化isometric地图模块,于是就忍不住问了一句:

小胖,isometric 你觉得“等轴”、“等角”哪个贴切,或者还有别的叫法?

今天一早,看到小胖回复并@我说:

我看到的说法都是“等视距”

isometric我觉得叫“等视距”蛮贴切的,因为它是一种“虽然有立体感,但没有近大远小的透视效果” 的画面,等视距可以很好的描述这个特点

当时我想,也是那么回事儿。结果,就转发并评论:

的确是那样

这次转发引来图灵的一位译者 @ghawkgu 和 杭州电子科技大学一位同学 @06wj 加入了讨论。@ghawkgu 说:

我倒觉得不太贴切,“视距”有visual range的意思,比如“超视距空战”,而投影几何中的“等轴测”基本大家都能明白,就算不明白,字典也能查到。创造一个新名词反而容易产生歧义。另外,日语里面是叫“等角”的。

@06wj 似乎是从坐标轴的角度也跟小胖讨论了几个回合。

下面摘录小胖给上述两位的回复:

  • 等轴和等角的问题是在iso地图里,你很难向人解释清楚明明y轴是x轴的一半,为什么还要叫等轴?左右角和上下角明明不等,为什么叫等角?为了解释清楚,你必须费劲口舌拿出各种几何概念。//@ghawkgu:好吧,作为小众,我保留意见。

  • 另外 有时候“简单易懂”比“科学严谨”更重要。这也是为什么“斜45度视角”和2.5d这种极其错误的说法反而流传最广。建议@李松峰 老师不管怎么翻译,都要在括号里保留英文并注明“俗称的斜45度视角或2.5d”//@ghawkgu:作为小众,我保留意见。

  • 回复 @06wj:等视角也比等角好。因为如果不引入视这个字,很容易让人误解为是地图上的某些角相等,而不是地图的点到人眼睛(视点)的角度都相等,等距的问题也是如此,这也是我推崇等视距的原因。 //@06wj:等角地图的说法比较常见吧 //@大城小胖:等视距不是新词且已被大众接受

小胖的确很有实践力,他主要担心“等轴”、“等角”会引起人们误解。实际上,正如前面介绍过的,“等轴”指物体在三维空间中的坐标轴的缩放系数相等,而“等角”指三个坐标轴之间的夹角相等(120°)。

事实上,我在书里的翻译就是简单的“等轴游戏”,“等轴”来自“等轴测投影”。如果沿用这种思路,或许“等轴测游戏”更准确一些,不过更准确似乎还是“等轴测视图游戏”(或“等轴视图游戏”),而这作为术语又长了点。所以就选用了“等轴游戏”,因为简单、好说。

从早上起床到现在(21:55),除了吃饭和翻译了1000多字的书,就一直在查资料、做图、写作和重新组织这篇文章,差不多坐在电脑前12个小时了。尽管查阅资料和写作过程中,不时对照“等轴游戏”这种叫法,并没有觉得不好理解——特别在真正理解了等轴测投影之后,但还是要跟小胖及其他游戏方面的专家商榷,希望最终有一个更能被业界广为接受的方案

9.扩展

虽然 Isometric Game 到底该如何翻译的问题没有彻底解决,但这篇文章已经快结尾了。为兑现前面的承诺,最后本文再给出另外一些等轴测投影的应用示例,其实也是查阅资料的额外收获。

  • 明朝(15世纪)《三国演义》绘本中的插图(看地砖 :)) enter image description here

  • 1822年英国光学研磨机(Optical-grinding engine)模型(按30度等轴测投影绘制) enter image description here

  • 等轴测投影的局限性:图中红、蓝两个球,只看局部,看不出高低不一样来 enter image description here

  • 彭罗斯阶梯,在此阶梯上永远无法找到最高的一点或者最低的一点

enter image description here

还有,比如《清明上河图》等,看这篇文章 Axonometric projections。(正文完)

其他参考来源:


[注1] 本书是O'Reilly公司“Real Time”系列的一本小册子,将与另一本小册子 HTML5 Geolocation 合二为一,作为《深入HTML5应用开发(上)》出版。