news 2026/8/23 16:48:55

HyperRogue的20+种几何投影全解析:从圆盘到鱼眼的渲染秘密

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HyperRogue的20+种几何投影全解析:从圆盘到鱼眼的渲染秘密

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 equidistantmdEquidistant
  • 等积(equi-area):保面积,如azimuthal equi-areamdEquiarea)、MollweidemdMollweide)、sinusoidalmdSinusoidal)、CollignonmdCollignon
  • 等体积mdEquivolume,让"体积"在视觉上一致
  • 地图学移植:Miller、Gall stereographic、Winkel tripel、Aitoff、Hammer 等地球投影也全部搬到了双曲世界(mdMillermdGallStereographic等)

🎮 实用技巧:想量距离就用等距投影;想判断"这块区域有多大"就切等积投影。

🌌 空间感投影:双曲面、半球与真实透视

这一类投影把双曲空间渲染成三维曲面,在窗口里旋转,空间纵深感极强:

  • ball modelmdBall):把平面"鼓起"成球
  • Minkowski hyperboloidmdHyperboloid):最"正统"的双曲几何模型
  • hemispheremdHemisphere):上半球,适合俯瞰
  • native perspectivemdPerspective)与geodesicmdGeodesic):模拟相机沿测地线看向平面
  • relativistic perspectivemdRelPerspective)、Lie perspectivemdLiePerspective):用相对论/Lie 群几何定义的"物理式"透视,边缘会出现类似引力透镜的变形

🌀 鱼眼、Joukowsky 与奇趣变换

这是最能体现"渲染秘密"的部分——每个投影背后都是一个复变函数或群作用:

  • fisheyemdFisheye)与 variant fisheye(mdFisheye2):径向非线性拉伸,产生"鱼眼镜头"观感
  • Joukowsky transformmdJoukowsky)及其逆复合(mdJoukowskyInverted):源自空气动力学的保角变换,画面会出现漂亮的"绕翼"流线感
  • rotated hyperbolesmdRotatedHyperboles):旋转双曲线族,扭曲出漩涡效果
  • spiral/ringmdSpiral):螺旋坐标,世界绕成环状
  • conformal square / conformal eggmdConformalSquaremdConformalEgg):把无穷平面"塞进"正方形或蛋形里且保持保角
  • retroazimuthal 三兄弟mdRetroCraigmdRetroLittrowmdRetroHammer):反方位投影,任意点到中心都"直来直去"
  • 还有mdPolar(极坐标)、mdTwoPoint/mdThreePoint多点等距、mdCentralInversion(中心反演)等

⚙️ 投影在代码里是怎么落地的?

  1. 配置结构projection_configuration持有当前投影(eModel)、中心、缩放等参数,定义见 hyper.h
  2. 元信息表mdinf为每个投影保存三种几何下的显示名与能力标志(保角、等积、带状、透视……),游戏菜单据此生成列表
  3. GPU 加速:开启 shader 后部分投影直接用着色器计算,由consider_shader_projection控制(见 hyper.h)
  4. 自定义投影:RogueViz 允许把新投影动态追加进mdinf,扩展入口在 rogueviz/extra-projections.cpp

🖱️ 在游戏中快速切换投影的完整步骤

  1. 进入游戏后按v打开设置菜单
  2. 在投影(Projection)选项中用鼠标滚轮滚动浏览 20+ 种投影,选中回车
  3. 按方向键(PageUp/PageDown)旋转视角,按Home把画面中心对准自己
  4. 想横着探索?切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),仅供参考

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

帧缓存还是管道直传?timecut 两种帧传输模式详解与选型指南

帧缓存还是管道直传?timecut 两种帧传输模式详解与选型指南 【免费下载链接】timecut Node.js program to record smooth movies of web pages with JavaScript animations 项目地址: https://gitcode.com/gh_mirrors/ti/timecut timecut 是一个能把网页 Jav…

作者头像 李华
网站建设 2026/8/23 16:31:34

近红外光谱笔记

补充:OTSU算法 采用OTSU算法对灰度图像(玉米种子区域标记为“1或白色”背景区域标记为“0或黑色”)进行背景分割,得到最优阈值。接下来,对二值图像中的玉米种子(连通区域)进行编号。随后,将带有序列号的二值图像与每个波长的灰度图…

作者头像 李华
网站建设 2026/8/23 16:28:44

UnoCSS 原子类使用指南:从入门到精通

点击下方链接查看参与活动有机会领取 iphone 我的第一个开源项目:前端逐梦之旅与开源荣耀之巅 - vue-CSDN博客 UnoCSS 是一个高性能、高度可定制的原子化 CSS 框架,它提供了丰富的原子类来快速构建现代 Web 界面。本文将详细介绍 UnoCSS 的核心类及其使用方法,帮助您快速上…

作者头像 李华