HyperRogue的20+种几何投影全解析:从圆盘到鱼眼的渲染秘密
【免费下载链接】hyperrogueA SDL roguelike in a non-euclidean world项目地址: https://gitcode.com/gh_mirrors/hy/hyperrogue
HyperRogue 是一款运行在非欧几里得(双曲)世界中的 SDL 角色探索游戏(roguelike),其核心魅力之一在于:它内置了20 多种几何投影,可以把无限大的双曲平面"压缩"到你的屏幕上看。本文将带你从最经典的庞加莱圆盘投影一路讲到鱼眼投影,揭秘每种投影的数学思想与渲染效果,并给出源码位置,方便你动手试验。
🧭 为什么双曲世界需要"投影"?
双曲平面是无限延展且曲率处处为负的,无法直接画进一个有边框的窗口。游戏必须用投影(把双曲点映射到屏幕坐标的函数)来做可视化。所有可用的投影在eModel枚举中定义,从mdDisk(圆盘)一直到mdConformalEgg,共 50 余项:
- 定义位置:classes.cpp
- 每种投影的名称表(双曲/欧氏/球面三种几何下的叫法)见
mdinf:classes.cpp
这张 1024×1024 的纹理贴图会贴在 3D 模型表面,配合 HyperRogue 的几何投影渲染——通过它你能直观看到投影如何弯曲空间。
📀 经典三剑客:圆盘、半平面与带状
| 投影 | 特点 | 源码枚举 |
|---|---|---|
| 圆盘(Poincaré disk) | 保角、最经典,Escher 风格的"无穷套娃"感 | mdDisk |
| 半平面(上半平面) | 保角,与圆盘等距变换等价,适合看"地平线" | mdHalfplane |
| 带状(Mercator) | 保角的圆柱式投影,可水平滚动,像一张无限长的纸 | mdBand |
圆盘投影是 HyperRogue 的"门面":靠近边界越收缩,一眼就能看到无穷远。半平面则把无穷远放到一条直线上,探索时"路"的感觉更直接。
📐 等距与等积:数学家的取舍
没有任何投影能同时保住距离和面积,HyperRogue 把这套"取舍"做成了可切换选项:
- 等距(equidistant):保"从中心出发"的距离,如
azimuthal equidistant(mdEquidistant) - 等积(equi-area):保面积,如
azimuthal equi-area(mdEquiarea)、Mollweide(mdMollweide)、sinusoidal(mdSinusoidal)、Collignon(mdCollignon) - 等体积:
mdEquivolume,让"体积"在视觉上一致 - 地图学移植:Miller、Gall stereographic、Winkel tripel、Aitoff、Hammer 等地球投影也全部搬到了双曲世界(
mdMiller、mdGallStereographic等)
🎮 实用技巧:想量距离就用等距投影;想判断"这块区域有多大"就切等积投影。
🌌 空间感投影:双曲面、半球与真实透视
这一类投影把双曲空间渲染成三维曲面,在窗口里旋转,空间纵深感极强:
- ball model(
mdBall):把平面"鼓起"成球 - Minkowski hyperboloid(
mdHyperboloid):最"正统"的双曲几何模型 - hemisphere(
mdHemisphere):上半球,适合俯瞰 - native perspective(
mdPerspective)与geodesic(mdGeodesic):模拟相机沿测地线看向平面 - relativistic perspective(
mdRelPerspective)、Lie perspective(mdLiePerspective):用相对论/Lie 群几何定义的"物理式"透视,边缘会出现类似引力透镜的变形
🌀 鱼眼、Joukowsky 与奇趣变换
这是最能体现"渲染秘密"的部分——每个投影背后都是一个复变函数或群作用:
- fisheye(
mdFisheye)与 variant fisheye(mdFisheye2):径向非线性拉伸,产生"鱼眼镜头"观感 - Joukowsky transform(
mdJoukowsky)及其逆复合(mdJoukowskyInverted):源自空气动力学的保角变换,画面会出现漂亮的"绕翼"流线感 - rotated hyperboles(
mdRotatedHyperboles):旋转双曲线族,扭曲出漩涡效果 - spiral/ring(
mdSpiral):螺旋坐标,世界绕成环状 - conformal square / conformal egg(
mdConformalSquare、mdConformalEgg):把无穷平面"塞进"正方形或蛋形里且保持保角 - retroazimuthal 三兄弟(
mdRetroCraig、mdRetroLittrow、mdRetroHammer):反方位投影,任意点到中心都"直来直去" - 还有
mdPolar(极坐标)、mdTwoPoint/mdThreePoint多点等距、mdCentralInversion(中心反演)等
⚙️ 投影在代码里是怎么落地的?
- 配置结构:
projection_configuration持有当前投影(eModel)、中心、缩放等参数,定义见 hyper.h - 元信息表:
mdinf为每个投影保存三种几何下的显示名与能力标志(保角、等积、带状、透视……),游戏菜单据此生成列表 - GPU 加速:开启 shader 后部分投影直接用着色器计算,由
consider_shader_projection控制(见 hyper.h) - 自定义投影:RogueViz 允许把新投影动态追加进
mdinf,扩展入口在 rogueviz/extra-projections.cpp
🖱️ 在游戏中快速切换投影的完整步骤
- 进入游戏后按
v打开设置菜单 - 在投影(Projection)选项中用鼠标滚轮滚动浏览 20+ 种投影,选中回车
- 按方向键(PageUp/PageDown)旋转视角,按
Home把画面中心对准自己 - 想横着探索?切band(带状)投影,视野变成一条无限走廊
💡 新手建议路线:圆盘 → 半平面 → 双曲面(hyperboloid)→ 鱼眼 → Joukowsky,五种看下来,非欧几何的"味道"就有了。
🧩 延伸探索
- 投影枚举与元信息:classes.cpp
- 投影配置结构:hyper.h
- 自定义投影扩展:rogueviz/extra-projections.cpp
- 更多非欧几何演示:rogueviz/ 目录下的各个 demo 源文件
- 平铺图案样例(感受双曲镶嵌):tessellations/sample/
从圆盘到鱼眼,HyperRogue 把"同一张地图的 50 种看法"变成了一个可以即点即玩的画廊。挑一个投影开一局,你眼中的双曲世界从此有了第二种形状。🌌
【免费下载链接】hyperrogueA SDL roguelike in a non-euclidean world项目地址: https://gitcode.com/gh_mirrors/hy/hyperrogue
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考