NEE's Blog

游戏中的道路艺术:从贝塞尔曲线到欧拉螺线

February 09, 2026

本文翻译自 Art of Roads in Games,原载于 Hacker News。


不知道是不是只有我这样,每当我看到从看似混乱的环境中涌现出的复杂模式时,总会感到一种原始的满足感。

想象一下蚂蚁群的洞穴、蜜蜂那完美的六边形蜂巢,或者叶子上的脉络。没有建筑师,没有蓝图,只有简单规则的层层叠加,最终形成了美丽的模式。我无法解释为什么,但看到这些结构总会让我感觉很好。

人类也会做这样的事情。对我来说,我们创造的最迷人的模式之一就是道路。

有时候我想象来自遥远星系的外星人在我们消失很久之后发现地球。森林被大自然重新占领,城市变成废墟,但在它们之间,一个微弱的模式仍然可见——道路网络。我想他们会像我看着自然模式时产生同样的感觉——”天啊,真的有人仔细思考过这个。”

城市建造游戏与它们的道路

我必须承认,道路从小就让我着迷。

我仍然记得第一次玩《SimCity 2000》时,我大约五六岁。我什么都不懂。肯定不知道什么是分区、税收或需求。但从一开始,道路就让我着迷。

我认为道路是每个城市建造游戏的核心。它是构建城市的基石。从那时起,我几乎玩过所有的现代主题城市建造游戏。在此期间,我也开始在现实世界中注意它们,更详细地研究它们。

环岛、立交桥、高架桥、汇入车道。注意到每一个细节。

尽管每个游戏都比前一个有所改进,但有些东西总是感觉……不太对劲。

《SimCity 4》增加了高度和斜向道路。《SimCity 2013》引入了弯曲道路。然后是《Cities: Skylines》,提供了大量自由。你可以自由放置道路并将它们以任何角度合并成交叉口,在不同的高度建设高架桥来构建疯狂但不切实际的立交桥。我认为这是最大的突破。

但有些事情仍然困扰着我。高速公路匝道不切实际地尖锐或摇晃,应该是高速的车道在某些点弯曲得太急,交叉口的转角半径看起来很奇怪。

我是说,看这个。这大概是高速公路工程师的噩梦:

Highway nightmare

然后是 mod。Mod 改变了一切。伟大的社区开启了新的自由。你可以建造几乎任何东西:完美的汇入车道、逼真的标记和平滑的过渡。这是一个彻底的游戏规则改变者。我特别为这个 5 车道的 turbo 环岛感到自豪:

Turbo roundabout

但即使在那时,mod 也不感觉完全自然。它们仍然受到游戏原始系统的限制。

《Cities: Skylines 2》将其推进得更远,车道变得更加逼真,标记也是如此。我认为在这一点上,未经训练的眼睛不会知道它与现实的区别。

然后我不再盲目摸索,开始问为什么?我试图理解工程师如何设计道路,以及游戏开发者如何编写它们。

那就是我直接遇到根本问题的时候——就在最底层。它涉及到每个开发者都知道和喜欢的东西:

贝塞尔样条(Bezier Spline)

如果你是 Unity 或 Unreal 开发者,或者玩过任何矢量图形编辑软件,你已经很了解它们了。贝塞尔曲线是一种优雅、直观且极其强大的方式,可以在两点之间平滑插值,同时考虑某个运动方向(切线)。

这正是道路应该做的,对吧?当然,开发者自然认为它们是完美的工具。

我必须承认,它们有它的美。但在表面之下隐藏着一个不舒服的真相。

当贝塞尔样条不够用时

你看,现实生活中的道路形状来自一个基本事实:车轮车轴。无论你如何驾驶汽车,左右轮之间的距离保持不变。你可以在雪或沙地上的轮胎痕迹中注意到这一点。两条完美平行的路径,始终保持相同的距离,保持一致的弯曲形状。

汽车不跟随抽象的样条。它们行驶在一些想象的车道上。

贝塞尔样条的问题在于:它们在偏移时不保持形状和曲率。

在平缓的曲线上,它们看起来还可以,但一旦你有更紧的弯曲,数学就崩溃了。用数学术语来说:贝塞尔曲线的偏移不是贝塞尔曲线。

当游戏引擎尝试沿贝塞尔样条生成道路网格时,几何体经常在急角度处失败。内边缘的曲线速率与外边缘不同。这会产生”挤压”,自相交的几何体。

这是它们在极端情况下开始失败的最佳例子:

Bezier failure

总结一下:贝塞尔曲线是无约束的。它们启用的自由正是”阿喀琉斯之踵”。真正的道路是考虑到真实运动的约束而设计的。汽车的路径不能神奇地自相交。

幼儿园数学

好的,那么什么保持平行性?如果你已经上过幼儿园,你已经熟悉它了:它是

它几乎有一个神奇的属性:无论你如何偏移它,结果仍然是一个圆弧。与初始的完美平行。如此令人满意。

将贝塞尔曲线换成圆弧也产生了一个不错的、意想不到的奖励。为了程序化地构建交叉口,引擎必须每帧执行多次曲线-曲线相交操作。两个贝塞尔曲线之间的相交是非常复杂的。一方面,你有多项式根查找、迭代数值方法、de Casteljau 方法 + 边界框和多次收敛检查,而圆弧只是一个简单的、普通的 O(1) 公式。

通过缝合不同半径的圆弧,你可以创建任何形状,同时遵守适当的工程原则。

下一层级

但这还不是故事的结束。圆弧也有问题(哦不)。基础设施中圆的问题在于它们具有恒定的曲率。这意味着当从直线进入圆形曲线时,横向力从 0 跳跃到一个固定的常数值(由圆的半径决定)。如果你以高速进入这种曲线的汽车或火车,感觉会很糟糕。

土木工程师也必须考虑到这一点。那么,什么曲线在偏移时保持平行性并且具有平滑增加的曲率?

为你介绍:过渡曲线——最著名的是欧拉螺线(clothoid)。

欧拉螺线随距离逐渐增加曲率。你几乎直行开始,然后慢慢转得越来越紧。方向盘平滑旋转。力自然增加,乘客的身体几乎不会注意到过渡。

这些曲线通过保持平行偏移和连续曲率变化,提供高速下的舒适乘坐。

它们也是……数学噩梦。微分几何。积分。哦天哪……这可能就是为什么大多数游戏甚至不敢尝试。

但这没关系。

车辆在城市街道上移动缓慢。对于城市道路的交叉口,圆弧是一个相当不错的选择。

为什么我构建自己的道路系统

我刚才喋喋不休说的所有东西都重要吗?99% 的城市建造玩家关心交叉口的转角半径是什么形状吗?很可能不。那为什么要费心呢?

首先,因为好奇心。就像任何其他过分痴迷于非常特定主题的细节的书呆子一样,我只是想看看我会如何实现它。就像挑战现状。

其次,即使既定的标题可能不会准确渲染道路,它们仍然领先于独立开发者可以在网上找到的解决方案数光年。这方面的教程和资产只是令人悲伤。我个人对网格感到厌倦,我只是想构建一个更好的解决方案,与任何想构建城市建造游戏的人分享。

这些资产 ^ 让我难过。

Sad assets

在下一篇文章中,我将讨论更多技术细节,深入探讨我如何构建自己的解决方案。如果你想跟随或在发布此资产时得到通知,请在下面写下你的电子邮件。


个人见解

读完这篇文章,我意识到游戏开发中有很多我们忽略的数学细节。作为开发者,我们经常选择”足够好”的解决方案(比如贝塞尔曲线),但当需要高度真实感时,这些近似值就会暴露出问题。

这让我想到软件设计中的取舍:简单 vs 准确。贝塞尔曲线易于实现和理解,对于大多数视觉场景足够好。但当模拟需要符合物理规律时(如车辆行驶),就需要更复杂的数学模型(如欧拉螺线)。

类似的情况在很多领域都存在:

  • 使用贝塞尔曲线绘制 UI 界面(足够好)
  • 使用物理引擎模拟真实世界(需要更精确)
  • 用 LLM 生成代码(便利但不总是正确)

关键是要知道什么时候”足够好”真的足够了,什么时候需要投入额外精力追求精确。

关键要点

  1. 贝塞尔曲线的局限:虽然广泛用于游戏开发,但在偏移时不能保持平行性,导致在急转弯处出现几何问题
  2. 圆弧的优势:保持完美平行性,计算效率高(O(1)),适合城市道路交叉口
  3. 欧拉螺线:土木工程师实际使用的曲线,提供连续曲率变化,但数学复杂度高
  4. 工程取舍:游戏开发需要在视觉真实感和计算复杂度之间平衡
  5. 观察的价值:作者通过仔细观察现实世界,发现了游戏实现中的不足,这提醒我们在开发中应该多观察真实世界的运作方式

这篇文章对游戏开发者、图形程序员和任何对计算几何感兴趣的人都有很好的启发意义。它展示了数学如何成为连接虚拟世界和现实的桥梁。

comments powered by Disqus