← ALL ARTICLES
游戏AI11 MIN READ

导航边界与坡面交接

全库目录221
本文目录8

局部避障提出的速度还要让身体留在走廊内,并为坡面边界保留停车距离。本文从本步边界约束推到整段连续曲线、停车包络与跨坡面交接。输入采用移动支撑与速度反馈定义的相对速度v和坡面换算系数k;令地表速度上限为V,本地块水平上限为Vh=V/k,候选求交见局部避障。

走廊边界与速度求交

动态邻居半平面只防角色相撞,身体还要留在路线走廊和当前坡面。跟随器把走廊凸区域与当前平面地块凸片求交。相同梯度的相邻片可按凸性合并,梯度不同的片保留交接边,即使它们属于同一导航多边形。导航区域已经按身体半径侵蚀,后续约束不重复减半径。

移动支撑与边界参考系

求解变量v是角色相对支撑的水平速度,本步支撑水平速度为u,恒速预测下世界位置是x(t)=x0+t*(u+v)。一条边的外向单位法线为n,初始平面为dot(n,x)<=b0,边界自身以速度e平移,则b(t)=b0+t*dot(n,e)。令初始边距s=b0-dot(n,x0),将步末位置代入得到dot(n,v)<=s/dt+dot(n,e-u)。同一时间步内全部量来自同一预测快照,边界记录所属对象、变换及运动版本。

固定墙的e为零,约束必须扣除支撑搬运;与平台一起平移的边e=u,搬运项抵消,才可使用dot(n,v)<=s/dt。例如x0=-0.05米、右边界X=0、dt=0.1秒,支撑向右1米/秒,固定边要求v_x<=-0.5米/秒。v=0会使实际脚点到X=0.05,已经越界;v=-0.6则使脚点到X=-0.01;这只证明边界条件,候选仍需落入以实际vEnd为圆心的加速度可达圆。若该边也随支撑右移1米/秒,步末边为X=0.1,v=0仍保持0.05米边距。固定边与平台边可以出现在同一个交集中,各自消费自己的e。

恒定法线、恒速直线下,每条有符号边距随时间线性变化,起点与终点都满足就能证明整段覆盖。ORCA先在世界速度中构造,再用u+v换算;最大速度圆和加速度可达圆使用相对支撑速度,旋转时先按移动支撑与速度反馈搬运旧速度。这些约束共同求交。

从v0连续加速到候选步末v1时,整步位移还包括加速过程。冻结支撑平移u与边界平移e,水平轨迹为x(t)=x0+(u+v0)*t+(v1-v0)*t²/(2*dt),步末条件成为dot(n,(v0+v1)/2)<=s/dt+dot(n,e-u),其中s为初始边距。把它写成v1的半平面参与求解;恒速式只用于v0=v1的片段。随后将轨迹代入每条边,检查t=0、t=dt,以及导数为零且落在步内的极值时刻,才能排除中途越界后又返回的曲线。

仍取x0=-0.05、u=1、固定右墙、dt=0.1,若v0=0,线性加速到v1=-0.6,步末X为0.02,恒速候选本来满足的边界此时已经违反。连续曲线要求v1<=-1;其所需加速度至少10米/秒²。主动预算只有1米/秒²时,这一步没有足够制动能力,控制器保留实际状态并处理碰撞,不能用一次速度赋值制造安全。恒速片段v=-0.6得到X=-0.01的前例仍成立,它有不同的起始速度。

ORCA半平面约束候选步末世界速度,不能单独证明加速期间不相撞。控制器用这条连续曲线与邻居预测做相对扫掠,失败就拒绝该候选并尝试其他候选或制动;候选枚举耗尽记录当前求解失败,不宣称所有连续轨迹都无解。后文恒速反应与制动公式提供停车包络,实际加速段及其后续制动仍共同进入曲线验证。

旋转、加速或步内支撑切换时,控制器预测身体世界曲线xWorld(t),边界对象提供同一时轴上的刚体变换MEdge(t)。把身体曲线变到每条边的局部空间,计算f(t)=dot(nLocal,inverse(MEdge(t))*xWorld(t))-bLocal,要求整个区间f<=0;使用世界形状的扫掠继续核对身体净空。共同刚体运动在局部式中直接抵消,不能把旋转平台边硬写成固定世界平面。

参考实现按曲线与边界运动的分段点划分时间区间。仿射片段检查两端;其余片段在中点求f,并用变换与身体速度上界取得L>=max|df/dt|,若f(mid)+L*区间时长/2<=0便证明整段在内,否则二分。对世界式f=n·(x-o),可取L=|nDot|*D+max|xDot-oDot|,D为区间内身体到边界参考点的距离上界。精确共同运动优先用局部式消去,避免边界接触处的零边距被误判。达到最小物理子步仍不能证明覆盖时,该候选返回边界检查不确定,不标为安全;调度器改用可验证的制动曲线或报告不可保证并交给实际碰撞处理。

运动预测的时间原点、支撑与边界轨迹版本随本步保存,实际提交前共同核对。预测失配先废弃候选,从当前实际姿态与有效步末速度重新构造;旧平台速度不能继续作为新边界的补偿项。

相邻多边形处于同一坡面梯度、并集凸且门户顺序合法时,可以合并为更大的局部区域,减少内部门户造成的减速。凹形走廊保留分段:本步最多走到下一个同梯度门户,在实际位置到达该边且下一运动方向指向邻接多边形内部时,选择邻接区域继续求解。数值落在共有边上按路线门户索引决定归属,不把位置沿法线强行推过墙。步内继续跨越同梯度门户时,按到门户的时间拆成子步,对剩余时间重新构造所有速度约束;邻居位置也推进相同时间。不同梯度的边按下一节停止交接。简单逐帧实现允许在门户多停一帧,这个时间成本不改变空间安全条件。

例如距右墙0.1米、dt=0.1秒时,边界要求右向速度不大于1米/秒。若ORCA唯一可行方向要求右向至少1.5,两类约束无交集。跟随器先把动态邻居约束作为可松弛条件,在走廊半平面与可达速度圆内选择最接近下一节停止目标vStop的制动速度,并标记动态避障失败;连这个集合也为空时,再选择可达的最大制动并由扫掠截断。前一种结果可能与邻居碰撞,后一种连静态边界都无法通过速度保证,二者都不能标为安全。上层等待预约或重新规划解除僵局。

坡面边界与实际交接

只保证本步未越界,还可能让身体高速抵达边缘。制动先确定参考速度r:全部边固定时选世界静止r=0;全部边与同一恒速支撑平移时选r=u。混合边界选择满足所有dot(n,r-e)<=0的参考速度,即制动完成后身体不会继续向任何边外漂移。参考选择也用半平面与圆求交:在满足边界条件及|r-u|<=Vh的集合中,取最接近u者,平局按边ID排序。还要求相对支撑的停止目标vStop=r-u落在速度上限内;不满足时不能声称在该区域内能够停稳。

例如支撑向右1米/秒而右墙固定,r=0意味着角色必须相对支撑向左1米/秒,才能在世界中保持静止。相对最大速度只有0.8米/秒时,这个停止目标不可达,控制器报告搬运超过可抵消能力,执行实际碰撞或安全退出,不能把相对速度归零记成避墙成功。平台自身的边e=u时,r=u,停止目标则是vStop=0。

记当前边距s=b0-dot(n,x0),可保证的水平制动预算为a,候选相对参考速度为c=u+v-r。恒速反应一步后以单一预算a把c制动到零,附加位移为c*(dt+|c|/(2*a));参考运动相对边界的项(r-e)始终朝内或沿边。再加入保守法向约束dot(n,c)<=sqrt((a*dt)^2+2*a*s)-a*dt。为让所有边共用同一条制动轨迹,取Cmax=Vh+|u-r|,再加保守线性半平面dot(n,u+v-r)<=s/(dt+Cmax/(2*a))。速度圆仍约束v,制动半平面只是平移到同一变量后参与求交。

支撑与边界恒速时,这条轨迹证明覆盖停车全程及停后的保持。支撑或边界旋转、加速时,参考速度也会变化,改用前节的相对边界曲线检查,不直接延用恒速停车公式。恢复共同重建支撑、边界运动和r;相对支撑停止、相对边界停止分别记录。路线完成要求对目标参考系的完整速度差进入阈值,稳定接地另核对支撑法向接触;固定目标前逆向抵消传送带时,相对支撑速度可以非零。无法同时满足目标、边界和身体接触时保持Running或失败,不伪造到达。

静止平地上u=r=0,Cmax退化为Vh,c就是v。边距s=0仍允许片内退回或沿边运动;a为零或速度无效时不能使用除法式,静止状态只能在参考运动不越界时保持,已有速度交给控制器处理。没有可证明的r或可行制动候选时,保留实际速度与失败原因,按前节无解顺序回退。

这组约束作用于所有候选速度。设平地P位于X<=0,斜坡Q位于X>=0,两者在X=0相接,Q高度为sqrt(3)*X。角色脚点X=-0.1米,dt=0.1秒,水平制动预算a=1米/秒²,Vh=2米/秒。法向必要上限为sqrt(0.21)-0.1≈0.358米/秒,共享预算的线性包络进一步给出v_x<=0.1/(0.1+1)≈0.0909米/秒。例如v=(0.08,1.8)的大小约1.802,制动轨迹的X位移为0.08*(0.1+1.802/2)≈0.0801米,仍在P内;ORCA提出向Q移动2米/秒则被拒绝。计划路线留在P或局部导航区域跨过两面,都不改变这个判断。若没有可行避让,先松弛动态邻居约束,在本片中制动,不能用P的k=1预算直接进入Q的k=2运动。

确实需要进入Q时,跟随器登记目标交接边及邻片,阶段由Following转Approaching、Stopping、AtBoundary、Adopting。接近和停止期间继续使用P的边界与预算,并把整段速度降到停止阈值;沿边仍在滑行不算停好。若脚点尚距共同边一小段距离,控制器先完成制动,再从实际停止位置选择共同边上的合法脚点,执行零速起步、零速结束的接入动作。整条线段留在P的凸片内,身体扫掠通过后才接纳。

接入长度为d、加速度幅值为a、速度上限为vCap。短接入先以a加速再以a制动,峰值为sqrt(a*d)、总时间为2*sqrt(d/a)。若d大于vCap²/a,两端加减速各耗时vCap/a,中间匀速时间为(d-vCap²/a)/vCap。

控制器按这条连续时间曲线计算每个物理步的位移,跨过加速与制动分界的时间步分段积分,不能把整步都按步末速度积分。接入独占原移动器,普通跟随暂停派发;曲线检查覆盖整段及其制动余量。预先安排的减速段由控制器直接执行,停止曲线的事件处理不能撤掉已经安排的制动;临近终点时继续原减速或加强制动,不能额外保持速度一个反应步而越过边界。

确认实际脚点到达共同边并停止后,才记AtBoundary,位置容差不授权把身体直接移到边上。

Adopting在同一控制器入口核对原地块、邻片、共同边、支撑面和导航版本,检查新支撑与台阶规则,然后共同保存新地块ID、梯度、世界步末速度、新支撑速度与Following阶段。新相对初速由两份世界速度相减后投影得到;两侧同支撑且相对停止时才为零。新初速不满足Q的预算或接触条件时,交接保持未完成,由控制器处理实际过渡;采用成功后下一次求解才使用Q的预算。

边界脚点同时属于两片,由交接记录决定归属。交接失败时,只有原接触与停止参考仍有效,才保持AtBoundary等待新路线或报告失败;实际速度或支撑已经改变则按下一节的中断规则退出,不能继续保存“已停止”标签。没有跨面目标的避障只在P内求解,不自行创建交接。

接入中断与恢复

例如脚点X=-0.09米,目标边X=0,a=1米/秒²,vCap=1米/秒。接入峰值0.3米/秒,加速0.3秒、制动0.3秒。执行0.2秒时,位移0.02米,实际X=-0.07,速度0.2米/秒。此时障碍版本变化,控制器撤销剩余接入曲线并进入Stopping,沿原切向制动;立即制动需要0.2秒、前进0.02米,停在X=-0.05。若中断已被记录而下一物理步才开始制动,反应步保持0.2米/秒,dt=0.1秒还要计入0.02米反应位移,停在X=-0.03。两者均未跨入Q。

沿立即制动的分支,障碍清除后实际停点为X=-0.05,新的接入长度为0.05米。尝试2从零速加速0.2236秒到sqrt(0.05)≈0.2236米/秒,走0.025米,再制动相同时间与距离,实际到X=0且速度归零。P、Q和支撑版本仍匹配才采用Q;Q的k=2使下一轮水平速度与加速度上限按其坡度重新换算。等待障碍期间已经到期,则不建立尝试2,沿失败释放路径结束原动作。

这只是地块边界的停车证明,障碍可能已占据停车路径。每步仍做身体扫掠;碰撞截断或外力改变速度后,保存实际位置、支撑和速度,以反馈重算,不能沿旧曲线补走未完成位移。到共同边距离不足以容纳当前制动时,标记无停车保证并进入碰撞或重新接入处理,不将Stopping记成安全。

接入记录保存原动作ID、接入尝试号、P与Q及共同边版本、起终点、曲线各段时长、已执行时间和最后实际反馈。中断先令原尝试失效,继续持有原移动器,停止后再决定续行:目标或支撑失效则取消;目标仍有效且新扫掠可通过,才从实际停点登记新的接入尝试。新扫掠暂时失败时保持停止,每个逻辑Tick及相关障碍版本变化时重验,仍受原截止时间约束。每次交接最多接纳3次接入曲线,总截止时间为首次Approaching起30个逻辑Tick,暂停、重试与恢复均不重置。当前尝试用尽或到期,先制动并释放移动器,再返回Failure;无法确认停止则保持取消中并报告故障。

进程中断后先恢复原动作与实际世界状态,普通跟随保持关闭。即使保存的曲线尚有剩余,恢复也使其失效,先从实际速度完成制动,再按原截止时间和剩余尝试数重建;恢复决定及新尝试身份先写入动作记录,随后才派发。控制器接纳每段位移时核对运行纪元、动作ID和当前接入尝试号,旧曲线的迟到位移直接拒绝。上例若在X=-0.07退出,恢复后不能把脚点设为X=-0.05;它须消费恢复后的真实姿态与速度,实际执行或对账那段制动。再次恢复读取上次决定,不重复接纳同一尝试。

外力搬运、超速或支撑变化可能让身体在停好以前跨面。这时旧地块的保证已经失效,控制器记录实际接触、支撑与速度,停止旧跟随并按物理反馈进入取消或重新接入;它不能按移动支撑与速度反馈的旧映射J贴回原高度,也不能把一次速度截断记成安全制动。恢复时共同还原交接阶段和两侧版本,确认原动作与实际姿态后再续行,禁止仅凭保存的Q目标跳过AtBoundary。

验证方法

固定墙、同速平台边和连续加速曲线分别核对全步边距。用P/Q数例检查停止包络、零速接入与中断制动;运动版本改变时废弃候选,恢复从实际反馈续行。满足端点但中途越界的曲线应被极值或分段界拒绝。

实现与证据

连续边界、制动包络和P/Q跨坡面数例来自正文推导。尚未运行完整边界求解与身体碰撞,候选安全依赖所列运动假设及实际扫掠。

相关主题

参考资料

本文的几何、运动与宿主协议按所列公式和数例定义;整体来源与关联机制见游戏AI导航。