← ALL ARTICLES
游戏AI6 MIN READ

移动支撑与速度反馈

全库目录221
本文目录7

路径速度表在水平面表示运动,身体却沿坡面和移动支撑前进。本文定义水平速度、相对支撑速度、世界速度及步末反馈的换算。输入来自路径跟随,结果供局部避障、导航边界与坡面交接与Character Controller消费。

坡面速度与控制器消费

路径跟随的漏斗、圆弧和距离d都在水平平面计算,速度表也保存水平速度。坡面上的实际路程更长,因此角色配置中的地表速度与加速度上限还需要换算。设一个平面地块的高度为h(x,z)=g_x*x+g_z*z+c,水平速度为二维向量v,两个水平单位基为e_x、e_z,竖直单位基为u。地表速度为J*v=e_x*v_x+e_z*v_z+u*(g·v),其平方长度为vᵀ*(I+g*gᵀ)*v。沿坡角θ向上走时,实际速度就是水平速度除以cosθ。

本页用保守的水平圆约束接入局部避障的求解器。令k=sqrt(1+|g|²),地表最大速度为V,速度变化预算为A,则该地块水平上限取V/k和A/k。因为任意水平向量a都有|J*a|<=k*|a|,局部避障的速度圆、加速度圆及路线的纵横加速度预算仍可使用,只须先换算参数。这里A描述角色主动运动的速度变化预算;重力、支撑反力、摩擦和接触由物理控制器求解,导航圆不证明这些力学条件成立。沿等高线移动也使用同一保守界,代价是部分方向的允许速度偏低。

在体型配置允许60°坡面的教学例中,坡角60°使k=2,地表速度上限2米/秒、制动预算2米/秒²,水平上限分别为1米/秒和1米/秒²。从水平速度1开始,连续制动距离为水平0.5米,对应沿坡1米;反应步长仍加在水平距离公式中。若直接把2米/秒当作水平速度,实际沿坡已达4米/秒。坡度只参与烘焙过滤,无法自动修正这份速度表。

本文选择分片平面地表模型,详细网格先按相同高度梯度合成平面地块。路径与详细三角形边求交,沿弧长排序,在梯度改变的边界插入停止点;台阶和网格外连接也进入同一停止点表。跟随器按停转规则在边界前制动,圆弧只在同一平面地块内构造。计划停止点负责沿路线提前减速,实际位移还受导航边界与坡面交接的连续边界检查限制,局部避障也使用同一地块。需要保持连续越过曲面的实现必须另给曲率与法向加速度预算;本文经停止与边界交接后,按新地块预算继续移动。

每步请求保存相对支撑的水平目标速度v、当前地块与梯度、支撑身份及运动版本、物理步起止时间。J*v是用世界轴表示的相对支撑切向速度。支撑接触点的世界速度为uSupport,身体世界速度为uSupport+J*v;控制器负责合成这两项,跟随器只提交相对项。传送带水平向右1米/秒、角色相对向左1米/秒时,身体世界速度为零。平台搬运与主动运动在同一条轨迹中积分,扫掠以后保存实际结果。

v是本步希望达到的速度,不授权瞬时改写当前速度。控制器从有效反馈出发,以加速度预算构造连续曲线,再检查整段速度、边界和身体接触。下一步制动消费曲线结束后的实际速度,因此反馈同时保存实际位移与步末速度。

支撑旋转与速度变化

支撑刚体变换记为x=o(t)+R(t)*y,o为世界原点位置,R为正交旋转,y为身体在支撑中的局部位置。对时间求导得到xDot=oDot+omega×(x-o)+R*yDot。前两项就是接触点搬运速度uSupport,最后一项w=R*yDot才是角色相对支撑的切向速度。平台内的梯度在当前时刻变到世界空间,水平投影v与w满足w=J*v。刚体运动保留已有资产尺度;支撑发生缩放或形变时重新生成几何及接触数据,原刚体轨迹失效。

主动加速度预算约束支撑坐标中的yDDot。支撑旋转时,同一份局部速度在下一时刻要先搬到新朝向:wCarry=R1*transpose(R0)*w0。再比较新相对速度w1与wCarry,而不是直接比较两个世界轴分量。相同地块中,|w1-wCarry|<=A*dt是端点可达条件;取新梯度的保守系数k1后,可用以projectHorizontal(wCarry)为圆心、半径A*dt/k1的水平圆产生候选,候选全过程还要按下面的局部曲线验证。

例如平台绕世界Up在0.1秒内旋转90°,角色保持局部速度(1,0,0),没有主动加速。其世界表示从(1,0,0)转到(0,0,-1),二者直接相减的长度为√2。搬运旧速度后wCarry已经等于新速度,主动速度变化为零;身体所需向心加速度则仍由接触与物理预算承担。

控制器令局部速度从b0=transpose(R0)*w0线性变化到b1=transpose(R1)*w1,按y(t)=y0+b0*t+(b1-b0)*t²/(2*dt)积分,再用同一时轴的o(t)、R(t)生成世界曲线。局部速度线段检查速度上限,|(b1-b0)/dt|检查主动加速度;每个时刻的支撑、地块与坡度也必须有效。只通过端点圆而曲线中途超速或失去接触的候选不能执行。

对世界曲线再次求导,身体加速度为oDDot+alpha×(R*y)+omega×(omega×(R*y))+2*omega×w+R*yDDot。平台平移加速、角加速、向心和科里奥利项都进入控制器的接触求解,主动预算只约束最后一项。物理控制器无法维持接触时返回实际脱离、滑移与速度,跟随器进入重新接入。几何曲线位于平台内,并不能证明角色一定能站在平台上。

位移与步末速度

控制器返回步长dt、实际脚点、世界位移Δx、支撑面与接触结果,以及步末世界速度vWorldEnd、支撑接触点的步末速度vSupportEnd和速度有效标记。支撑速度包含平台平移与旋转在该接触点产生的速度。角色相对支撑的步末速度为vRelativeEnd=vWorldEnd-vSupportEnd;投影到水平基得到下一步加速度可达圆的圆心vEnd,水平制动距离也消费vEnd。停止先核对支撑有效性与法向接触速度,再按请求保存的停止参考系判断:平台内停步取vRelativeEnd,固定世界目标取vWorldEnd,移动目标取vWorldEnd减目标参考点速度。完整三维差值进入阈值才算停止,竖直滑落不能因水平分量为零而算作停稳。外力推挤留在vRelativeEnd中,超出主动预算时按实际超速处理,不能作为平台运动扣除。

位移反馈另保存本步平台搬运ΔxSupport和非运动纠偏ΔxCorrection。vAverage=projectHorizontal(Δx-ΔxSupport-ΔxCorrection)/dt只描述本步净进度,供路线投影与阻塞诊断。恒速、无碰撞的一步中它等于vEnd;连续加速、制动或接触发生在步内时则未必相等。世界地表速度上限用相对支撑的实际步末速度及轨迹内峰值核对,三维位移长度只用于路程和进度统计。

例如接入从零速以1米/秒²加速,0.1到0.2秒的位移为(0.2²-0.1²)/2=0.015米。vAverage为0.15米/秒,vEnd为0.2米/秒;立即制动需要0.2²/2=0.02米,不能按0.15算成0.01125米。最后一个减速步也一样:速度从0.1降到0,位移0.005米,平均速度0.05而步末已停止。导航边界与坡面交接的边界停稳状态AtBoundary检查步末速度,不会把这份历史进度当作继续滑行。

步末速度由控制器的运动状态产生。连续曲线在分段积分后保存当前导数;碰撞、滑移或外力求解后保存求解后的速度。恒速扫掠控制器也须按其接触响应更新步末速度,例如撞上静止墙后清除仍朝墙内的分量,不能把命令速度原样返回。步内脱离平台时记录支撑切换与继承后的世界速度,按落地或重新接入处理,不再减去旧平台速度。

只提供位移、尚不能确定步末速度的接口返回速度Unknown。跟随器暂停新的普通求解,原移动实例保持所有权,控制器依据自身状态继续安全制动或报告无法确认;取得有效速度及支撑以前不报告停止或允许新动作接管。快照共同保存世界步末速度、支撑身份及版本、支撑速度和有效标记;恢复时先按该前沿还原,再重新核对当前支撑。旧平台已失效就进入重新接入,不能拿旧搬运速度修饰新状态。

验证方法

在60°平面重算水平速度与地表速度,在旋转90°平台上先搬运旧相对速度再算主动变化。对0.1至0.2秒的加速步分别计算0.015米位移、0.15米/秒平均速度和0.2米/秒步末速度,制动使用最后一项。

实现与证据

坡面映射与刚体运动按导数关系推导,平均速度和步末速度数例可手工复算。尚未运行旋转平台、接触或完整控制器。

相关主题

参考资料

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