前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Wolfram语言玩转&我的世界&(Minecraft)

用Wolfram语言玩转&我的世界&(Minecraft)

作者头像
WolframChina
发布2018-10-08 09:51:12
1.7K0
发布2018-10-08 09:51:12
举报
文章被收录于专栏:WOLFRAMWOLFRAM

不久前,我分享了一个软件包,用于从安装在 Raspberry Pi或另一台计算机上的 Mathematica 控制 Pi 版的 Minecraft。 您可以使用多种语言控制 Minecraft API,但Wolfram语言非常胜任这一任务,因为它丰富多彩多范式的语言风格使得学习编码非常容易,并且因为它的高水平数据和计算功能可让您快速获得令人振奋的结果。

今天,我想分享四个有趣的 Minecraft 项目创意,以及实现它们的简单代码。并由这项目出发,探讨更多的想法。

如果您尚未安装 MinecraftLink 软件包,请按照此处的说明进行操作(http://blog.wolfram.com/2018/07/05/programming-minecraft-on-the-raspberry-pi/)。

Minecraft 中的图片渲染

Minecraft(我的世界)由不同颜色和纹理的方块组成。 如果我们适当地排列这些方块,就可以使用颜色来创建颗粒感的图片。 我想做的是自动将图片转换为Minecraft 方块。

第一步是在 Raspberry Pi 上创建 Minecraft 中的新世界,然后加载MinecraftLink 包:

如果你使用的 Mathematica 没有安装在Pi上,而是在另一台不同的计算机上(就像我一样),需要使用 IP 地址或 Raspberry Pi 的名称将两者连接在一起(你的地址将与我的不同,如此处所示)。 如果你是在 Pi 上运行代码,则可以跳过此步骤:

MinecraftLink 软件包将自动从 Wolfram Data Repository 安装 MinecraftBlock 实体数据。

其中一些实体包括可以分析的图像,以找出方块的平均颜色。 首先,我需要选择所有具有可用图像的实体。 但是我发现,由于各种原因我们需要删除其中一些方块:有些是因为方块的透明度不行,看起来像玻璃和蜘蛛网一样,有些是出于 Minecraft 的游戏物理特性要求。 像沙子一样的软块从图片上飘落,火只存在于某些方块的顶部,水遍布整个图片,所以这些都从列表中删除。

以下是我们有的图片:

大多数方块(受光照影响)在所有面上都是相同的,但是少数方块的侧面具有与顶面不同的纹理。 我打算从侧面看所有的方块,所以我想弄清楚方块的平均侧面颜色是什么。 为此,我为金色方块侧面像素的位置创建了以下蒙版(Mask):

因为所有图像都具有相同的形状和视点,我可以将该蒙版应用于每个方块以挑选它们的正面像素:

为了确保我做的是对等比较,删除透明层(AlphaChannel)并将它们全部放入相同的颜色空间。 然后只要求平均像素值并将其转换回平均颜色(采用HSB颜色会给出感知更为正确的颜色平均值):

现在可以看一下我们的可用调色板:

可以从可见颜色空间中的这些颜色图中看到,我们对高饱和度颜色的覆盖率相当差,并且绿色/青色边框周围有一些间隙,但这是我们必须对付的。

现在我们需要一个函数来选出颜色最接近的方块名称。 Wolfram语言知道感知颜色距离,可以用 Nearest 函数直接处理:

例如,与纯红色最接近的方块是 wool orange:

现在我们需要一个函数,它接受一个图片,降低其分辨率,使其更"方块化",并只使用我们可用的颜色简化图像:

然后我们将它应用于一个众所周知的图片:

现在我们只需要计算该图像的像素,找到与像素最接近的颜色的方块名称,并将其放置在 Minecraft 世界中的相应位置:

找到一个宽敞的开放空间......

并对一个简单的图像运行该程序:

可以使用 Import 将图像导入系统,但Wolfram语言的Entity(实体)系统部分提供有许多已知图像。 例如,您可以获取著名的艺术作品:

以下是 《美国哥特式》(格兰特伍德的姐姐)的细节:

甚至可以以极低的帧速率,通过将网络摄像头中的帧传输到墙上来制作室外电影院。 这是正在写这篇博文的我!

一个有趣的挑战是逆转这一过程,生成一个 Minecraft 世界的地图。 您需要在Minecraft 世界中的每个位置扫描表面方块类型,并使用创建的色图为输出图的单个像素着色。

在 Minecraft 中重建真实世界

这个项目听起来很难,但是由于Wolfram语言中的内置数据,它实际上非常简单。

假设我想在 Minecraft 中创建英国。 我需要做的就是在与英国陆地高度相对应的高度上放置一个方块网格。 我们可以使用 GeoElevationData 从Wolfram语言中获取数据:

您将看到数据包含水下值,因此我们需要以不同方式处理这些数据,以使形状可识别。 此外,我们不需要尽可能高的分辨率(GeoElevationData可以在某些地方达到几米的分辨率)。 我们更需要像这样的东西:

现在让我们把它变成方块。 假设我将选择输出的最小和最大高度。 对于任何给定的位置,我需要创建一列方块。 如果高度为正,则应该是不高于高度的实心方块和上面的空气。 如果高度是负的,那么直到该点它是固体的,再往上是水值,直到达到给定的海平面值,然后是空气。

现在我们只需要为高程数据中的每个位置创建一列。

全部工作就是转换数字。 反转和移调是为了使坐标与罗盘正确对齐, QuantityMagnitude 去除单位,剩下的是垂直缩放:

在我们开始之前,可以使用以下代码清除一片大而平坦的区域以便工作,并将摄像机置于动作上方的空中:

现在可以放置地图了:

可以看到,苏格兰山区的地势更高。 通过相机在通常的位置可以看得更清楚,但海岸线变得难以辨识。

另外,从峰顶看,这里是珠穆朗玛峰北脊的景色:

更好的版本可以根据高度切换不同材料,为您提供积雪的山脉或平坦的沙滩。 这项工作留待读者来补充。

在 Minecraft 中渲染CT扫描

如果您不幸需要进行核磁共振或CT扫描,那么最终可能会得到3D图像数据,例如此内置范例所示:

这可能看起来很复杂,但它实际上比我们之前做的照片渲染器更简单,因为颜色在CT世界中没有多大意义。 我们最简单的方法就是降低扫描分辨率,并将其转换为空气或方块。

我们可以轻松找到所有实体素的坐标,可以使用这些坐标在我们的世界中放置方块:

我们可以将所有这些包装成一个函数,并在 Minecraft 世界中添加初始位置。 我添加了一个小暂停,因为如果是从台式机运行这段代码,Minecraft 服务器接受的请求会多于它的处理能力,Minecraft 会丢弃一些方块:

这是函数作用于头部的效果:

关于3D图像,要理解的一件事是,在图像"内部"的每一层都有信息,所以如果改变二值化的阈值,我们可以选出更密集的骨骼材料并制作一个头骨:

一个有趣的扩展是建立三个密度水平,并使用玻璃方块类型在头骨上放置透明的皮肤。 我把这一任务留给你。 你可以在网上找到 DICOM 图像,用 Import 导入到Wolfram语言,但要注意有些文件可能会很大。

自动建造金字塔

最后一个项目是关于创造新的游戏行为。 我的想法是创建一个触发自动形为的特殊方块组合。 具体来说,当你在辉石方块顶部放置一个黄金方块时,将自动为你建造一个大金字塔。

第一步是扫描特定点周围的表面方块以获得黄金,并返回找到的表面黄金方块的位置列表:

接下来,我们查看我们找到的每个黄金方块,看看它们下面是否有辉石方块:

现在我们需要一个执行结果操作的函数。 它发布一则消息,删除两个特殊方块并设置金字塔:

我们现在可以将所有这些组合成一个函数,扫描当前播放器并在第一个匹配位置上执行指定操作。PreemptProtect 有点微妙。 因为我要将此作为后台任务运行,所以我需要确保我不会同时执行两个操作,因为往返于 Minecraft 服务器的消息可能会产生混乱:

剩下的就是每五秒钟重复运行一次代码:

我把方块这样放置……

...在特殊一列的一个块区上走,等待几秒钟,直到发生这种情况......

要停止这一任务,可以运行……

在Wolfram语言中编写 Minecraft代码的简短系列就到这啦。 还可以将很多有趣的知识领域和计算领域注入到 Minecraft中。我曾经想过使用阅读表面方块并使用Wolfram语言的数据可视化构建世界的3D迷你地图,也想过使用微分方程求解器创建轨道行星的太阳系。我还考虑使用3D元胞自动机或分形创建地形生成器。但我确实还有更要紧的工作要做,所以就把这些留给更多人去尝试吧。 期待你在Wolfram社区发布自己的项目想法或代码

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WOLFRAM 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在 Minecraft 中重建真实世界
  • 在 Minecraft 中渲染CT扫描
  • 自动建造金字塔
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档