2022-02-02【Math】移动插件代码梳理
2022-03-08 本文已影响0人
持刀的要迟到了
小结:
第一阶段
1.处理交叠信息,初步移动碰撞盒位置
2.进行地面探测,二次移动碰撞盒位置、
3.如果是初次落地,调整速度方向为沿着地面所在坡朝向
4.处理刚体(移动平台伴随移动,人物推动等)中间阶段
刚体移动第二阶段
1.根据角色状态调整速度
2.处理刚体
- 移动检测
3.1 根据【第一阶段】的交叠信息,和当前速度方向,对速度进行【速度投影处理】
(如果撞墙,沿着墙;如果撞坡,上坡;如果是折痕,停下;如果折痕飞行,沿着折痕。)
3.2 预处理后的速度,开始进行物理检测;首先进行交叠检测,交叠检测不到,通过速度进行sweep扫描检测
检测到后,根据位置,碰撞信息,
Phase1
1. 初始化
记录初始位置旋转量
2. 第一次Overlap检测
2.1 交叠【碰撞盒】,计算挤入量,挤出->调整初始位置
记录这些初始时挤压到的碰撞信息
3. 处理地面信息
3.1 上升不检测,把角色往高处抬一点点
3.2 选择一个合适距离检测地面
3.2.0 上一次不在地面也没找到地面
MinimumGroundProbingDistance:0.005
3.2.1上一次找到了地面:迈台阶
最小能迈过胶囊体半径,最大迈过配置高度
3.2.2 上一次找到了地面:非迈台阶
迈过胶囊体半径
3.3 ProbeGround
沿着胶囊体的y轴反向检测(重力方向)
能否站立在地面:根据坡度判定3.3.0 地面检测;当前位置 :x 检测距离:x
3.3.1 检测到碰撞;距离:x 能否站立在检测到地面:? 地面发现方向:x
3.3.2 能站立在该地面;最终坐标:x
3.3.3 不能站立在该地面;修改检测方向,检测方向沿着坡面投影(下坡),进行新一次检测
3.4 初次检测到地面,修正速度:沿着地面(坡面)向上
Phase2
11. 阶段2初始化,根据状态重写角色目标速度方向
12. 处理刚体
13.根据速度执行移动 InternalCharacterMove
13.1 根据Phase1的挤压情况,以及当前速度方向,做初步的速度预处理【Phase1->Overlap->InternalHandleVelocityProjection】
处理每一个挤压和速度,没有新的物理检测,得到新的速度方向。
13.1.1 判断挤压方向和移动方向是否相反
13.1.2 挤压方向相反,【速度投影处理】
如果撞墙,沿着墙;如果撞坡,上坡;如果是折痕,停下;如果折痕飞行,沿着折痕。
13.2 初步预处理后的速度,开始进行物理检测,目标:找到一个最近的碰撞物体进行处理(while)
13.2.1 Overlap物理检测: Overlap成功,从Overlap列表里找
13.2.2 Overlap失败,但是速度Sweep成功,从Sweep列表里找
13.2.3 >找到了最近碰撞,根据碰撞反向挤出,修改目标位置
13.2.3.1
判断跨越台阶跨越该碰撞13.2.3.2 再走就是反向挤压,但是迈不过去;【速度投影处理】
如果撞墙,沿着墙;如果撞坡,上坡;如果是折痕,停下;如果折痕飞行,沿着折痕。
13.2.4 >本次移动无碰撞
13.2.5 检测到达最大次数,安全退出,速度清零
13.2.6 调整速度和最近一个碰撞后,最终位置
辅助方法
1.HandleVelocityProjection:在发生碰撞时,处理速度投影
paramaters:(ref 原始速度,阻碍面法线,是否可站立在阻碍面)
2.GetDirectionTangentToSurfacve:两次cross,获得一个向量。
params:(原始方向,面法线方向/面向上方向)
如果传入面法线方向,会得到面向上方向。
如果传入面向上方向,会得到面法线方向的相反方向。