如何把真实城市数据搬进 Minecraft:Arnis 的地理数据世界生成技术全梳理 如何把真实城市数据搬进 MinecraftArnis 的地理数据世界生成技术全梳理【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnis方块玩家最较真的事往往不是自己建的那座城而是没能 1:1 还原的家乡。Arnis 直接解决这个痛点它从 OpenStreetMap 抓取地理数据、叠加真实地形高程把一片现实区域按真实尺度生成成 Minecraft 城市——道路、建筑、河流连山脊的起伏都不放过。这篇文章钻进它的源码拆解地图是怎么一步步变成世界的。从圈选到出世界一次生成的完整旅程 ️Arnis 的交互遵循一个原则用户只需要做两个决定——生成哪和生成多大。先圈范围。GUI 里嵌了一张交互地图用矩形工具拖出一个框生成范围就定了命令行则等价地用--bbox参数格式是最小纬度,最小经度,最大纬度,最大经度甚至可以传入一个本地 .osm 文件让它自行推导范围。这个经纬度矩形在内部就是一个 LLBBox 对象后面一切转换的起点都从它开始。然后是配置方法。GUI 设置面板覆盖大部分关键开关世界尺度每米多少方块1.0 即真实大小、出生点、室内生成命令行里 --scale、--interior 一一对应。真正容易被忽略的是生成模式分三档geo-terrain默认建筑道路真实地形、geo-only平地铺建筑、terrain-only只出地形直接跳过 OSM 查询——最后一档对只想要山水骨架的人很友好。最后是生成与验证。点击开始生成后进度条贯穿取数、处理、写盘三个阶段跑完可在界面里直接看渲染出的地图预览图确认区域是否如预期。想自己编译运行下载 release 或克隆源码https://gitcode.com/GitHub_Trending/ar/arnis后 cargo 编译即可参数全在命令行里。界面只是皮。真正的复杂发生在这个经纬度矩形被交给引擎之后。把弯曲的地球压平两套投影并存世界生成的第一个难点不是算法而是坐标——现实地球是弧面的Minecraft 的地面却是一张平的 XZ 网格怎么铺过去不变形src/coordinate_system/里把几何原语拆成两族geographic 管经纬度点和包围盒cartesian 管游戏平面的点、向量、矩形。核心组件 CoordTransformer 支持两种模式Local 模式默认像用尺子把城市蓝图压平先用 Haversine 公式量出区域南北、东西两个方向的实际米数乘以尺度取整得到目标方块尺寸再把任意经纬度点线性映射成整数坐标每次生成都从 Minecraft 的 (0,0) 开始。Web Mercator 模式则复用网图同款投影把原点平移到区域中心z 方向加偏移经度方向再乘中纬度的余弦做校正避免越往东越窄的畸变——它的价值在于可以把多个区域拼进同一个世界侧向组装正好补上 Local 模式每次都从 (0,0) 起算的短板。两套模式并存而非替换Local 的结果还有测试保证与旧实现逐位一致属于典型的新能力不破老行为。坐标定死之后建筑只是等着被填充的轮廓——可地面的起伏从哪来高度来源不止一家带兜底的高程提供者链 ️地形的真实感由高程数据决定而全球最好的高度源分散在不同服务里USGS 3DEP 在美国精度最细AWS Terrain 覆盖广Mapterhorn 全球兜底月球和火星则只能靠 NASA PDS 的行星数据。单一来源注定顾不过来。于是src/elevation/抽象出一个 ElevationProvider 接口providers 子目录里每个数据源是独立实现selector 按来源模式做分级选择生成场景下 Auto 模式先试区域性高分源、失败再回落 Mapterhorn3D 预览只走全球源省得等。数据取回后要过一轮后处理——离群点过滤、NaN 填补、米到方块高度的仿射换算。内存细节同样务实高度网格存 f32 而非 f64城市级包围盒动辄上千万格f64 要约 80MBf32 直接减半后处理则留在 f64 里算保数值稳定。网格每边超过 16384 上限时不再死磕分辨率而是改用双线性插值填充拿非原生采样换不爆内存。高度是骨架下一个问题是几万个多边形怎么又快又不爆内存地涂上去。并行预计算 流式落盘大世界的速度与内存账 城市级世界里有海量多边形逐个取数、填充、绘制串行做时间成本扛不住。Arnis 的答案分两层。第一层是洪泛填充预计算。floodfill_cache.rs在元素处理主循环开始前就用并行任务把所有洪泛填充先跑完结果以 Arc 共享引用存放——处理器后面取结果时只是引用计数加一避免了为每片几十万个格子的森林、农田重复拷贝整份坐标列表。超过 2500 万格上限的巨型闭环则直接标记太大只描边不填充不至于把整个世界拖死。第二层是世界写盘。src/world_editor/里的 WorldEditor 把 Java 版Anvil、基岩版.mcworld、Luanti 三种输出格式统一在同一套方块存储层上格式差异隔离在各文件写入器里。写入过程中拼好的区域被交给 FlushWorker 后台线程池流式落盘、随即从内存逐出之后再落到已逐出区域的写操作直接丢弃。这样即使生成很大区域内存占用也保持平稳而不是随世界尺寸线性膨胀。看结果不只是 2D 贴图的城市效果最好用出图说话。这份真实感来自几处细节内置的assets/tree-packs/里收了近 2000 棵树木结构按非洲、欧亚、澳洲、北美、南美等区域拆成十个包外加 vanilla 混播包一张经纬度查找表自动为落点选包——生成慕尼黑就给欧洲树生成非洲稀树草原就给猴面包树assets/climate/还内置 0.1° 分辨率的柯本气候网格驱动干旱与极地地区的生物群系与地表。此外地标建筑慕尼黑奥运公园有四个大型 .schem 结构、OSM 路牌指示牌以及 Wikidata 等外部 3D 模型都挂在同一条生成流水线上。边界与演进空间说实话Arnis 是单向静态生成工具它完全依赖 OSM 与高程数据的质量——数据没覆盖的地方就没有建筑超大规模区域也有处理上限生成结果更没法反向编辑成现实地图。演进方向上浏览器端的 MapSmith 已经接住了不装软件、生成更大地图的需求而更多高程源与 3D 模型渠道预计会继续接入现有的提供者与流水线框架。想在 Minecraft 里重建家乡的人它目前仍是开箱即用选项里最完整的一个。【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考