ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

把家乡变成 Minecraft 世界:Arnis 现实城市生成工具实用指南

把家乡变成 Minecraft 世界:Arnis 现实城市生成工具实用指南 把家乡变成 Minecraft 世界Arnis 现实城市生成工具实用指南【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnisArnis 是一款开源工具用真实的 OpenStreetMap 地理数据和海拔数据把家乡、大城市甚至自然景观复刻到 Minecraft Java 版、基岩版和 LuantiMinetest里。本文追踪一份地理数据从经纬度到方块的完整旅程讲清它内部怎么运作、哪些设计让1:1 还原现实成为可能。先认识 Arnis一份地理数据的旅行一句话定位Arnis 把现实世界扫描成一个可以走进去的体素城市。整个过程像寄一封跨次元的快递输入你在地图上圈一个矩形范围比如你的小区、一座老城Arnis 向 OpenStreetMap 服务器要这个范围里的地图数据——哪些是建筑轮廓、哪些是道路、哪些是水域同时下载真实海拔数据。翻译坐标地球是球面用经纬度描述Minecraft 世界是扁平网格用 x/z 整数格子描述。这一步把每个经纬度点换算成游戏坐标误差越小建筑落点越准。逐个要素加工建筑轮廓被挤成有墙有窗的方块楼体道路按等级生成不同宽度的路面水域填成深浅不同的水体树木从内置的树种库里挑合适的栽上。写入世界所有方块按 Minecraft 的存档格式Java 版的 Anvil 区块结构、基岩版的 .mcworld 包或 Luanti 世界逐格落盘。输出生成完直接把文件夹丢进.minecraft/saves开游戏就能看到 1:1 比例的家乡。下图就是 Arnis 生成的城市预览密集的建筑群、绿地和路网都来自真实地图数据。核心链路拆解从地球一角到数字网格坐标换算coordinate_system 下分成两套坐标类地理坐标llpoint经度纬度的点和笛卡尔坐标xzpoint游戏里的 x/z 平面点。经纬度之间算距离要用球面三角而游戏里的计算只需要简单的加减乘除所以必须先把前者展平到后者。Arnis 走的是 Web Mercator 投影也就是主流网络地图用的那种投影因为它的网格切割方向和 OSM 瓦片一致后续按瓦片取数据时可以直接对齐。这套换算还支撑着一个实用功能边界框工具。界面上拖出的矩形实时换算成min_lat,min_lng,max_lat,max_lng四个数——这正是命令行模式需要的参数。界面上的所见即所得本质上就是这一层坐标换算在做双向翻译。取数一次圈选三类数据r数据获取模块负责所有网络请求。这里有个容易忽视的取舍三种生成模式取的数据量差异极大。geo-terrain默认OSM 要素 真实海拔生成带地形的完整城市geo-only只取 OSM地面是平的适合城市地形不重要的场景terrain-only只取海拔完全不碰 OSM连公开服务器都不打扰。海拔数据按瓦片分块下载并缓存到本地因为同一区域反复生成或调整参数重跑时重新拉一遍海拔纯属浪费。取 OSM 数据时程序还会带上带版本号的 User-Agent 标识自己这是对公开服务的礼貌——大批量取数时让服务器管理员知道流量来自哪个版本、哪个用户。从地图标签到方块要素加工流水线OSM 数据本身只是标签一条建筑轮廓线带height24一条路带highwayresidential。真正的工作是把标签变成方块布局这块逻辑集中在 element_processing按要素类型拆成独立文件buildings.rs 管楼房、highways.rs 管道路、water_areas.rs 管水域还有桥梁、树木、历史建筑等二十多个子处理器。几个关键手法建筑把二维轮廓沿高度方向挤出成楼体extrusion类似剪纸插起来再根据屋顶标签决定平顶还是坡顶墙面贴窗、贴门避免一整面灰墙的塑料感道路按 highway 等级映射到不同宽度和路面材质主干道自然比小巷宽区域填充像建筑占住哪几格这类判断由 floodfill洪泛填充从边界点出发逐格扩散标记内部完成配合位图缓存避免重复计算——因为一个城市的建筑可能上万栋每栋都重新做区域判断会慢到不可接受。插件化的拆分带来实际好处想加新要素类型比如新的公共设施只需要新写一个处理器并注册不用动建筑或道路的逻辑。落盘一套逻辑写三种存档格式Minecraft Java 版存成 Anvil 格式的 region 文件基岩版打成单个 .mcworld 压缩包Luanti 又是第三种结构。如果三种格式各写一套生成逻辑任何一处修改都要改三遍。所以 world_editor 用 common.rs 定义统一的世界待修改数据结构——上层只管在 (x, y, z) 放一个方块由 java.rs、bedrock.rs、luanti.rs 分别负责把它编码进各自的区块格式。值得细看的设计决策确定性随机数保证分块计算不穿帮。生成大区域时世界按区块分块并行处理一栋跨区块边界的楼可能在不同区块里各被处理一次。如果随机数靠全局状态比如墙的颜色、树的品种同一栋楼两个区块里会抽到不同结果拼起来就是半边红墙半边蓝墙。deterministic_rng.rs 的解法很干净用 OSM 元素 ID 本身做随机种子同一个元素无论被处理几遍、在哪个线程处理抽到的随机值都相同。代价是几乎没有——一次哈希换来了并行分块下的结果一致性这对流式/分块架构是必要条件而非优化项。基岩版方块映射表抹平两个版本的分歧。Java 版和基岩版对同一方块的命名、ID、数据值并不完全一致比如玻璃、石砖的变体。bedrock_block_map.rs 维护了一张Java 方块 → 基岩方块的映射表让同一份生成逻辑在两个版本里产出视觉一致的世界。没有这张表要么为基岩版重写生成逻辑要么玩家打开世界看到一片缺失材质。内存与并行的工程取舍。大城市生成时同时活跃的方块数据量轻松达到数 GB主程序用 mimalloc 替代系统分配器注释里写明了原因并行分块处理产生大量小对象分配mimalloc 在这种高并发小块负载下表现更好线程池则限制在 90% CPU 占用留出余量保证系统流畅。这类选择用户感知不到但直接决定了普通硬件能不能跑动一座城市。上手与延展图形界面下载 release 包运行用矩形工具在地图上圈选区域选目标世界格式点 Start Generation 即可。可调参数包括世界缩放比例1:1 或放大、出生点位置、是否生成建筑内部房间等。命令行适合自动化和服务器场景核心就两个参数——输出目录和范围框。cargo run --release -- --output-dir~/.minecraft/saves/worldname --bboxmin_lat,min_lng,max_lat,max_lng想只要地形加--mode terrain-only要平地面加--mode geo-only加--bedrock则输出基岩版世界。能往哪走代码库里已经能看到延伸方向的痕迹——models_3d/与wikidata_3d_models.json表明项目正在用 Wikidata 数据把现实地标比如雕像、纪念碑以精细 3D 模型的形式摆进世界而不是只给个简化方块体assets/tree-packs/下按大洲组织的数千棵树种模型说明植被还原也在走真实物种 → 体素模型的路线。对贡献者来说最自然的切入点也是这两处给某类要素补一个处理器或者往树库里添模型。作者已用同一套核心逻辑推出了浏览器端生成服务无需安装、支持更大地图这也印证了取数—加工—落盘严格分层后换一套运行载体不需要重做核心管线。【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表