拒绝方块:网格地形如何平滑过渡?以《魔兽争霸3》为例

 

目录

摘要

前言

地块的背景

《魔兽争霸3》的实现方式

举一反三

 

 

 

 

摘要

 

       1. 《魔兽争霸3》的地图以Tile(地块)为基本单位。

       2. 在编辑地面时,笔刷必须落在网格的顶点上。这会同时影响周围的4个地块。

       3. 一个地块四个顶角的数值相加,就得到了这个地块的纹理编号。

 

 

 

 

前言

 

       挺长时间没谈《魔兽争霸3》的基础机制了。今天来聊聊:游戏中的地形是怎么实现自动平滑过渡的。

       P.S. 本来想发一篇每周转载,奈何用于参考的原文表述实在不够清晰,故另开一篇。

 

 

 

 

地块的背景

 

       《魔兽争霸3》是2000年代初的游戏。虽然功能强大游戏性好,但技术层面上还是比较有年代感滴。

       为了当时的电脑能跑得动,《魔兽争霸3》的地图被网格划分为了一个个小块,作为运算的基本单位,也叫地块

 

       可操控单位的运动轨迹是自由且连续的,【不会】受到地块的限制。但是有一部分机制完全建立在地块之上,比如以前发过的【视野生成原理】,和今天要说的【地形平滑过渡】。

 

 

       啥叫平滑过渡捏?一般情况下,基于地块造出的地形,都是一个方格一个方格的。如下图所示:

 

       在这种情况下,材质总是会【填满】一个方形地块,产生许多直角。虽然是一种游戏特色,但看起来感觉比较粗糙。其他游戏/地图编辑器如坦克大战,RPGMaker,都犯这个毛病。

 

 

 

 

《魔兽争霸3》的实现方式

 

       同样是使用地块系统,《魔兽争霸3》的地图编辑器把重心由地块转移到了地块顶点上。

       一般的地形编辑器是点击地块中央,系统就会用当前地形笔刷填涂整个地块。而在War3中,笔刷必须落在地块的顶点上。

       这里以草地笔刷为例。当你在一个顶点上点击时,会产生一小块草。而当几块草挨着的时候,它们就会自动连接起来。

 

       怎么实现的捏?具体而言,游戏里采用的是权重叠加方法。每当在一个顶点上点击时,实际上是对周围的四个地块的【各一个顶角】分别进行赋值1248

       只点了一个顶点的情况下,周围的四个格子的总权重也分别是1248。于是到下面的索引中取用1248对应的地块:

       就实现了点出了一块草的效果。

 

 

       每次对一个顶点进行点击,都会更新周围四个地块的权重,也会刷新它们的贴图。即使点击以后权重数值没有改变,贴图也可能会产生一些细微的变化,进一步增加地形地貌的多样性。

       (索引中015以上的块,都是在铺满后可能的选项)

 

 

       通过这种方式,材质的自动平滑过渡就实现了。

       更多计算举例:

 

 

 

 

举一反三

 

       只有两种状态:存在草不存在草

       对于简单的断崖式抬升一层地形,只有平地抬升两种状态,也可以采用完全相同的索引方式。

 

       但是游戏内的地形更加复杂。有平地,抬升一层,抬升两层,上半斜坡,下半斜坡,以及与之相反的向下版本。这时候就不能再求和,而要对地块的四角分别进行字母编号了;一个地块的状态也得用四个字母进行表示,索引表就要大得多。

       尽管规模增加,基本原理也还是一样的:在顶点上绘制,按地块信息取索引。

 

 

       最后,据说《魔兽争霸3》里战争迷雾的【外观效果】也是用的同一套索引,如下图所示。但是,俺目前还没找到更详细的资料。如果列位看官对此有所了解,欢迎在评论区补充。

 

 

 

本博客上,相关的原创博文:

《每周转载:【DotA树林阴影生成原理】最详细的视野机制解析》

真实伤害纯粹伤害的祖宗——扫盲War3/DotA中的 攻击-伤害 二段表述法》

 

评论