“生成一条位于海岸城市、比赛时间约8分钟、弯道较多的街道赛车赛道。”把这句话交给图像模型,它会给出一张好看的图:蓝色海面、白色防波堤、红白路肩勾边的赛道在楼群间蜿蜒穿过。问题是这条赛道能不能跑?第三个弯的半径可能只有七八米,比赛车的最小转弯半径还小;海边直道尽头可能直接撞上一栋楼;两段赛道在俯视图上几乎贴在一起,切过一块草地就能省下半圈。画出赛车场很容易,难的是它能不能作为一场比赛被完整跑完。

这篇文章按“运动本身 → 地形 → 路线 → 规则 → 可玩性”的顺序,把这句提示词在乐鱼体育地图生成流程里被拆开处理的过程完整走一遍。文中所有数值都是模拟示例和设计参考,不代表任何真实赛道或赛事的规范。

先读出这是一场什么比赛,再去想画什么

这句提示词里真正有用的信息只有四条:海岸城市、街道赛、约8分钟、弯道较多。它没说车型、车手数量,也没说是单人计时还是多车同场。AI不能假装提示词已经完整。在乐鱼体育的生成流程里,稳妥的做法是先补上合理默认值,并把默认值明明白白地显示出来:

  • 车型:默认为中等性能的封闭轮组方程式或GT类虚拟赛车,模拟极速约240公里/小时;
  • 同场车辆:默认12台,其中11台由AI控制;
  • 比赛形式:多车同场、静止发车、按圈数决出名次;
  • 难度:默认中等,允许之后调整AI车手的激进程度。

这些默认值决定后面几乎所有几何参数。卡丁车和GT赛车对弯道半径、赛道宽度、制动距离的要求差得很远,车型没定就画线,后面的检查都没有依据。

8分钟这笔账:从比赛时间倒推圈长和圈数

“比赛时间约8分钟”看起来是一个体验需求,其实是一个可以计算的约束。街道赛道弯多、直道短,平均圈速比专用赛道低不少。以模拟车型在多弯街道赛道上的平均速度约140公里/小时为例,折算下来大约是每秒38.9米。

如果先定圈数再推圈长:8分钟是480秒,打算跑6圈,每圈约80秒,圈长就是80×38.9≈3110米,大约3.1公里。如果打算跑4圈,每圈要120秒,圈长接近4.7公里。两种方案都能凑出8分钟,但体验完全不同。4.7公里的街道赛道对玩家来说太长,一圈下来记不住弯道,第二圈还在摸索;3.1公里跑6圈,玩家从第2圈开始就能记住刹车点,第4、5圈就可以开始尝试不同的超车路线。

还要补上几个容易漏掉的修正项。静止发车的第一圈通常比正常圈慢4到6秒;如果AI车手整体偏慢,平均圈速可能落到83秒左右。按6圈算,总时长会落在大约8分05秒到8分25秒之间,仍然在“约8分钟”的合理范围内。模拟结果如果显示平均完赛时间超过9分钟,系统就应该提示用户:要么减1圈,要么缩短一段直道,而不是把一场12分钟的比赛交出去还标注为8分钟。

“弯道较多”也要翻译成数字。3.1公里安排15到17个弯比较合适,平均每180到200米一个转向动作。少于10个算不上弯多;超过22个,直道被切得太碎,超车只能靠对手犯错。

海岸城市给了什么地形,又拿走了什么

海岸城市不是一块平地。它通常有一条相对平坦的滨海大道、一段顺着山坡往上走的老城区街道,以及港口附近纵横交错的直角路口。AI在生成路线之前,要先把这些地形条件读出来,再决定哪一段适合做什么。

滨海大道是全场最长的直道候选,模拟中可以拉到约750米。老城区坡道提供高低差,一段8%左右的上坡接一个下坡弯会让比赛更有层次,但这里有一个必须检查的危险组合:坡顶紧接着重刹车区。赛车越过坡顶的瞬间轮胎负载下降,如果恰好在这时需要全力制动,制动距离会明显变长,很容易冲出赛道。模拟里如果出现“坡顶之后不足80米就是一个低速弯”的情况,系统应该把刹车点往后移,或者把坡顶削平一点。

港口区的直角路口天然适合做慢速弯,但街区之间的道路宽度往往只有8到9米。赛道宽度的底线可以这样估算:模拟赛车车宽约2米,要允许两车并排过弯并留出操作余量,常规路段至少需要10米;计划用来超车的直道末端和刹车区最好放宽到13到14米。宽度达不到的路口只能做单线通过的慢弯,不能被标成超车点。

缓冲区在街道赛道里最难安排。专用赛道可以在弯外修大面积砂石或沥青缓冲区,城市街道外面是楼、护栏和海。生成时通常用“逃逸道”来代替:在重刹车弯的延长线方向预留一段60到100米、能重新接回赛道的支路。海边那段直道尽头如果只有护栏没有逃逸道,这个弯就不能放在最长直道的末端。

弯道要有节奏,快慢交替才有比赛

一条赛道好不好跑,很大程度取决于弯道之间的节奏。连续十个同样半径的中速弯,玩家很快就会觉得单调;连续五个发夹弯则会把平均速度压得很低,也让8分钟的时间预算失控。

弯道半径和过弯速度之间有一个可以直接计算的关系:在不考虑空气动力下压力的简化模型里,最高过弯速度约等于摩擦系数乘重力加速度再乘半径之后开平方。以模拟轮胎摩擦系数1.4为例:

弯道类型 中心线半径(模拟) 极限过弯速度(约) 在赛道里的作用
发夹弯 15米 52公里/小时重刹车、超车主战场
中速弯 60米 103公里/小时 考验走线和出弯加速
高速弯200米 189公里/小时 考验胆量,失误代价大

有了这张表,“快慢交替”就可以变成可检查的规则:相邻两个弯的极限速度差不宜长期小于20公里/小时,否则节奏发平;一个高速弯之后最好接一段加速区或中速弯,而不是马上接发夹弯,否则玩家刚在高速弯里冒完险又要猛踩刹车,失误会集中爆发在同一个地方。

超车结构最经典的组合是“长直道 + 重刹车弯”。模拟车在滨海大道末端能跑到约240公里/小时,也就是每秒66.7米,要减速到80公里/小时进入发夹弯。按1.5倍重力加速度的平均减速度算,制动距离约为(66.7²−22.2²)÷(2×14.7)≈135米。这135米就是超车发生的地方:后车借助尾流贴近,晚一点刹车,从内线切进去。生成器需要做的,是保证这段制动区足够宽、路面没有突然的起伏、弯外有逃逸道,并在地图上标出100米、50米两个参考刹车点。

起终点、发车区和那些看不见的规则

起终点不能随手放在好看的地方。12台车静止发车,交错排列每个位置间隔约8米,发车区就需要约100米;发车线到第一个弯最好还有250米以上的直线距离,让车队自然拉开。如果第一个弯紧贴发车区而且是发夹弯,模拟里几乎每场都会有多车挤成一团,每场第一圈就淘汰三分之一的车,这就是设计缺陷。

赛道还需要一组显式的规则数据:计时线、分段计时点、判定“切弯”的赛道边界、逃逸道接回赛道的位置。如果两段赛道相距不到15米、中间只隔一块绿化带,规则里又没定义边界,AI车手在测试中很快就会发现这条捷径,整场比赛就被一个几何漏洞改写了。

几何检查:自相交、间距和最小弯道半径

在进入模拟之前,生成结果要先过一轮纯几何检查。这一轮不需要跑车,速度快,但能拦下大部分“画面漂亮但不能用”的赛道。

  • 自相交检测:把赛道中心线当作一条闭合折线,逐段检查线段是否相交。街道赛道出现交叉点时,只有两种合法情况:一是立交,上下两层之间需要足够的净空高度,模拟中设为至少6米;二是用户明确要求的“8字形”赛道。除此之外的交叉都要打回重生成。
  • 相邻赛段间距:不相交也可能有问题。任意两段非相邻赛道的边缘距离小于设定值(例如15米)且中间没有实体隔离时,标记为“潜在捷径”。
  • 最小弯道半径:模拟车型的最小转向半径约为9米,考虑车身宽度和走线余量,赛道中心线半径不应低于12米。生成器在老城区直角路口经常会画出半径只有6到8米的急弯,这种弯车辆根本转不过去,只能倒车调头,比赛也就不存在了。
  • 宽度连续性:宽度不能在刹车区里从14米突然收窄到8米。
  • 坡度限制:纵向坡度超过12%的路段对赛车来说已经偏陡,坡顶与刹车区的距离也需要单独检查。

关于体育地图生成后的通用检查项,我们在体育地图自动检查那篇里有更完整的清单,赛车只是其中对几何要求最严格的一类。

让虚拟车手先跑五十场

几何检查只能说明赛道“理论上能跑”,至于它在比赛里表现如何,只有跑过才知道。在乐鱼体育的测试流程里,一个常见做法是让一组不同风格的虚拟车手在同一张地图上反复比赛:有的走线保守,有的刹车很晚,有的喜欢在直道尾流里找机会。以一个模拟场景为例,12台车跑50场,系统会统计几类数据:

  • 圈速分布:正常圈速集中在79到84秒,说明6圈、约8分钟的目标成立;如果分布拖出很长的尾巴,说明某些位置让车频繁失速。
  • 失控点热力图:把每一次冲出赛道、打滑、撞墙的位置标在地图上。模拟中第7弯的冲出率达到23%,远高于其他弯道,回头检查发现它正好位于老城区坡顶后70米。
  • 超车位置和次数:平均每场18次超车看起来不少,但其中85%都发生在滨海大道末端的第1弯,其他两段直道几乎没有超车。这说明全场只有一个真正有效的超车区,比赛会变成“谁在第1弯前占住位置谁就赢”。
  • 完赛率:如果超过一成的虚拟车无法完赛,就要追查是撞击判定过严,还是某个弯道本身不合理。

针对这些结果,修改动作是具体的:第7弯把坡顶削低,刹车点后移40米,并在弯外补一段逃逸道;港口区的第二条直道从9米放宽到13米,末端的中速弯改成半径更小的慢弯,制造第二个超车区。改完再跑50场,第7弯冲出率降到6%,第二超车区承担了约三成的超车。这就是一轮“生成 → 模拟 → 验证 → 修改”的闭环,让AI在交付之前自己先把游戏玩一遍

V1、V2,以及为什么要能退回去

一句话生成出来的赛道只是初始版本。用户拿到V1以后很可能会说:“海边能不能加一个高速弯?”AI把滨海大道中段改成一个半径约220米的高速左弯,得到V2。V2在视觉上更有气势,但模拟数据马上显示出变化:平均圈速降到约76秒,6圈只剩7分36秒;高速弯出口紧接一个中速弯,普通难度下虚拟车手在这里的失控率升到15%;而且因为直道被弯道切短,第1弯的超车次数下降了近一半。

系统应该把这些差异直接摆给用户:V2更快、更刺激,但更难、超车更少。觉得太难可以一键恢复V1;也可以保留V2,把高速弯半径加大到280米降低风险。版本管理的价值不在保存历史,而在让“改坏了”变成可以承受的试错成本。

一条赛道算不算生成成功,看它跑不跑得完

回到那张漂亮的俯视图。海面、楼群、看台、路肩都属于视觉层,放在最后处理完全来得及。决定它是一条赛车场、而不是一幅赛车插画的,是另一组东西:圈长和圈数能不能凑出8分钟,弯道半径是否匹配车辆性能,长直道后面有没有能刹得住、超得了的弯,冲出赛道后有没有路可退,以及一群虚拟车手能不能在上面跑出一场有来有回的比赛。

如果想看这套逻辑在其他项目里怎么变化,可以回到AI体育地图生成栏目,对照滑雪场、高尔夫球场和跑酷路线的做法。对赛车来说,结论很直接:地图看起来再漂亮,赛车跑不完就不能算有效生成。体育地图先解决可玩性,其次才轮到视觉。