仿赛马路径如何实现?

仿赛马比赛,8匹马在赛场上跑一圈,按系统预生成的结果名次演示。
打算用贝塞尔曲线之类实现按路径跑,可是会发生马重叠在一起,特别在拐弯的时候,有什么好的实现方法呢?用的是3D模型场景

RaceCourse

啊,没看过赛马,不是只能在自己的道跑么。。。

1赞

赛马不是像田径场那样分道的,如果分道跑就很好实现了。 :rofl:

这个可以分

不分赛道的话 一个3d寻路导航应该可以实现了navmesh寻路 就是有点大

如果你是要做一个赌马游戏,那关键应该是按照预先的顺序跑出结果

每匹马都有各自的跑道,各自不做碰撞检测,只做深度遮挡排序。

模拟跑:
先循环执行跑马逻辑,直至所有马抵达终点,记录关键帧数据(每匹马水平速度、垂直速度、持续时间)。注意,这里不需要播动画,只是循环运算数据,得出结果。

真实跑:
模拟跑结果与预期排名做比较,把不符合预期名次的马数据进行交换,使符合排名预期。在update里,利用交换后的模拟跑数据运算并渲染,就是符合预期的动画了

整体思路类似即时战略的Replay

需求是模拟真实赛马比赛,不分道,拐弯的时候每匹马都会抢占内湾。想不到怎么演示好了 :rofl:

用贝塞尔曲线呗,每局开始把路径计算好,然后播放就行了

加上刚体分组就不重叠了,想超越只能跟真实赛跑一样从外道超越

RVO…

初始每匹马各占一道,比赛开始后每匹马每隔N秒变换一次水平速度X、垂直速度Y,并记录下来

N、X、Y都是伪随机数

这样就可以表现出互相抢道的效果,并不是自始至终都只在自己跑道上

实现这个就已经可以模拟真实赛马画面了

你一定要实现碰撞,只要简单的矩形检测就行,外道不能挤压内道

这样会稍微复杂一点,个人觉得没必要

Context Steering
https://github.com/RubenFrans/ContextSteering-Unity

1赞

我认为用rvo2 已经足够, 在已知全程路径的情况下, 每匹马都会选择位移或减速避开完全满足需求, 只需要定时更新每匹马的速度

我问了一下AI:

Context Steering Behaviors (上下文导向行为)是一种用于游戏AI的决策系统,特别适用于需要精确控制和复杂行为的场景,比如赛车游戏。它的核心思想是通过 上下文地图 (Context Maps)来指导实体的行为,而不是直接依赖传统的 导向行为 (Steering Behaviors)。以下是它的详细描述:

1. 上下文地图(Context Maps)

  • 上下文地图 是Context Steering的核心机制。它由两个主要部分组成: 兴趣地图 (Interest Map)和 危险地图 (Danger Map)。
    • 兴趣地图 :表示实体希望前往的方向或目标。例如,在赛车游戏中,兴趣地图可能表示赛道的理想路线或超车机会。
    • 危险地图 :表示实体需要避免的区域或障碍。例如,其他车辆、赛道边缘或障碍物。
  • 每个地图由多个 槽位 (Slots)组成,每个槽位代表一个可能的方向或位置。槽位的值表示该方向的兴趣或危险程度。

2. 决策过程

  • 危险地图处理 :首先,系统会遍历危险地图,找到危险值最低的区域,并屏蔽掉所有危险值较高的槽位。
  • 兴趣地图处理 :将危险地图的屏蔽结果应用到兴趣地图上,移除所有被屏蔽的槽位。
  • 选择最佳方向 :在剩余的槽位中,选择兴趣值最高的方向作为实体的移动目标。
  • 速度控制 :移动速度与兴趣值成正比。兴趣值越高,实体移动得越快。

3. 子槽位移动(Subslot Movement)

  • 为了在低槽位数的情况下实现平滑的连续移动,Context Steering引入了 子槽位移动
  • 在确定目标槽位后,系统会评估周围槽位的兴趣梯度,并估计这些梯度的交汇点。
  • 通过将虚拟槽位索引反向投影到世界空间,生成一个更精确的移动方向。

4. 赛车游戏中的应用

  • 在赛车游戏中,Context Steering特别适合处理复杂的驾驶行为,如超车、避障和保持赛道位置。
  • 坐标系统 :赛车的行为通常被限制在赛道的左右偏移范围内,而不是完全自由的2D空间。Context Steering通过一个标量(左右偏移)和一个速度控制标量来管理赛车的行为。
  • 上下文地图的可视化 :可以将上下文地图视为赛道的横截面,每个槽位代表赛道上的一个特定偏移位置。地图的宽度与赛道的宽度一致,左右边缘分别对应赛道的左右边界。

5. 优势

  • 低耦合 :Context Steering的行为组件是小型且无状态的,易于维护和扩展。
  • 高效性 :通过低槽位数和子槽位移动,系统在保持高性能的同时实现了平滑的连续移动。
  • 精确控制 :能够保证任何所需的移动约束,避免传统导向行为中常见的碰撞和不一致问题。

6. 实际案例

  • 在《F1 2011》中,Context Steering取代了传统的导向行为,代码量减少了4000行,同时AI在避障、超车等行为上表现更佳。

总结来说,Context Steering通过上下文地图和子槽位移动机制,提供了一种高效、精确且易于维护的行为决策系统,特别适合赛车游戏等需要复杂行为控制的场景。

:+1: 厉害,总结这么到位。

:laughing:感觉各位提供的思路,我都尝试去看看

感觉各位提供的思路 :laughing:

ai干这活强啊,直接把项目喂给ai让它写个creator的ts版本是不是也可以 :thinking:

你会发现写出来后跑不了, 让ai修, 越修越奇葩, 最后还是自己去修bug :joy:

想了一个:各位看看行不行
用二维数组做一个地图,不用考虑贝尔塞,你地图数据设置好了,马儿自然是围着圈跑。寻路算法修改一下,只能顺时针方向跑(主要就优化这里)
考虑碰撞,马跑到一个格子,就把这个地图格子数据设置不可经过,离开的时候再设置可经过,实时寻路,只需要寻下一个位置就行(只寻一个位置,计算量也不大),因为你的游戏地图决定了,一定能寻到路。后面的马儿寻路的时候,就不会挤到一个地方