RogueViz引擎深度剖析:HyperRogue背后的非欧几何游戏引擎
【免费下载链接】hyperrogueA SDL roguelike in a non-euclidean world项目地址: https://gitcode.com/gh_mirrors/hy/hyperrogue
HyperRogue 是一款运行在双曲平面上的 SDL 解谜 Roguelike 游戏,而真正支撑它的,是背后的RogueViz 引擎——一套专为非欧几何游戏、数学计算与可视化打造的基础设施。本文将带你快速看懂 RogueViz 引擎的架构、核心模块与丰富的演示程序,让你理解一个非欧几何游戏引擎是如何实现的。
🧭 什么是 RogueViz?非欧几何引擎的定位
RogueViz 官方对它的定义是:"an engine for non-Euclidean games, computations and visualizations"。它是 HyperRogue 的地基,能力远超游戏本身:
- 🌍40 种以上几何:涵盖 2D 双曲、欧氏、球面,乃至 3D 与非各向同性几何
- 🖼️20 种以上投影:同一份地图可以用完全不同的方式渲染到屏幕上
- 🗺️60 种以上土地(land)类型:每种土地拥有独特的怪物、宝藏与规则
- 🔬科研级可视化:群论、图算法、自组织映射等数学演示
- 💰 由波兰国家科学中心(National Science Centre, Poland)资助研发
RogueViz 演示程序的源码就存放在本仓库的rogueviz/子目录中(演示所需的数据文件需从官方渠道另行获取)。
它最巧妙的设计是钩子(hooks)系统:写一个包含init.cpp的 C++ 文件,重新定义若干钩子(比如添加命令行参数、生成新的地图结构、替换绘制流程),加上-DCU=1编译后链接到hyper.o即可——RogueViz 正是这样"寄生"在主游戏引擎上实现全部演示能力的,详见 source-doc.md 中 "How to use the HyperRogue engine" 一节。
🔢 核心架构:让非欧几何跑起来的四层关键
1️⃣ 几何内核:统一的齐次坐标系统
hyperpoint.cpp 是引擎的心脏。它用一套统一的齐次坐标系统同时处理双曲、欧氏、球面几何,且覆盖 2D 与 3D:
hr::hyperpoint——齐次坐标下的点/向量hr::transmatrix——变换矩阵
非各向同性几何则由 nonisotropic.cpp 单独处理。这种"一套数学跑遍所有几何"的设计,是让 RogueViz 能随意切换曲率的关键。
2️⃣ 地图结构:从七边形到游戏格子
- locations.cpp 定义地图抽象:
hr::cell(游戏格子)、hr::heptagon(更粗的结构)、hr::walker(导航) - heptagon.cpp 以纯抽象图的方式构建七边形网格
- cell.cpp 通过"双截角"把七边形图变成真正的游戏图,并定义
hr::hrmap等核心类、计算格子距离
3️⃣ 渲染管线:从几何到屏幕
- geometry.cpp / geometry2.cpp:把离散镶嵌与连续几何对接
- hypgraph.cpp:实现 20 多种投影(
applymodel()),主流投影使用 GLSL - shaders.cpp:GLSL 着色器与底层 OpenGL 例程
- drawing.cpp:绘制对象队列;graph.cpp 负责地砖、怪物、物品等高层对象的绘制
4️⃣ 内容与玩法层
content.cpp 存放土地、怪物、道具等内容定义;classes.cpp 定义所有可用几何与投影;game.cpp 实现大部分游戏机制。
🕹️ RogueViz 演示系统:rogueviz.h 里的核心接口
头文件 rogueviz/rogueviz.h 暴露了演示系统的主要能力,几个值得注意的类型:
| 类型 | 作用 |
|---|---|
vertexdata | 顶点数据:ID、标签、颜色、附加怪物等 |
edgeinfo/edgetype | 边及其类型:权重、颜色、可见范围、箭头缩放 |
colorpair | 双色填充方案,支持纹理图 |
rvimage | 顶点上的纹理图像 |
hooks_drawvertex等 | 钩子集合,供演示程序定制绘制行为 |
除此之外还有几个"引擎级"的通用工具:
- ⚡
parallelize():自动把计算切分到多线程执行(受CAP_THREAD开关控制) - 🎥
smoothcam:平滑相机动画的保存/加载/回放 - 🏆
rv_achievement/rv_leaderboard:在 Steam 版本中为演示程序解锁成就与排行榜
演示程序一览:从超曲面象棋到群论
rogueviz/目录下有上百个演示,挑几个代表性的:
- 🏰 rogueviz/embedded-chess.cpp:在可折叠曲面上玩的嵌入象棋
- 🏙️ rogueviz/hypcity.cpp:双曲空间中的城市场景
- ❄️ rogueviz/snow.cpp:雪景粒子演示
- 🧩 rogueviz/starbattle.cpp:Star Battle 益智游戏
- 🔢 rogueviz/collatz.cpp:3n+1 猜想(Collatz 问题)可视化
- 👥 rogueviz/grigorchuk.cpp:Grigorchuk 群(数学结构)可视化
- 🧶 rogueviz/notknot.cpp:绳结与拓扑演示
- 📈
rogueviz/dhrg/:图算法(介数、嵌入、网格映射等) - 🧠
rogueviz/som/:Kohonen 自组织映射分析
🐀 3D 模型渲染:objmodels 子系统
RogueViz 还支持在非欧几何环境中渲染 3D 模型。objmodels命名空间(见 rogueviz/objmodels.cpp 与 rogueviz/rogueviz.h)提供model、object、transformer、subdivider等类型:读取.obj/.mtl模型,支持自定义几何变换器与细分器——这意味着模型可以被"弯曲"到双曲空间中。
仓库自带 4 个 3D 模型(Polyfjord 象棋、Maxwell 猫、旋转老鼠、斯坦福兔子),见 rogueviz/models/README.txt。在embedded-chess.cpp中就会加载旋转老鼠模型(ratmodel rat("rogueviz/models/", "spinning-rat.obj")),下图正是该模型使用的纹理贴图rattex.png:
🎬 幻灯片系统:RogueViz 的 presentation 能力
rogueviz.h中的pres命名空间把演示升级为完整的幻灯片框架:
- 📸
show_picture/show_animation:插入图片与帧动画 - ∑
show_latex/latex_slide:在幻灯片中渲染 LaTeX 公式 - 📊
grapher:在双曲空间中直接画函数图(line、arrow、pos) - 🎮
uses_game:把一整局游戏嵌入幻灯片中 - 🔁
compare_projections:同屏对比不同投影的效果
这让 RogueViz 既能做游戏,也能做科研报告和教学演示。
🛠️ 一键构建步骤:如何运行 RogueViz 演示
最快配置方法(Linux):
sudo apt-get install make g++ libsdl1.2-dev libsdl-ttf2.0-dev libsdl-gfx1.2-dev libsdl-mixer1.2-dev libglew-dev libpng-dev zlib1g-dev git clone https://gitcode.com/gh_mirrors/hy/hyperrogue hyperrogue cd hyperrogue HYPERROGUE_USE_GLEW=1 HYPERROGUE_USE_PNG=1 makemacOS 用 Homebrew 安装sdl sdl_ttf sdl_gfx sdl_mixer glew libpng即可。
更推荐用项目自带的增量构建器(改一处只重编一处,且更省内存),并加上-rv参数把RogueViz 演示一并编译进可执行文件:
make mymake && ./mymake -O3 -rv其他常用参数:-O3优化构建、-vr构建 VR 版本。更多可配置项见 mymake.cpp。
📚 总结
RogueViz 引擎展示了非欧几何游戏开发的完整路径:
- 统一几何内核(
hyperpoint.cpp)让双曲、欧氏、球面共用一套数学 - 分层地图结构(heptagon → cell)与多投影渲染管线(hypgraph + GLSL)让同一份世界可以以 20 多种面貌呈现
- 钩子扩展机制让 RogueViz 演示、新几何、新投影像插件一样生长
- 幻灯片系统 + 多线程 + 3D 模型,使它同时是游戏引擎与科研可视化工具
如果你想动手研究非欧几何或开发自己的双曲空间应用,从rogueviz/目录的演示源码读起,就是最直接的入口。🚀
【免费下载链接】hyperrogueA SDL roguelike in a non-euclidean world项目地址: https://gitcode.com/gh_mirrors/hy/hyperrogue
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考