Arnis:从地理坐标到方块世界的技术链路拆解
【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnis
Arnis 是一个将真实世界地理数据(OSM/Overture)转化为高细节 Minecraft 世界的开源项目。它的核心难点在于:地球坐标位于 WGS84 椭球面上,而游戏世界是平面整数网格,且经度间距随纬度变化,简单的线性映射必然产生几何失真。本文沿数据流依次拆解坐标转换层、元素处理流水线与世界编辑器三个关键环节。
核心矛盾:椭球面到平面方块的映射
非线性的距离映射
一度纬度约 111 公里是恒定的,但一度经度约等于 111 公里乘以当地纬度的余弦值,越往两极越窄。跨区域的边界框若按"比例缩放"处理,东西方向会被系统性低估。Arnis 的解法是双模式投影:保留旧的线性插值模式(测试中逐位断言其向后兼容),新增 Web Mercator 模式修正大尺度失真;两种模式都封装在Projectiontrait 之后,下游模块无需感知当前用的是哪一种。
三种世界格式,一套要素层
同一份城市数据要落到 Java Anvil、Bedrock.mcworld、Luanti 三种存储结构里。项目把格式差异收敛到世界编辑器一层,要素处理流水线只负责说"摆什么方块"。这个收敛决策是后文所有模块能独立演化的基础。
🗺️ 坐标转换模块——整条数据流的地基
输入:两套坐标系家族
src/coordinate_system/把类型拆成两族:地理坐标LLPoint/LLBBox(geographic/llpoint.rs、llbbox.rs)与笛卡尔坐标XZPoint/XZBBox(cartesian/xzpoint.rs、cartesian/xzbbox/,后者再细分出xzbbox_enum.rs的枚举与rectangle.rs的矩形实现)。GUI 里的区域选择用前者,方块摆放用后者,转换模块是两者之间唯一的换算关口。
处理:双模式投影分发
transformation.rs的CoordTransformer以ProjectionMode枚举区分两条路径。本地模式下,llbbox_to_xzbbox先用 Haversine 公式把边界框对角线换算成米,再乘缩放系数得到方块数;Web Mercator 模式下,with_projection先把边界框四角全部投影、取轴对齐包络,并以中心点为原点减去z_offset,使中心恰好落在 z=0。transform_point输出前做整数截断,与方块粒度天然对齐。
输出:xzbbox 与用户可感知的选区
转换结果是一个XZBBox,它定义了整片世界的"占地范围"——后续的建筑挤出、道路布线、高程采样都以它为界。在界面上,这对应 bbox 选择界面里拖框的操作:框一选定,系统就完成经纬度到游戏坐标的实时换算。
GUI 中的 bbox 选择与实时坐标转换
⚙️ 元素处理流水线与世界编辑器——从要素到区块
元素处理流水线
解析后的 OSM 数据由src/data_processing.rs按标签分发到src/element_processing/下的二十多个模块。buildings.rs用 extrusion(沿轮廓线挤出立体体块)算法生成建筑,因为 OSM relation 天然提供闭合轮廓与building:levels高度信息;water_areas.rs处理前先调用merge_way_segments把碎片 way 段拼成闭合环——该函数用布尔标记数组记录已合并的环,把簿记开销压到 O(1),避免配对搜索退化成三次方。道路判断则共享RoadMaskBitmap位图缓存。
世界编辑器
流水线产出后,方块只通过WorldEditor一个入口进入世界:src/world_editor/common.rs定义BlockStorage、RegionToModify等共享结构,java.rs、bedrock.rs、luanti.rs各自实现序列化,方块 ID 映射等差异全部收敛在这一层。连错误处理也收在这里——is_disk_full_error沿 IO 错误链下钻,区分"磁盘写满"与"路径错误",让 GUI 能给出精确提示。
主界面中的世界格式选择
🚀 工程细节与性能边界
- 分块与流式落盘:
data_processing.rs中should_stream_to_disk按"基础 500 MB + 每 region 约 26 MB"估算峰值内存,超过可用内存 55% 时自动把 region 逐块写盘,输出不变。 - 位图缓存:
floodfill_cache.rs的RoadMaskBitmap把"是否道路"的判断变成 O(1) 位读取,被要素摆放、洪水填充等多条路径复用。 - 确定性与进度:
deterministic_rng.rs保证重复运行的方块分布一致,可复现;progress.rs提供细粒度进度回调,驱动 GUI 进度条。 - 前置注册:signage 预先把全部贴花图写入
SignageContext,后续瓦片线程只经Arc共享只读访问,避免锁竞争。
批量生成后的城市景观
演进方向
投影扩展——为Projectiontrait 增加新实现(如极地投影),转换层与下游零改动;建筑形态分类——用机器学习模型区分复杂屋脊与特殊结构,补齐buildings.rs的规则化挤出;分布式生成——把XZBBox切分子框并行,复用现有 region 流式机制;高程源扩展——elevation/providers/已含 AWS Terrain、USGS 3DEP 等多个提供者,selector 机制便于继续扩充。从坐标框到最后一个区块落盘,这条链路证明:真实世界的数据可以被忠实、高效地映射进方块世界。
【免费下载链接】arnisGenerate any location from the real world in Minecraft with a high level of detail.项目地址: https://gitcode.com/GitHub_Trending/ar/arnis
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考