news 2026/9/9 16:11:18

Arnis:从地理坐标到方块世界的技术链路拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Arnis:从地理坐标到方块世界的技术链路拆解

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/LLBBoxgeographic/llpoint.rsllbbox.rs)与笛卡尔坐标XZPoint/XZBBoxcartesian/xzpoint.rscartesian/xzbbox/,后者再细分出xzbbox_enum.rs的枚举与rectangle.rs的矩形实现)。GUI 里的区域选择用前者,方块摆放用后者,转换模块是两者之间唯一的换算关口。

处理:双模式投影分发

transformation.rsCoordTransformerProjectionMode枚举区分两条路径。本地模式下,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定义BlockStorageRegionToModify等共享结构,java.rsbedrock.rsluanti.rs各自实现序列化,方块 ID 映射等差异全部收敛在这一层。连错误处理也收在这里——is_disk_full_error沿 IO 错误链下钻,区分"磁盘写满"与"路径错误",让 GUI 能给出精确提示。

主界面中的世界格式选择

🚀 工程细节与性能边界

  • 分块与流式落盘data_processing.rsshould_stream_to_disk按"基础 500 MB + 每 region 约 26 MB"估算峰值内存,超过可用内存 55% 时自动把 region 逐块写盘,输出不变。
  • 位图缓存floodfill_cache.rsRoadMaskBitmap把"是否道路"的判断变成 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 16:11:07

论文速通|笔墨AI对错用法,新手直接照搬零翻车

核心要点:笔墨AI适配2026高校论文双审规则,功能全面、全程免费,绝大多数论文翻车问题,均为用户使用方式不当导致。以下为极简实操版教程,新手直接套用即可高效定稿。官网:毕业论文-AIGC论文检测-AI智能降重…

作者头像 李华
网站建设 2026/9/9 16:10:27

干式无油氮气增压机组组装与调试全流程指南

Xinran 干式无油氮气增压机组,按工程进度已经推进到组装与联机调试阶段。这篇不绕主题,直接把这套机组从开箱验收到性能验收的完整链路拆开,讲清楚每一步做什么、查什么、记录什么。如果你正在准备一台氮气增压机组的现场安装,或者…

作者头像 李华
网站建设 2026/9/9 16:08:20

AI日报类内容创作规范与信息完整性要求

我无法根据当前输入生成符合要求的博文。 原因如下: 项目标题为“AI 日报(2026年9月2日)”,属于 时效性极强的资讯汇总类内容 ,但提供的输入中: 项目正文为空; 关键词为空; 摘…

作者头像 李华
网站建设 2026/9/9 16:08:02

猫抓:浏览器网页视频下载完整指南,从安装到 M3U8 分片下载

猫抓:浏览器网页视频下载完整指南,从安装到 M3U8 分片下载 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓&#xff08…

作者头像 李华
网站建设 2026/9/9 16:07:29

DataOps落地指南:从数据管道治理到数据契约的工程化实践

1. 从被数据管道淹没,到认真写一个DataOps博客做了快十年数据平台相关的工作,一个非常现实的问题是:身边真正把DataOps讲清楚的人,远比真正把DataOps落地的人少。这个词被引进来之后,很多团队第一反应是“这不就是DevO…

作者头像 李华
网站建设 2026/9/9 16:06:13

Spring Boot整合Quartz实战:持久化、集群与动态任务管理

写Spring Boot整合Quartz这个方法,我估计你们多半是遇到了这么几种情况:项目里要用到比Scheduled更靠谱的定时任务,或者任务多了需要持久化、需要动态管理,再或者公司要求甩掉xxl-job这类重框架,让调度逻辑跟业务代码住…

作者头像 李华