span8
span4
Mojang Minecraft是第一个真正的游戏格式添加到FME。与大多数其他格式和标准不同,《我的世界》吸引的是更广泛、更年轻的观众。
将真实数据带到《我的世界》中,便能将一款积木游戏转变成一款简单但引人入胜的建模工具,让每个人都能尝试各种自然或城市场景。如果海平面上升或下降100米怎么办?森林火灾蔓延的速度有多快,后果如何?如果一座沉睡的火山突然喷发会发生什么?摩艾石像如何融入我们家乡的城市景观?这些问题很容易(而且是以一种有趣的方式)在《我的世界》中得到回答。
FME是将任何类型的真实数据带入《我的世界》的优秀工具。在《我的世界》中,矢量层、栅格、点云和3D模型可以根据需要的大小和位置进行转换、调整和对齐。
对于FME来说,《我的世界》是一个规则间隔的点云,所以转换任务本质上是将所有必要的资源组合成这样的云。下面我们将通过几个例子展示制作Minecraft世界的不同技术。
在世界诞生之初,有一件重要的事情需要考虑,那就是它的理想规模。我们可能想要缩小源地图,以使世界不太大。否则,穿越这样一个世界所花的时间可能与在现实中所花的时间一样多。关于海拔,我们受到《我的世界》允许的范围的限制,从海拔1到海拔256。考虑到《我的世界》的海平面高度是63,我们通常想要攀登所有东西,甚至是最高的山脉,以适应63到256的范围。当然,对于水深图和地下结构(如果我们只是想这么做的话),我们可以降到63以下,但不能降到0以下。
《我的世界》是用积木建造的。游戏中有数百种方块类型,代表各种石头和矿石、水、树和树叶、花、地毯、熔岩、玻璃等等。在内部,这些块由两个组件标识:blockID和blockData。
下面是展示Minecraft方块的表格。块上面的数字表示blockID组件,块旁边较小的索引表示块数据组件。例如,“Grass”有blockID = 2,没有blockData组件。“桦木木板”有blockID = 5,和blockData = 2。
每个块都有自己的属性。当选择一个块时,我们必须查明是否有任何由块的性质强加的额外要求。
例如,像花或树苗这样的植被块只能在它们下面的某些块上存活,比如“草”或“土”。在FME中,我们可以简单地复制所有的植被块的点,将它们提升1个块,并将其所在位置的blockID设置为“Grass”。
轨道块需要知道它们的邻居轨道的位置,否则它们“不会知道”如何定位自己。这可以通过blockData组件设置,需要使用FME进行一些额外的分析。
在某些情况下,积木的真实性质并不重要,主要的角色是它们的颜色或外观。例如,我们可能想要用传统的颜色创建一个物理的3D世界地图——海洋从黑暗到淡蓝色,大陆从绿色到黄色,从棕色到白色:
Minecraft Wiki (http://minecraft.gamepedia.com/minecraft\u维基)有一篇关于每个区块的单独文章。最新版本的blockID表可以在这里找到:
http://minecraft.gamepedia.com/Blocks
在FME中,有几种设置blockID和blockData的方法。如果我们已经有了一个点云,那么PointCloudComponentAdder或PointCloudExpressionEvaluator转换器可以直接设置这些组件(参见下面的复活节岛示例)。我们可以使用AttributeCreator转换器在向量特征上创建blockID和blockData属性。然后,当使用PointCloudCombiner将向量转换为点云时,我们应该指定这些属性作为组件保留在转换器参数的下一节中:
对于光栅特性,我们必须使用光栅选择器选择必要的波段,使用光栅bandnamesetter设置blockID和blockData作为波段名称,使用光栅bandselector取消选择所有波段。然后,当我们将栅格合并到点云时,这些波段将成为点云组件:
有关更多细节,请参见Bowen岛示例。
《我的世界》作者在FME 2015.0中使用16个街区宽,16个街区长,256个街区高的整块来写世界。这意味着,如果在我们世界的边缘我们没有一个完整的块,我们以一个洞一直到世界的底部结束。避免这种情况的一种可能的技术是添加几个块来完成这些块。
块体沿X方向的坐标为:
.........................
-32年到-17年
-16比1
0 - 15
16 - 31日
.........................
块沿Y方向的坐标为:
.........................
-31年到-16年
-15 - 0
1到16
17 - 32
.........................
我们可以缓冲整个世界,提取坐标,四舍五入为16,并在世界各地做一个边界框如下:
当我们这样做时,我们应该在Navigator窗格的writer上关闭“中心点云在0,0处”选项。
然后我们会将盒子设置为我们想要的Minecraft blockID,并将其作为所有其他功能写入世界。
下面是一个简单的例子。让我们用一些数据来代表今年的FME主题:复活节岛的栅格DEM,以及带有两个Moai雕像的OBJ文件。
复活节岛的面积约为25×15公里,最高海拔500米以上。这意味着我们需要把这个岛变小,使其大小合理。为此,我们将原始的坐标系统从DEM栅格中移除,其中每个像素都超过27米,并将其像素坐标作为自己的CS。最简单的方法是用RasterPropertyExtractor找到光栅中的行数,然后在光栅georeferizer中使用这个数字:
我们还用RasterExpressionEvaluator将海拔范围缩小了10倍,这样最高的山可以达到50米。可下载的示例包括修改后的光栅,因此不需要这些步骤,但是了解这些步骤很有用。
一旦DEM被FME读取,我们使用栅格extentscoercer从DEM中提取出向量海岸线并进行概括——我们将需要这个特征来确定雕塑的方向。DEM栅格本身用栅格表现评估器提升63,以设置适当的Minecraft海平面。
3D模型只包含两个雕像,但是我们想把它们放置在岛的周围几次。为此,我们创建了一个CSV文件,其中包含我们希望查看状态的位置的XY坐标。将模型引入FME后,我们将其添加到共享项库中(在FME 2015中添加了SharedItemAdder转换器),然后使用该模型使用FeatureReader转换器启动CSV读取。一旦雕像的位置被带入FME,我们使用DEM将它们覆盖到表面。这将向位置添加第三个坐标(Z)。然后我们使用NeighborFinder来找到每个位置点最近的海岸线。这些点与这段海岸线成角度。之后,我们用模型替换这些点(SharedItemIDSetter,也是2015年FME的新功能)并旋转它们。
现在我们已经准备好了DEM栅格,并且在岛的周围放置了雕像,我们可以使用两个独立的点云组合器将它们转换成点云。对于每个点云,我们设置了blockID,在某些情况下,还设置了blockData组件:
对于“高草”(blockID = 31, blockData = 1),我们不要忘记将这些块提高1,并在下面添加“Podzol”块(blockID = 3, blockData = 2)。
拯救世界的最后一步是将所有的点云合并成一个点云。保存为Minecraft世界的结果如下:
请注意,第一次打开一个世界可能需要一段时间,所以请耐心等待。《我的世界》应该通过所有的方块并添加一些额外的信息。
下载示例。
只下载世界。
令人惊讶的是,“正常”(即。不定期间隔)点云不那么好直接写到我的世界。如果点云的密度不够高,无法达到所选的分辨率,作者将会在表面产生一个洞,一直通向世界的底部,我们肯定不希望Steve从这些洞里掉下去。
创建平滑连续表面的一个可能的解决方案是点状云的栅格化(以及其他必要的特性——参见Bowen岛的例子),并再次将它们转换成点状云。下面的示例是使用挪威地图管理局demo web服务(http://kartverket.no/en/Kart/Gratis-Kart data/Open-and-Free-geospatial-data-from-Norway/挪威/).
由于源点云包含地面类和植被类(分别为第2类和第5类),我们可以对其进行分割,分别对每个部分进行处理。
地面点将作为栅格发生器的源。我们还将使用它们来创建岛的向量轮廓(pointcloudcoer ->HullReplacer)。这样就可以将生成的栅格裁剪成岛的形状,这样剩下的栅格就可以填满水了。
对于植被点云,我们执行类似的操作来获得代表森林的向量区域。在森林覆盖了岛屿之后,我们得到了开阔的地方,我们将在那里种花。
在这个阶段,我们准备将所有内容转换为点云和设置组件(分别是PointCloudCombiner、PointCloudExpressionEvaluator或PointCloudComponentSetter)。我们还需要添加从森林区域生成的点云的海拔。为此,我们对由DEM生成的点云和由森林多边形生成的点云的X和Y坐标进行四舍,并使用pointcloudmerge(2015年FME中新增的)将Z组件转移到森林点。
同样,处理植被时更重要的一步是添加一个支持所有植物下植被的块类型。这些类型是“Grass”(blockID = 2)、“Dirt”(blockID = 3, blockData = 0或1)和“Podzol”(blockID = 3, blockData = 2)。在我们的工作流亚搏在线中,我们用草块覆盖了所有的岛屿表面,因此我们只需使用PointCloudExpressionEvaluator (@Component(z)+1)将所有的树和花提升一个块。
在这个工作流程中亚搏在线,我们使用一种自然的方式来种植树木:我们种植不同种类的树苗(blockID = 6) (blockData是在0到5之间随机生成的),然后它们慢慢长成不同大小和形状的成树。
我们还需要随机地使森林点云变薄,因为我们不想在每个街区都种一棵树——那样会形成一个密不透风的森林。不幸的是,FME 2015在PointCloudExpressionEvaluator中没有随机数生成器。相反,我们使用一个表达式,它在计算0到9之间的数字时产生一个或多或少的随机结果。树将种植在表达式结果等于1的块上:
@floor (@sin ((@ component (x)) * @ component (y) / 1000 -@floor (@sin (@ component (x)) * @ component (y) / 1000)) * 10) = = 1
类似的表达式用于生成树和花类型。
当我们第一次打开世界的时候,场景是这样的:
在《我的世界》一天(约20分钟)后,情况发生了变化:
正如我们所看到的,在《我的世界》的24小时内,许多树都生长了。仔细观察也会发现各种各样的动物,以及其他不总是友好的生物。
下载示例。
只下载世界。
当今世界的大量矢量数据表明,它将成为制作《我的世界》世界最受欢迎的数据源之一。在本例中,我们将使用多个矢量图层和一个光栅DEM。
伯恩岛是温哥华附近一个美丽的小岛。对于这个岛,我们有一个cded格式的栅格形式的高程数据、水文和道路的esri图形文件以及mapinfo选项卡中的森林多边形。
在本例中,我们将在转到最终点云之前光栅化所有矢量层。fme是一个完美的工具,用于操纵光栅并将其转换为点云。这就是光栅化方法在许多情况下非常有用的原因。
其工作原理如下:进入pointcloudcombiner的光栅的每个像素都变成一个点。波段0用于设置每个点的高程;色带(如果存在)将成为颜色组件;所有其他波段也都变成了组件;如果波段有名称,它们将用作组件名称。因此,例如,如果波段1被称为blockid,波段2被称为blockdata,它们将分别成为blockid和blockdata组件。
在光栅化之前,我们对矢量数据执行一些操作。我们缓冲所有的线性特征:住宅和集水区道路,以及溪流。然后我们使用所有的缓冲区来剪切岛,这样数据集中就没有重叠的多边形了。这些步骤保证了当我们创建一个单点云时,所有功能都能获得足够的空间,而不会为同一个位置而“战斗”。
在这个工作区中,我们通过一个名为MinecraftStyler的自定义转换器分配blockID和blockData属性。它列出了minecraft中可用的所有块类型,并使选择正确的块更加容易。它还允许添加一个垂直偏移,这可能需要一些块,如植被,我们已经知道。
另一个自定义转换器负责光栅化传入的特征并生成点云。三维forcer和numericrasters为blockid、blockdata和vertical offset创建单独的光栅。正如你所看到的,我们并不局限于最终将被MiCrFrand作家使用的乐队-我们可以有许多中间辅助乐队,因为我们需要。光栅ExpressionEvaluators允许将所有光栅合并为一个图像,其中带0为Z保留,带1为blockID,带2为blockData,带3为垂直偏移。在图像中,我们指定波段名称并将所有内容转换为点云。pointcloudonrastercomponentsetter允许将z值从dem传输到点。
以下是翻译结果:
相比之下,google earth中相同区域的外观如下:
下载示例。
只下载世界。
Minecraft可以作为一个非常简单和交互式的BIM数据查看器。我们可以很容易地将ifc或revit模型转换为minecraft世界,然后在建筑物内和周围散步,爬上楼梯,从窗户向外看,然后展开翅膀,飞向天空。
下载示例。
只下载世界。
我们已经知道需要一些额外处理才能正常工作的块,例如。植被块需要在下面放置某种类型的块。有些街区需要知道如何连接到与之相邻的类似街区,例如楼梯、栅栏、铁轨和许多其他街区。
在本例中,我们将尝试将温哥华Skytrain(轻轨系统)数据从ESRI形状文件转换为Minecraft。如果我们简单地搭上天车线路,把它们变成铁路街区,他们谁也不会知道如何与邻居连接,所有的铁路都会从北向南走,即使这条线路是从东向西走的。这是由于在布雷艇上放置“正常”积木,积木“熟悉”周围环境,并能就其适当位置作出有教育意义的决定,与同时书写所有积木之间的差异造成的。
的方向轨道块用blockdata组件编码如下:
值说明0连接南北的直轨。1连接东西的直轨。2向东倾斜的轨。3向西倾斜的轨。4向北倾斜的轨。5向南倾斜的轨。6向南和向东弯曲的轨。7向南和向东弯曲的轨西8连接北面和西面的曲线轨道。9连接北面和东面的曲线轨道
为了找到如何正确定位每个轨道块,我们采取以下步骤。首先,我们用四舍五入的锯齿状外观线替换漂亮的平滑特征,将锯齿状切分为单个点,并从每个点构建正方形。然后,利用空间相关器,分析每个方块的邻居在何处-我们检查北境和南部以及East和欧美地区边上的邻居的存在。基于此,并使用复杂的条件,我们创建一个属性:
最后,我们用点替换正方形,这可以变成最终的点云。下图显示了在转换过程中原始行的更改方式:
在斜坡上放置铁轨也可以用类似的方法,尽管需要更多的分析。
在FME中很难处理铁路交叉口。一旦世界被创造出来,手动检查和纠正它们是有意义的。见我的世界wiki更多细节。
输出是一个有一些铁路的世界,这些铁路旅行很有趣:
下载示例。
只下载世界。
这个简单的工作空间创造了一个有两个相同迷宫的世界。这是一个游戏内的游戏-在多人模式下,参与者可以尝试击败对方找到最快的方式从入口到出口。
一个简短的Python代码将迷宫作为文本生成,通过几个变形金刚,文本就变成了Minecraft世界的玻璃墙。让赛车手进入世界,然后-准备好,出发!
下载示例。
只下载世界。
fme不仅允许编写minecraft世界,还允许阅读它们。一旦读取,世界就变成了一个简单的点云,有通常的xyz坐标和两个组件——blockid和blockdata。在fme中,我们可以用许多不同的方式操纵世界。
例如,我们可以将两个或多个世界合并在一起,或者向世界添加一个新功能—例如,将您最喜爱的卡通英雄的草图模型放置在镇中心。我们可以用一些其他的块来代替现有的块,把铁变成金,一块TNT变成南瓜。
在我们的kartverket示例中,我们用玻璃块填充了表面下的空间。这意味着如果我们深入地表,我们将看到山的内部。例如,我们可以利用玻璃的透明度制作一个完美的隧道,然后用石头代替它。
在雷射艇世界中,这些块的规则性使得变化检测变得容易。使用新生成的kartverket世界和老一天的同一个世界,我们可以看到在24小时内添加了什么。FME 2015有一个PointCloudMerger Transformer,它可以接受两个点云,一个请求者和供应商,通过任意数量的坐标和/或其他组件进行匹配,并通过“合并”端口输出请求者匹配,通过“未合并”端口输出不匹配,对于供应商,我们有“引用”和“未引用”端口。下图显示了两个时间点之间差异的FME数据检查器可视化:
©2019安全亚搏在线软件公司法律