目录
❡摘要
❡前言
❡地块的背景
❡《魔兽争霸3》的实现方式
❡举一反三
❡摘要
1. 《魔兽争霸3》的地图以Tile(地块)为基本单位。
2. 在编辑地面时,笔刷必须落在网格的顶点上。这会同时影响周围的4个地块。
3. 一个地块四个顶角的数值相加,就得到了这个地块的纹理编号。
❡前言
挺长时间没谈《魔兽争霸3》的基础机制了。今天来聊聊:游戏中的地形是怎么实现“自动平滑过渡”的。
P.S. 本来想发一篇每周转载,奈何用于参考的原文表述实在不够清晰,故另开一篇。
❡地块的背景
《魔兽争霸3》是2000年代初的游戏。虽然功能强大游戏性好,但技术层面上还是比较有年代感滴。
为了当时的电脑能跑得动,《魔兽争霸3》的地图被网格划分为了一个个小块,作为运算的基本单位,也叫“地块”。
可操控单位的运动轨迹是自由且连续的,【不会】受到地块的限制。但是有一部分机制完全建立在地块之上,比如以前发过的【视野生成原理】,和今天要说的【地形平滑过渡】。
啥叫“平滑过渡”捏?一般情况下,基于“地块”造出的地形,都是一个方格一个方格的。如下图所示:
在这种情况下,材质总是会【填满】一个方形地块,产生许多直角。虽然是一种游戏特色,但看起来感觉比较粗糙。其他游戏/地图编辑器如坦克大战,RPGMaker,都犯这个毛病。
❡《魔兽争霸3》的实现方式
同样是使用地块系统,《魔兽争霸3》的地图编辑器把重心由“地块”转移到了“地块顶点”上。
一般的地形编辑器是点击地块中央,系统就会用当前地形笔刷填涂整个地块。而在War3中,笔刷必须落在地块的顶点上。
这里以草地笔刷为例。当你在一个顶点上点击时,会产生一小块草。而当几块草挨着的时候,它们就会自动连接起来。
怎么实现的捏?具体而言,游戏里采用的是“权重叠加”方法。每当在一个顶点上点击时,实际上是对周围的四个地块的【各一个顶角】分别进行赋值1,2,4,8。
只点了一个顶点的情况下,周围的四个格子的总权重也分别是1,2,4,8。于是到下面的索引中取用1,2,4,8对应的地块:
就实现了“点出了一块草”的效果。
每次对一个顶点进行点击,都会更新周围四个地块的权重,也会刷新它们的贴图。即使点击以后权重数值没有改变,贴图也可能会产生一些细微的变化,进一步增加地形地貌的多样性。
(索引中0和15以上的块,都是在铺满后可能的选项)
通过这种方式,材质的自动平滑过渡就实现了。
更多计算举例:
❡举一反三
“草”只有两种状态:“存在草”和“不存在草”。
对于简单的“断崖式抬升一层地形”,只有“平地”和“抬升”两种状态,也可以采用完全相同的索引方式。
但是游戏内的地形更加复杂。有平地,抬升一层,抬升两层,上半斜坡,下半斜坡,以及与之相反的向下版本。这时候就不能再求和,而要对地块的四角分别进行字母编号了;一个地块的状态也得用四个字母进行表示,索引表就要大得多。
尽管规模增加,基本原理也还是一样的:在顶点上绘制,按地块信息取索引。
最后,据说《魔兽争霸3》里战争迷雾的【外观效果】也是用的同一套索引,如下图所示。但是,俺目前还没找到更详细的资料。如果列位看官对此有所了解,欢迎在评论区补充。
本博客上,相关的原创博文:
《每周转载:【DotA树林阴影生成原理】最详细的视野机制解析》
《“真实伤害”和“纯粹伤害”的祖宗——扫盲War3/DotA中的 攻击-伤害 二段表述法》
评论
发表评论