抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

移动

移动的时候只需要以对象坐标为基础,加上移动的方向和速度,即可得到下一个坐标。

碰撞

在一帧移动完成后,检测最新位置是否有和其他物体碰撞,如果有的话:

  1. 计算碰撞法线,碰撞法线是其他物体被碰撞的面的法线。
  2. 计算碰撞深度。
  3. 当前位置 += 碰撞法线 * 碰撞深度。

这样就可以得到碰撞后应该在的位置。我称之为排斥。

多个碰撞体的情况

设置一个向量 offset 用来记录排斥的值,每个碰撞物体的排斥值都要加到 offset 中。最后我们会得到一个总的排斥值,加到当前位置中即可。

当两个碰撞物体排成一排时,会出现无法越过交界处的情况。

因此我选择每次排斥都更新一下自体碰撞盒。这样就能保证碰撞法线的方向相同。不过每次刷新包围盒的时候都会重新计算包围盒信息,增加了计算量。

不过这样会存在一个问题,就是如果碰撞的顺序不同的话,得到的结果也不同,因此我选择保存接触到的碰撞对象,每次碰撞检测的时候检测上次的碰撞物体是否存在于列表中,存在则不动,不存在则新增到列表后面,没碰撞的物体移除列表。这样就能保证每次碰撞的顺序是按照接触到的物体顺序,而不是遍历的顺序。

下落

我选择的是根据下落的公式 $v_g=-gt$ 得到下落速度,乘以每帧时间 $v_{g_{dt}}=v_g*dt$ 得到每帧的下落速度,再加到当前坐标的 y 值上即可。

跳跃

跳跃是在下落的基础上,增加一个初始速度,通过公式 $v=v_0-v_g$ 得到下落速度,然后跟上面下落一样处理得到新的 y 值。

爬坡

在爬坡的时候,我根据坡面的法线方向和自体的上方向,得到一个旋转的四元数,然后用该四元数乘以前进方向,使前进方向旋转到坡面,这样在坡面的移动就相当于把原来的坐标系转移到坡面的坐标系中,再在坡面坐标系实现位移。

用一个平面图来表示的话就像下图所示:

推广到三维空间也是一样。

判断是否在平台上

跳跃和坡面都需要判断是否在平台上,在平台上的话就停止下落并重置状态。

判断是否在顶部,就判断自体最低点是否大于等于碰撞物体最高点;判断是会否在坡面,就判断移动方向和自体下方向的投影的绝对值是否大于 0 并小于自定义的坡度(0-1 之间)。

跨台阶

跨台阶就是在做排斥的时候,判断自体最低点是否小于碰撞物体最高点,并且自体最低点加上自定义跨越高度是否大于碰撞物体最高点,都满足的情况下令排斥值的 y 值等于碰撞物体最高点减去自体最低点,即:

1
2
3
4
if (self.minY < other.maxY && self.minY + self.stepHeight >= other.maxY)
{
offset.y = other.maxY - self.minY;
}

否则就按照正常的排斥计算。

攀爬

攀爬判定

发生碰撞并且移动方向和碰撞法线的投影小于一定值(自定义)超过一定时间的时候判定为开始攀爬。

头顶有障碍物的时候取消攀爬。(攀爬面法线 y 值小于一定值为头顶有障碍物)

攀爬计算

攀爬和爬坡一样需要把坐标系转移到攀爬平面上。

  1. 令原始输入方向(即输入值 ADWS)面向攀爬平面法线的反方向,得到面向输入方向。
  2. 计算自体上方向和攀爬平面法线的旋转四元数。
  3. 旋转四元数乘以面向输入方向得到最终攀爬方向。(和爬坡一样的操作)

攀爬与爬坡不同的是,爬坡用的是自体的移动方向做原始输入,攀爬用的是键盘输入的移动方向做原始输入。

攀爬的时候需要单独计算排斥,使其刚好处于碰撞物体表面。并且,碰撞物体的最近中心坐标在不碰撞的时候不清除,这样就可以拐弯。

自动攀爬到顶

判断自体最高点是否大于碰撞物体最高点一定值,是则开始自动攀爬并禁用攀爬移动。

攀爬跳跃

默认情况下向上跳跃,有按方向的情况下按照所按方向跳跃。

和攀爬到顶一样,攀爬跳跃也禁用攀爬,然后自动进行数帧的位移。完成后重启攀爬。

推物体

设置物体的推力和被推时需要的力,然后根据比例,在碰撞检测排斥的时候进行比较。

设推力比例为 powerRatio

计算 $powerRatio=另一物体被推力/本物体推力$ ,然后将得到的数字乘到排斥力上,即 $offset*=powerRatio$ ,即可得到新的排斥力大小。

在计算排斥力大小之前,需要先计算另一物体需要移动的距离。

设另一物体的排斥力为 reverseOffset

根据以下公式: $reverseOffset=offset*(1-powerRatio)$ 把所有 reverseOffset 都加到另一物体的 offset,我们就能得到另一物体移动的距离。

更新日志

2024-03-01

1.更新推物体思路

2024-01-22

  1. 更新基础内容
  • 移动
  • 碰撞
  • 下落
  • 跳跃
  • 爬坡
  • 判定平台
  • 跨台阶
  • 攀爬

评论