ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Arnis 如何把真实地图变成 Minecraft 城市:数据流水线完整指南

Arnis 如何把真实地图变成 Minecraft 城市:数据流水线完整指南 Arnis 如何把真实地图变成 Minecraft 城市数据流水线完整指南【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnisArnis 是一款把真实地理数据生成 Minecraft 世界的开源工具它拉取 OpenStreetMap 矢量数据与真实高程数据产出可玩的 Java 版1.17、基岩版或 Luanti 世界文件。本文不按目录罗列代码而是沿选区 → 取数 → 转坐标 → 生成地形 → 落盘的完整数据旅程走一遍并挑出三处性能与兼容性背后的取舍讲清楚。 全景链路从边界框到世界文件Arnis 的完整流程可以看成一条单向数据流水线用户选定的区域作为经纬度边界框进入随后被拆成地图要素与地形高程两路输入汇合为方块数据后交给对应版本的写入器落盘。圈定区域GUI 里用矩形工具画框或命令行传--bbox四角经纬度获取数据src/retrieve_data.rs 向 Overpass 查询 OSM 数据请求头携带独立的 User-Agent 标明构建号坐标转换经纬度包围盒 LLBBox 换算为游戏内 XZ 包围盒 XZBBoxsrc/coordinate_system/高程数据从 AWS Terrain、USGS 3DEP 等数据源拉取地形瓦片src/elevation/providers/要素转换src/element_processing/ 用 28 个独立模块把建筑、道路、水体、树木转成方块版本落盘src/world_editor/ 按目标版本写文件Java 用 fastanvil 写区块基岩走 bedrock-rsLuanti 写 map.sqlite边界框与坐标转换经纬度如何变成方块坐标边界框如何划定坐标范围输入是--bbox的四角经纬度或 GUI 里画出的矩形。src/coordinate_system/transformation.rs 用它构造一个 CoordTransformer先算出边界框在纬度、经度两个方向上的地面距离再乘以--scale每米对应多少方块默认 1.0得到游戏里的 X、Z 跨度产出一个本地笛卡尔包围盒 XZBBox。输出是转换器 目标包围盒一对对象此后每个地理点都可以通过统一接口换成游戏内方块坐标下游模块不需要再关心投影细节。何时切换 Web Mercator 投影--projection默认 local每次生成都从 Minecraft 的 (0,0) 出发用线性插值映射单个城市够用。若多次生成并希望坐标对齐到同一全局坐标系就切到 web_mercator 模式——它先投影边界框四角再取轴对齐包络并用参考纬度补偿经线收敛src/projection/。代价是坐标不再是纯本地映射多区域拼接时比 local 模式多一层换算开销。高程数据与地形生成地面如何被抬起来高程数据源如何被选用输入是边界框输出是每个位置的高度图。src/elevation/providers/ 下并排放着 aws_terrain、usgs_3dep、mapterhorn、regional、planetary、fixed_tile 六种数据源各自对应不同精度与覆盖范围上层有缓存机制避免重复下载--ground-level默认 -62则决定世界地面基准线落在哪一层。terrain-only 模式省掉了什么--mode分三档默认 geo-terrain 同时生成 OSM 要素与真实地形geo-only 把要素放在平地上terrain-only 只做地形。源码注释写明terrain-only 会整体跳过 OSM 查询与 Overture 建筑抓取--overture开关随之失效。验证流程上这很实用先跑地形确认高程再跑完整模式看要素出问题时容易定位是哪一段的锅。要素转换28 个模块如何变成一座城市建筑与道路如何变成方块输入是经 src/osm_parser.rs 解析出的节点、way 与 relation输出是可写入世界的方块序列。src/element_processing/ 按要素拆成 28 个模块buildings.rs 负责楼体挤出与屋顶highways.rs 按道路等级算中心线与宽度water_areas.rs 与 waterways.rs 处理水面。若 OSM 缺建筑轮廓可开--overture从 Overture Maps 补卫星识别的建筑底面但 src/args.rs 的注释也承认卫星检测偶尔会引入误报这是覆盖率换来的。为什么随机性必须可复现大区域是分区流式处理的一座跨区的楼可能被处理两次每个区各写一遍。若墙面颜色、屋顶样式靠临时抽签两次写入会互相矛盾。src/deterministic_rng.rs 的解法是把随机数发生器用 OSM 要素 ID 做种子ChaCha8Rng同一要素无论被处理多少次得到的随机结果都一样同一要素需要多路独立随机时再加盐区分。值得注意的设计取舍跨版本兼容换来的维护成本。src/world_editor/ 里 java.rs、bedrock.rs、luanti.rs 三个写入器并存基岩版靠 src/bedrock_block_map.rs 把 Java 方块 ID 翻译成基岩 IDLuanti 的方块名表 src/luanti_block_map.rs 则派生自第三方项目 MC2MTLGPLREADME 中单独注明授权。好处是同一座城三个平台都能玩代价是每个版本新增方块都要人工补映射。吞吐与系统占用的平衡。src/main.rs 把全局分配器换成 mimalloc注释写明是针对瓦片并发处理的高频小块分配做的优化Rayon 线程池限制在 CPU 的 90%configure_rayon_thread_pool(0.9)那行就是证据——故意留一成算力换取生成期间 GUI 与终端不卡死。可复现性的隐性约束。用要素 ID 做随机种子看似一行代码实际约束的是整条流水线墙面、屋顶、花草等所有随机表现都必须走同一套带种子的 RNG任何一处裸随机数都会破坏分区流式写入的一致性。️ 动手验证最小四步上手获取程序下载官方 release或git clone https://gitcode.com/GitHub_Trending/ar/arnis后自行编译圈一个小区域选自家街区量级的边界框首次运行 bbox 越小数据下载越快生成第一个世界cargo run --release --no-default-features -- \ --output-dir/path/to/.minecraft/saves/hometown \ --bboxmin_lat,min_lng,max_lat,max_lng \ --mode geo-terrain打开世界对照真实地图检查建筑轮廓与路网连通性再跑一次--mode terrain-only单独核对高程是否贴近实地。展望顺着这条流水线往下看有几件事值得关注Overture 的卫星建筑底面说明数据源可以不限于 OSM--body已支持月亮与火星意味着地球地理只是这条管线的一个特例确定性随机数加分区流式写入为多区域拼接与更大地块生成铺好了路。当地图数据 → 世界文件的工具链被越来越多的项目复用它要复制的对象大概率会从一座城市扩大到一个行星表面。【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表